C# 无法将包含按钮的列添加到动态DataGrid

C# 无法将包含按钮的列添加到动态DataGrid,c#,wpf,xaml,datagrid,C#,Wpf,Xaml,Datagrid,我正在开发一个基于返回数据集中的表创建动态数据网格的应用程序。 所有的表可能有不同的列,所以我根据行数创建动态datagrid,并设置AutoGenerateColumns=true; 这是我的C代码: for (int count = 0; count < ds.Tables.Count; count++) { DataGrid dg = new DataGrid(); dg.Name = ds.T

我正在开发一个基于返回数据集中的表创建动态数据网格的应用程序。 所有的表可能有不同的列,所以我根据行数创建动态datagrid,并设置AutoGenerateColumns=true; 这是我的C代码:

 for (int count = 0; count < ds.Tables.Count; count++)
            {
                DataGrid dg = new DataGrid();
                dg.Name = ds.Tables[count].TableName.ToString();
                dg.Margin = new Thickness(5);
                dg.Width = 800;
                dg.MaxHeight = 200;
                dg.AutoGenerateColumns = true;
                dg.VerticalScrollBarVisibility = ScrollBarVisibility.Auto;
                dg.HorizontalScrollBarVisibility = ScrollBarVisibility.Auto;
                dg.ItemsSource = ds.Tables[count].DefaultView;
                stkCollection.Children.Add(dg);
            }
我想为每一行中都有一个按钮的动态datagrid添加一个额外的列

这是我的XAML:

<GroupBox Header="Log Details">

    <Border  >
        <Grid Background="{StaticResource NormalBackground}">
            <Grid.ColumnDefinitions >
                <ColumnDefinition Width="150" />
                <ColumnDefinition Width="10"/>
                <ColumnDefinition Width="150"/>
                <ColumnDefinition Width="10"/>
                <ColumnDefinition Width="150"/>
                <ColumnDefinition Width="10"/>
                <ColumnDefinition Width="150"/>
                <ColumnDefinition Width="*"/>
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition Height="10"/>
                <RowDefinition Height="60"/>
                <RowDefinition Height="10"/>
                <RowDefinition Height="*" MaxHeight="600"/>
            </Grid.RowDefinitions>
            <Button Name="btnMessage" Content="Message" Grid.Row="1" Grid.Column="2" Width="120" Height="50" HorizontalAlignment="right" Click="btnMessage_Click"></Button>
            <Button Name="btnDraw" Content="Draw" Grid.Row="1" Grid.Column="4" Width="120" Height="50" HorizontalAlignment="right" Click="btnDraw_Click"></Button>
            <StackPanel x:Name="stkCollection"  Grid.Row="3"  Grid.Column="0" Grid.ColumnSpan="8" Orientation="Vertical"/>


        </Grid>

    </Border>

</GroupBox>
谁都不知道。 我是怎么做到的? 提前感谢

您可以在Xaml中将DataGridTemplateColumn定义为资源,如下所示:

<Window.Resources>
    <DataGridTemplateColumn x:Key="DGTemplateColumn">
        <DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
                <Button Content="Info" Click="DGCell_Button_Click"/>
            </DataTemplate>
        </DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn>
</Window.Resources>
并处理按钮的单击事件此处,我使用按钮的DataContext显示员工的姓名,DataContext是该行中显示的基础对象:

private void DGCell_Button_Click(object sender, RoutedEventArgs e)
{
    Employee emp = (sender as Button).DataContext as Employee;
    MessageBox.Show(emp.Name);
}
谢谢你的快速回复。。 我找到了解决办法。。。 这是我的密码

for (int count = 0; count < ds.Tables.Count; count++)
            {
                DataGrid dg = new DataGrid();
                dg.Name = ds.Tables[count].TableName.ToString();
                dg.Margin = new Thickness(5);
                dg.Width = 800;
                dg.MaxHeight = 200;
                DataGridTemplateColumn dgc = new DataGridTemplateColumn();
                DataTemplate dtm = new DataTemplate();

                FrameworkElementFactory btnReset = new FrameworkElementFactory(typeof(Button));
                btnReset.SetValue(Button.ContentProperty, "Restore");
                btnReset.SetValue(Button.ToolTipProperty, "Restore Selected Row");
                btnReset.SetValue(Button.DataContextProperty, new Binding("TableName"));

                btnReset.AddHandler(Button.ClickEvent, new RoutedEventHandler(btn_Click));

                //set the visual tree of the data template  
                dtm.VisualTree = btnReset; 
                dgc.CellTemplate = dtm;
                dg.Columns.Add(dgc);
                dg.AutoGenerateColumns = true;
                dg.VerticalScrollBarVisibility = ScrollBarVisibility.Auto;
                dg.HorizontalScrollBarVisibility = ScrollBarVisibility.Auto;
                dg.ItemsSource = ds.Tables[count].DefaultView;
                stkCollection.Children.Add(dg);
            }

谢谢。

@user649985:这不是答案。您可以通过编辑或评论自己的问题或其他人的答案来更新原始问题。
for (int count = 0; count < ds.Tables.Count; count++)
            {
                DataGrid dg = new DataGrid();
                dg.Name = ds.Tables[count].TableName.ToString();
                dg.Margin = new Thickness(5);
                dg.Width = 800;
                dg.MaxHeight = 200;
                DataGridTemplateColumn dgc = new DataGridTemplateColumn();
                DataTemplate dtm = new DataTemplate();

                FrameworkElementFactory btnReset = new FrameworkElementFactory(typeof(Button));
                btnReset.SetValue(Button.ContentProperty, "Restore");
                btnReset.SetValue(Button.ToolTipProperty, "Restore Selected Row");
                btnReset.SetValue(Button.DataContextProperty, new Binding("TableName"));

                btnReset.AddHandler(Button.ClickEvent, new RoutedEventHandler(btn_Click));

                //set the visual tree of the data template  
                dtm.VisualTree = btnReset; 
                dgc.CellTemplate = dtm;
                dg.Columns.Add(dgc);
                dg.AutoGenerateColumns = true;
                dg.VerticalScrollBarVisibility = ScrollBarVisibility.Auto;
                dg.HorizontalScrollBarVisibility = ScrollBarVisibility.Auto;
                dg.ItemsSource = ds.Tables[count].DefaultView;
                stkCollection.Children.Add(dg);
            }