将按钮列添加到 DataGridView 并将条件文本仅应用于单击的按钮

Posted

技术标签:

【中文标题】将按钮列添加到 DataGridView 并将条件文本仅应用于单击的按钮【英文标题】:Add a Button Column to a DataGridView and apply conditional text only to the button clicked 【发布时间】:2021-06-11 20:34:57 【问题描述】:

在 DataGridView 中,我们可以处理行级别的按钮文本更改吗?只有单击的按钮必须将文本更改为“Clicked”,其余行上的其他按钮保持默认文本。

我添加了一个按钮实例并将其添加到网格中,如下所示:

var button = new DataGridViewButtonColumn();

    button.Name = "statusButton";
    button.HeaderText = "Button";
    button.Text = "Click to register";
    button.UseColumnTextForButtonValue = true;  
    this.dataGridView1.Columns.Add(button);

但是当我在 private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e) 事件中处理名称更改时,所有按钮都将文本更改为“已单击”。

我是否需要为n 的行数创建n 数量的按钮?

【问题讨论】:

可以分享dataGridView1_CellContentClick事件的代码吗? 见DataGridViewButtonColumn.UseColumnTextForButtonValue的备注部分。使用.UseColumnTextForButtonValue = true,您指定 Button.Text 对于列中的所有按钮都是相同的。 @jimi,我的按钮文本按预期显示值,我也可以更改其他列的值。只是按钮值无法每行更改。如果更改它会更改网格的所有行。我怀疑也许我只有一个按钮对象并且我操纵它。我需要为网格中的每一行添加新按钮吗? - 这是我的担心 【参考方案1】:

如文档中所述,UseColumnTextForButtonValue 用于指定 DataGridViewButtonColumn 的所有按钮将使用相同的文本,如列模板的 Text 属性中指定的那样。

如果您需要为每个按钮指定不同的文本并在运行时更改它,您需要将此属性设置为false(或者不要设置它,因为false 是默认值)。 在这种情况下,单元格的FormattedValue 用于文本。

由于您是在运行时添加 Column,因此 DataSource 中可能没有相应的值(Column 未绑定到数据源)。 在这种情况下,Cell.Value 将是null,因此FormattedValue 属性将返回一个空字符串,并且您的按钮将显示一个空文本。

要设置默认值,您可以将列的DefaultCellStyle.NullValue 设置为预定义的字符串,然后将其用作按钮的文本。

var buttonColumn = new DataGridViewButtonColumn() 
    Name = "statusButton",
    HeaderText = "Button",
    UseColumnTextForButtonValue = false,
    DefaultCellStyle = new DataGridViewCellStyle() 
        NullValue = "Click Me"
    
;
this.dataGridView1.Columns.Add(buttonColumn);

然后您可以更改单个按钮单元格的文本,设置一个新值,并最终将该值与[Cell].OwningColumn.DefaultCellStyle.NullValue 进行比较,例如,重新设置它:

private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)

    if (dataGridView1[e.ColumnIndex, e.RowIndex] is DataGridViewButtonCell cell) 
        if (cell.Value == null || cell.Value == cell.OwningColumn.DefaultCellStyle.NullValue) 
            cell.Value = "Clicked";
        
        else 
            cell.Value = cell.OwningColumn.DefaultCellStyle.NullValue;
        
    

做同一件事有不同的方法,这是一个简单直接的方法,它应该可以让你解决当前的问题。

【讨论】:

感谢您@jimi 的努力。出于好奇,我试图设置“启用”和“禁用”按钮,但在 DataGridViewButtonColumn 中找不到该选项。 How to: Disable Buttons in a Button Column in the Windows Forms DataGridView Control

以上是关于将按钮列添加到 DataGridView 并将条件文本仅应用于单击的按钮的主要内容,如果未能解决你的问题,请参考以下文章

将行号列添加到绑定到 DataTable 的 DataGridView

c#winfrom应用程序中怎么向DataGridView控件添加带图片的按钮列

将按钮列添加到 datagrid 视图导致问题

winform dataGridView中如何添加单选按钮列?

保存 DataGridView

动态地将组合框单元添加到 datagridview