如何在DataGridView的一列中添加一个按钮

22
DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn("Software Title", typeof(string)));
dt.Columns.Add(new DataColumn("Version", typeof(string)));
dt.Columns.Add(new DataColumn("Uninstall", typeof(System.Windows.Forms.Button)));

DataRow dr = dt.NewRow();
dr[0] = "App";
dr[1] = "1.0";
Button uninstall = new Button();
uninstall.Text = "Uninstall";

dr[2] = uninstall;

dt.Rows.Add(dr);

dataGridViewSoftware.DataSource = dt;

文本显示,但按钮从未出现。


你的目标是什么类型的应用程序?你不需要在DataTable中添加按钮,而是需要在GridView中添加一个带有按钮的列。 - Habib
你的目标应用程序是什么类型的?Winform、WPF、ASP.Net? - Habib
3个回答

53

假设您正在使用Windows Forms,则需要向DataGridView中添加DataGridViewButtonColumn,而不是直接添加到DataTable中。

这应该发生在您将DataTable绑定到DataGridView之后的某个时间点。

类似以下代码的内容应该可以工作:

DataGridViewButtonColumn uninstallButtonColumn = new DataGridViewButtonColumn();
uninstallButtonColumn.Name = "uninstall_column";
uninstallButtonColumn.Text = "Uninstall";
int columnIndex = 2;
if (dataGridViewSoftware.Columns["uninstall_column"] == null)
{
    dataGridViewSoftware.Columns.Insert(columnIndex, uninstallButtonColumn);
}

当然,您将不得不处理网格的 CellClick 事件才能对按钮进行任何操作。

在您的 DataGridView 初始化代码中的某个地方添加此代码。

dataGridViewSoftware.CellClick += dataGridViewSoftware_CellClick;

然后创建处理程序:

private void dataGridViewSoftware_CellClick(object sender, DataGridViewCellEventArgs e)
{
    if (e.ColumnIndex == dataGridViewSoftware.Columns["uninstall_column"].Index)
    {
        //Do something with your button.
    }
}

什么是按钮列? - software is fun
没事了,我看到你的意思是卸载 uninstallButtonColumn 而不是 buttonColumn。你如何处理 cellclick 事件? - software is fun
编辑了我的答案以解决这个问题...你可能应该阅读有关事件处理的内容。 - Evan L
2
应编辑答案以包括 UseColumnTextForButtonValue,否则按钮内将没有任何文本。 - Just a HK developer
1
在上面的例子中,有一行重要的代码缺失了,请添加 "uninstallButtonColumn.UseColumnTextForButtonValue = true;"。 - Abhilash Thomas

17

简化它。

DataGridViewButtonColumn button = new DataGridViewButtonColumn();
{
    button.Name = "button";
    button.HeaderText = "Button";
    button.Text = "Button";
    button.UseColumnTextForButtonValue = true; //dont forget this line
    this.dataGridView1.Columns.Add(button);
}

5
如果没有使用UseColumnTextForButtonValue,每行中的按钮将没有任何内容! - Just a HK developer
@user3454439 是的,别忘了那一行。 - Ramgy Borja

2
您可以使用以下最佳方法:
                gvEmployees.AutoGenerateColumns = false;
                gvEmployees.ColumnCount = 4;


                DataGridViewButtonColumn SelectButton = new DataGridViewButtonColumn();
                SelectButton.Name = "Select";
                SelectButton.Text = "Select";
                SelectButton.UseColumnTextForButtonValue = true;
                if (gvEmployees.Columns["Select"] == null)
                {
                    gvEmployees.Columns.Insert(0, SelectButton);
                }

                DataGridViewButtonColumn DeleteButton = new DataGridViewButtonColumn();
                DeleteButton.Name = "Delete";
                DeleteButton.Text = "Delete";
                DeleteButton.UseColumnTextForButtonValue = true;
                if (gvEmployees.Columns["Delete"] == null)
                {
                    gvEmployees.Columns.Insert(1, DeleteButton);
                }

                gvEmployees.Columns[2].Name = "EmployeeID";
                gvEmployees.Columns[2].HeaderText = "EmployeeID";
                gvEmployees.Columns[2].DataPropertyName = "EmployeeID";

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接