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