【问题标题】:Add DataGrid.Columns from code behind in WPF从 WPF 中的代码后面添加 DataGrid.Columns
【发布时间】:2015-08-03 11:56:13
【问题描述】:

我有一个 DataGrid 与后面的代码绑定数据,我还有 2 列用于编辑和删除,像这样

<DataGrid Height="226" HorizontalAlignment="Left" Margin="106,111,0,0" Name="DgEmp" VerticalAlignment="Top" Width="684" ColumnWidth="*" CanUserAddRows="False">
    <DataGrid.Columns>
        <DataGridTemplateColumn Header="Actions">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <Button Content="Delete" Name="BtnDelete" Click="btnDelete_Click"/>
                        <Button Content="Edit" x:Name="BtnEdit" Click="btnEdit_Click"/>
                    </StackPanel>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

它在第一两列添加按钮。 如何从后面的代码中添加它

我还有另一个困惑,我使用下面的方法绑定了我的DataGrid

private void GridBind()
{
    try
    {
        using (var con = new SqlConnection(_conString))
        {
            const string sqlqry = "select ROW_NUMBER() OVER (ORDER BY EmpNo) AS [SlNo],EmpNo,EmpName,Salary,DeptNo from dbo.Employee";
            var cmd = new SqlCommand(sqlqry, con);
            _adapt = new SqlDataAdapter(cmd);
            var dt = new DataTable("Employee");
            _adapt.Fill(dt);
            DgEmp.ItemsSource = dt.DefaultView;
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show("Some error encountered" + ex.Message);
    }
}

此绑定方法不适用于以下 XAML

<DataGrid Height="226" HorizontalAlignment="Left" Margin="106,111,0,0" Name="DgEmp" VerticalAlignment="Top" Width="684" ColumnWidth="*" CanUserAddRows="False">
    <DataGrid.Columns>
        <DataGridTextColumn Header="SL No" Width="*"/> 
        <DataGridTextColumn Header="Emp No" Width="*"/>
        <DataGridTextColumn Header="Emp Name" Width="*" />
        <DataGridTextColumn Header="Salary" Width="*" />
        <DataGridTextColumn Header="Dept No" Width="*" />
        <DataGridTemplateColumn Header="Actions">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <Button Content="Delete" Name="BtnDelete" Click="btnDelete_Click"/>
                        <Button Content="Edit" x:Name="BtnEdit" Click="btnEdit_Click"/>
                    </StackPanel>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

当我尝试删除其clickevent 上的记录时,就像 WinForm 一样,它不起作用

 private void btnDelete_Click(object sender, RoutedEventArgs e)
 {
    var id= Convert.ToInt32(DgEmp.Rows[e.RowIndex].Cells[2].Value.ToString()); 
    if(id!=0)
    {
         // Delete query on basis of id
         GridBind();
         ClearData();
     }
}

很抱歉一次问了太多问题,因为这些是我从WinForm 转移到WPF 时面临的问题。

编辑:我试过这个: 我添加的是

private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            GridBind();
            string colProperty = "Name";
            DataGridTextColumn col = new DataGridTextColumn();
            col.Binding = new Binding(colProperty);
            var spHeader = new StackPanel() { Orientation = Orientation.Horizontal };
            spHeader.Children.Add(new TextBlock(new Run(colProperty)));
            Button button1 = new Button();
            button1.Click += btnEdit_Click;
            button1.Content = "Edit";
            spHeader.Children.Add(button1);
            col.Header = spHeader;
            DgEmp.Columns.Add(col);
        }

看起来像

【问题讨论】:

  • 你需要 2 个按钮,所以最好先尝试添加 2 个按钮,然后再添加到 datagrid。
  • @DeshDeepSingh:我已经完成了,你可以在我的共享 XAML 第 2 行找到这个,但 Buttons 应该在数据的末尾。

标签: c# wpf xaml datagrid


【解决方案1】:

试试这个作为你的第一个问题我怎样才能从后面的代码中添加这个。

var col = new DataGridTemplateColumn {Header = "Actions"};

var dt = new DataTemplate();

var stkpnl = new FrameworkElementFactory(typeof(StackPanel));
stkpnl.SetValue(StackPanel.OrientationProperty, Orientation.Horizontal);
var btn1 = new FrameworkElementFactory(typeof(Button));

btn1.SetValue(ContentProperty, "Delete");
btn1.AddHandler(ButtonBase.ClickEvent, new RoutedEventHandler(btnDelete_Click));
btn1.SetValue(MarginProperty, new Thickness(0, 0, 10, 0));
stkpnl.AppendChild(btn1);

var btn2 = new FrameworkElementFactory(typeof(Button));
btn2.SetValue(ContentProperty, "Edit");
btn2.AddHandler(ButtonBase.ClickEvent, new RoutedEventHandler(btnEdit_Click));
stkpnl.AppendChild(btn2);

dt.VisualTree = stkpnl;
col.CellTemplate = dt;
DgEmp.Columns.Add(col);

对于您的最后一个问题当我尝试删除其点击事件上的记录时,例如 WinForm 它不起作用

private void btnDelete_Click(object sender, RoutedEventArgs e)
{
    var drv = DgEmp.SelectedItem as DataRowView;
    if (drv == null) return;
    var empNo = drv[1].ToString(); //getting empno column
    try
    {
        using (var con = new SqlConnection(_conString)) //my connection
        {
            var sqlqry = "delete dbo.Employee where EmpNo='"+empNo+"'";
            con.Open();
            var cmd = new SqlCommand(sqlqry, con);
            cmd.ExecuteNonQuery();
            con.Close();
            GridBind(); //Binding grid after delete
            MessageBox.Show("Data deleted successfully");
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

【讨论】:

  • 谢谢。第一个工作正常,第二个删除行(不是从数据库中)。
  • @SS8:现在试试这个 我已经编辑了我的删除代码。如果对您有帮助,请不要忘记接受答案:)
  • 感谢它对我有用。现在我接受了你的回答。
【解决方案2】:

这里是示例 sn-p 从后面的代码中添加 datagrid

var col = new DataGridTextColumn();
            col.Header = "d";
            col.Binding = new Binding("RoomNumber");
            dataGrid1.Columns.Add(col);

使用这种方法,您可以根据需要添加任意数量的列,并且可以在运行时为每列提供数据绑定,并且可以一次指定 itemssource....

确保在您的数据网格中标记AutoGenerateColumns="False",这样您就可以避免从 itemssource 添加不需要的列..

按钮编辑

string colProperty = "Name";

DataGridTextColumn col = new DataGridTextColumn();
col.Binding = new Binding(colProperty);
var spHeader = new StackPanel() { Orientation = Orientation.Horizontal };
spHeader.Children.Add(new TextBlock(new Run(colProperty)));
Button button1 = new Button();
button1.Click += Button_Filter_Click;
button1.Content = "Edit";
spHeader.Children.Add(button1);

col.Header = spHeader;

dataGrid.Columns.Add(col);

【讨论】:

  • 是的,我已经尝试过这个并且效果很好。但就我而言,我为两个按钮(编辑和删除)占用了一列
  • 所以你想每次都添加按钮
  • 如果您希望每次都在列中添加按钮,然后在列中仅通过此代码将它们添加到此处。
  • 试试这个添加按钮,这会给你一个想法,我相信你现在可以实现。
  • DeshDeepSingh,你的回答很好 =) 我的评论是针对 @SS8 的建议
猜你喜欢
  • 2023-04-03
  • 1970-01-01
  • 2021-11-05
  • 1970-01-01
  • 2011-11-26
  • 2014-01-18
  • 1970-01-01
  • 1970-01-01
  • 2011-01-01
相关资源
最近更新 更多