C# 如何向DataGridView中的某些(而不是全部)列添加按钮?

C# 如何向DataGridView中的某些(而不是全部)列添加按钮?,c#,winforms,datagridview,C#,Winforms,Datagridview,我正在尝试更新这个DataGridView对象,这样如果一个值==“bob”,在其名称旁边的列中将有一个按钮,否则我不希望出现任何按钮 DataGridViewTextBoxColumn valueColumn = new DataGridViewTextBoxColumn(); DataGridViewButtonColumn buttonColumn = new DataGridViewButtonColumn(); buttonColumn.ReadOnly = true; button

我正在尝试更新这个DataGridView对象,这样如果一个值==“bob”,在其名称旁边的列中将有一个按钮,否则我不希望出现任何按钮

DataGridViewTextBoxColumn valueColumn = new DataGridViewTextBoxColumn();
DataGridViewButtonColumn buttonColumn = new DataGridViewButtonColumn();

buttonColumn.ReadOnly = true;
buttonColumn.Visible = false;

this.dgv.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
valueColumn,
buttonColumn,
});

//elsewhere...

if(value == "bob")
{
    Button button = new Button()
    {
        Text = "null",
    };

    index = dgv.Rows.Add(value, button);
    DataGridViewButtonCell buttonCell = dgv.Rows[index].Cells[2] as DataGridViewButtonCell;
    buttonCell.Visible = true;
}
else
{
    dgv.Rows.Add(value);
}

但是,由于我无法在单元格上设置“可见”,所以这不起作用。有没有办法只在WAR Value==“bob”行中添加一个按钮?

这里有两种可能,一种是丑陋的,另一种是来自MSDN的

丑陋:在运行时向DGV添加一个按钮

执行以下操作:
-将未绑定的DataGridViewTextBoxColumn添加到DGV。注意它在DGV中的索引值;这是您要按下按钮的地方。
-使用DGV的CellFormatting事件,如下所示:

    private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) {
        if (e.ColumnIndex == 0) {  // Assumes column 0 has the data that determines if a button should be displayed.
            if (e.Value.ToString() == "bob") {  // Test if a button should be displayed on row.
                // Create a Button and add it to our DGV.
                Button cellButton = new Button();
                // Do something to identify which row's button was clicked.  Here I'm just storing the row index.
                cellButton.Tag = e.RowIndex;
                cellButton.Text = "Hello bob";
                cellButton.Click += new EventHandler(cellButton_Click);
                dataGridView1.Controls.Add(cellButton);
                // Your ugly button column is shown here as having an index value of 3.
                Rectangle cell = this.dataGridView1.GetCellDisplayRectangle(3, e.RowIndex, true);
                cellButton.Location = cell.Location;
            }
        }
    }
当用户单击按钮时,cellButton\u Click事件将触发。下面是一些测试代码:

    void cellButton_Click(object sender, EventArgs e) {
        Console.WriteLine("Hello from row: {0}", ((Button) sender).Tag);
    }
正如你所见,这不是很精致。我是根据我发现的更难看的样本做的。我相信你可以修改它以适应你的需要

来自MSDN:滚动您自己的(扩展)DataGridViewButton列,该列有条件地显示禁用的按钮

有关此选项,请参见


当然,这个选项实际上并没有删除任何按钮,只是有条件地禁用它们。但是,对于您的应用程序来说,这可能更好。

这里有一个我以前使用过的简洁的小技巧来实现这一点:

与使用DataGridViewButtonColumn不同,使用DataGridViewTextBoxColumn并在适当的位置添加DataGridViewButtonCell

e、 g

private void按钮1\u单击(对象发送者,事件参数e)
{
//遍历每一行。
对于(int i=0;i

在上面的示例中,我有两个DataGridViewTextBoxColumns,并在按钮单击事件中遍历每一行。我检查第一列,看它是否包含“bob”,如果包含,我在它旁边的列中添加一个按钮。您可以根据需要使用此技巧(即,按钮单击、行加载事件、CellEndEdit事件等)。以不同的方式进行实验。希望这对别人有帮助

您可以在单元绘制事件中处理单元绘制:

private void dgv_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
     if(e.RowIndex>=0 && e.ColumnIndex == indexOfButtonColumn  && value[e.RowIndex] != "bob")
     {
           e.Paint(e.ClipBounds, DataGridViewPaintParts.All & ~DataGridViewPaintParts.ContentForeground & ~DataGridViewPaintParts.ContentBackground); 
           e.Handled = true;      
     }
}
private void dgv_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
     if(e.RowIndex>=0 && e.ColumnIndex == indexOfButtonColumn  && value[e.RowIndex] != "bob")
     {
           e.Paint(e.ClipBounds, DataGridViewPaintParts.All & ~DataGridViewPaintParts.ContentForeground & ~DataGridViewPaintParts.ContentBackground); 
           e.Handled = true;      
     }
}