将新列中的按钮添加到DataGrid中的所有行

Igo*_*gor 8 c# datagridview row button

我有一个DataGridView对象:

dataGridView1.DataSource = an.peaks;
Run Code Online (Sandbox Code Playgroud)

(an.peaks是一个List<Point>对象.type Point有3个属性:x,y,z)

女巫在运行时生成下一个表:(显然我无法上传,Image因为我是一个新用户所以我会尝试绘制它:)

____|_x__|_y__|_z__|[new column ]
____|_11_|_12_|_13_|[text/button] <==\
____|_20_|_30_|_40_|[text/button] <== } Add text if something or button if something else.
____|_50_|_60_|_70_|[text/button] <==/
Run Code Online (Sandbox Code Playgroud)

我想在新列中添加按钮(如图像/图中所示)到满足某些条件的每一行.如果条件不满意,请添加一些文本.

示例:如果数据库中已存在该点,则显示其物质名称(每个点代表一种物质).如果没有将"ADD"按钮添加到将新点添加到数据库的相应行.

条件不是问题 - 它们仅用于示例.问题是为每一行添加按钮/文本,为新按钮添加单击事件.

Dav*_*all 15

这实际上很容易使用DataGridView.你需要做的是:

添加DataGridViewButtonColumn类型的列

DataGridViewButtonColumn是标准DataGridView列类型.它可以通过设计器添加,但我通常更喜欢使用代码(通常在表单构造函数中).

DataGridViewButtonColumn col = new DataGridViewButtonColumn();
col.UseColumnTextForButtonValue = True;
col.Text = "ADD";
col.Name = "MyButton";
dataGridView1.Columns.Add(col);
Run Code Online (Sandbox Code Playgroud)

设置为UseColumnTextForButtonValuetrue表示该Text属性应用于所有按钮,为其提供"ADD"按钮文本.您还可以使用DataPropertyName指向网格数据源中的列来提供按钮文本,或者甚至可以直接设置每个单元格的值.

将按钮更改为文本

获得按钮列后,您需要将特定按钮转换为文本.您可以通过将按钮类型的单元格替换为文本类型之一来完成此操作.你可以做很多这样的地方,但最好的一个是在DataBindingComplete事件处理程序中 - 一旦网格被绑定并准备好显示但在绘制之前,这个事件就会触发.

下面我只是抓住索引为1的行,但您也可以检查每个行Value属性.

void dataGridView1_DataBindingComplete(object sender,
    DataGridViewBindingCompleteEventArgs e)
{
    dataGridView1.Rows[1].Cells["MyButton"] = new DataGridViewTextBoxCell();
}
Run Code Online (Sandbox Code Playgroud)

回应按钮点击次数

问题的最后一部分是响应按钮点击.这有点笨拙 - 您需要将CellClick事件或EditingControlShowing事件用于整个网格.

  • CellClick

    private void DataGridView1_CellClick(object sender,
        System.Windows.FormsDataGridViewCellEventArgs e) 
    { 
        if (DataGridView1.Columns[e.ColumnIndex].Name == "MyButton") 
        { 
            // button clicked - do some logic
        } 
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • EditingControlShowing

    void dataGridView1_EditingControlShowing(object sender,
         DataGridViewEditingControlShowingEventArgs e)
    {
        if (e.Control is Button)
        {
            Button btn = e.Control as Button;
            btn.Click -= new EventHandler(btn_Click);
            btn.Click += new EventHandler(btn_Click);
        }
    }
    
    void btn_Click(object sender, EventArgs e)
    {
        int col = this.dataGridView1.CurrentCell.ColumnIndex;
        int row = this.dataGridView1.CurrentCell.RowIndex;
        // Rest of the logic goes here!
    } 
    
    Run Code Online (Sandbox Code Playgroud)

在您的情况下,编辑控制方法可能是最好的,因为它不会响应单击已被文本替换的按钮.这种方式更像是您对表单上任何其他按钮的响应方式.