WPF 在datagrid模板列中添加用户控件,在后台如何快速的检索到该控件。急!!!

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WPF 在datagrid模板列中添加用户控件,在后台如何快速的检索到该控件。急!!!相关的知识,希望对你有一定的参考价值。

参考技术A 给你两种方法:为方便起见我用button代替自定义控件,具体操作还是一样的。
前台代码如下:
<StackPanel>
<DataGrid AutoGenerateColumns="False" Height="200" Name="dataGrid1" Width="200" CanUserAddRows="False">
<DataGrid.Columns>
<DataGridTemplateColumn Header="Header">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<Button x:Name="mybutton" Tag="MyButton" Height="22" Width="50" Content="Binding Id"/>
<TextBlock Margin="10 0 0 0" Text="Binding Name"/>
</StackPanel>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
<Button HorizontalAlignment="Center" Margin="10" Click="Button_Click">Search</Button>
<TextBlock x:Name="txt_result"/>
</StackPanel>
我放了一个只有一列模板列的datagrid,一个按钮,一个文本
后台给datagrid绑上数据源
dataGrid1.ItemsSource = new List<People>

new People()Id = 1,Name = "aaa",
new People()Id = 2,Name = "bbb",
new People()Id = 3,Name = "ccc"
;
然后就是通过按钮事件来处理模板列中内容
1.使用VisualTreeHelper
2.使用FindName
private void Button_Click(object sender, RoutedEventArgs e)

DataGridTemplateColumn tempColumn = dataGrid1.Columns[0] as DataGridTemplateColumn;
DataTemplate dtemp = tempColumn.CellTemplate;

//Button btn = (Button)VisualTreeHelper.GetChild(dtemp.LoadContent(),0); //第一种方法
StackPanel sp = (StackPanel)dtemp.LoadContent(); Button btn = sp.FindName("mybutton") as Button; //第二种方法
txt_result.Text = btn.Tag.ToString();
参考技术B 请查看(如何从 Datagrid 中获得单元格的内容?): http://social.msdn.microsoft.com/Forums/zh-CN/wpfzhchs/thread/e1907834-611e-4e38-a47f-650a42087207

当我们单击 DataGrid 行时,在 wpf 功能区窗口中加载另一个用户控件

【中文标题】当我们单击 DataGrid 行时,在 wpf 功能区窗口中加载另一个用户控件【英文标题】:Loading another userControl in wpf Ribbon Window when the we click on DataGrid row 【发布时间】:2012-06-04 18:57:13 【问题描述】:

请耐心阅读这篇文章...简要地说,我想要的是“当我 单击 DataGrid 行,这些值必须显示在另一个 表单(此处为 userControl)..”

我正在使用一个 Wpf 功能区窗口。该窗口分为两行。在第一行中,我填充了 Wpf 功能区,在第二行中,我填充了一个 Dock 面板以根据操作填充用户控件..

功能区有两个按钮

    显示所有员工 添加员工

我创建了两个 Usercontrol Forms 一个是输入员工详细信息,第二个是显示 DataGrid 中的所有记录..

现在我首先单击 Ribbon Button1 以显示所有员工详细信息,然后将 userControl "CtlGridDisplay" 加载到 DockPanel(位于 Ribbon 窗口中)并在 DataGrid 中显示所有详细信息。

现在我双击行并获取选定的行employeeId 然后我希望在另一个用户控件“CtlAddEmployee”中显示该详细信息并且此用户控件必须仅显示在该 DockPanel 中.. 为此我试图清除 Dockpanel并为控件“CtlAddEmployee”创建了对象并将该控件添加到 DockPanel.. 但 DockPanel 仍然填充 仅 DataGRid 即填充“CtlGridDisplay”...我不明白为什么...

为此,我还使用了事件和委托,它可以很好地执行所有代码,但 Dockpanel 没有被清除,也没有加载新控件。..

但是当我单击一个功能区按钮 1 时,它会加载“CtlGridDisplay”,当我单击功能区按钮 2 时,它会在 Dock 面板中很好地加载“CtlAddEmployee”...

但是当我尝试显示数据时,我在一个用户控件中单击 DataGrid 以显示在另一个控件中不起作用..

Events Delegate 方法代码如下...

在用户控件“CtlDisplayEmployeeList”中的代码是

public event MyOrganizationDetails.MainRibbonWinodw.DisplayEmployeeHandler DisplayemployeeEvent;

private void GridList_MouseDoubleClick(object sender, MouseButtonEventArgs e)

    MainRibbonWinodw mainRibbonobj = new MainRibbonWinodw();
    this.DisplayemployeeEvent += new MainRibbonWinodw.DisplayEmployeeHandler(mainRibbonobj.fnDisplayEmployeeDetails);
    if (GridList.SelectionUnit == DataGridSelectionUnit.FullRow)
    
        if (GridList.SelectedItems.Count > 0)
        
            for (int i = 0; i < GridList.SelectedItems.Count; i++)
            
                DataGrid dg = sender as DataGrid;
                EmployeeDetail detail = dg.SelectedItem as EmployeeDetail;
                string selectedEmp = detail.EmpId; //it gives Employee Id

                if (DisplayemployeeEvent != null)
                    DisplayemployeeEvent(selectedEmp);
             
        
    

在功能区窗口中......代码将......在这里处理事件......

public partial class MainRibbonWinodw : RibbonWindow

    public delegate void DisplayEmployeeHandler(string str);

    public void fnDisplayEmployeeDetails(string str)
    
        CtlAddEmployee frm2 = new CtlAddEmployee(str);
        DockPanelInRibbon.Children.Clear();
        DockPanelInRibbon.Children.Add(frm2);    
    

在另一个用户控件中..

构造函数...

public CtlAddEmployee(string str)

    InitializeComponent();
    fnDisplayingEmployee(str);

当我调试所有代码时,所有代码都被很好地触发,但“CtlAddEmployee”表单没有加载到 DockPanel...Dock 面板仍然使用该 DataGRid...我不知道为什么请告诉我解决方案...。 .

感谢您的耐心等待...阅读本文...

【问题讨论】:

【参考方案1】:

您也必须为停靠面板调用事件。例如 leftMouseButtonUp 和停靠你的用户控件。

【讨论】:

以上是关于WPF 在datagrid模板列中添加用户控件,在后台如何快速的检索到该控件。急!!!的主要内容,如果未能解决你的问题,请参考以下文章

WPF DataGrid中一列中的动态单元格控件

WPF中ListView和DataGrid的区别?

wpf DataGrid自定义相关问题

WPF DataGrid DataGridTemplateColumn 控制模板中控件

wpf datagrid怎么得到第一项焦点?然后在方向键上下移动

wpf datagrid 多行表头