带按钮控件的DataGridView - 删除行

时间:2015-11-05 11:29:01

标签: c# .net winforms datagridview bindinglist

我想在DataGridView的每一行末尾有一个删除按钮,然后点击我要从绑定列表中删除所需的行,这是我网格的数据源。

但我似乎无法做到这一点我在产品类中创建了一个按钮对象,并使用唯一ID对其进行实例化,以从列表中删除该对象。但是按钮没有显示在行中。

Screen shot

表单中有TextBox,用户可以输入文本,当他们按下Add按钮时,产品的新对象将使用提供的字段进行实例化,然后将其添加到BindingList

最后,此列表绑定到DataGridView,详细信息显示在网格中。 (我已经完成了这一部分)。

最后点击“保存”按钮,列表将保存在数据库中。

public class Product{
    public string Brand { get; set; }   
    public int ProductPrice { get; set; }
    public int Quantity { get; set; }

    public product(string brand,int productPrice, int quantity){   
        this.Brand = brand;
        this.ProductPrice = productPrice;
        this.Quantity = quantity;
    }   
}

public partial class MainForm: Form{
    .....
    BindingList<Product> lProd = new BindingList<Product>();
    private void btnAddProduct_Click(object sender, EventArgs e){
        string Brand = txtProBrand.Text;
        int Price = Convert.ToInt32(txtPrice.Text);
        int Quantity = Convert.ToInt32(txtQuantity.Text);

        Product pro = new Product(Brand, Price, Quantity);
        lProd.Add(pro);
        dataGridView1.DataSource = null;
        dataGridView1.DataSource = lProd;
    }
    .....
}

1 个答案:

答案 0 :(得分:13)

要在DataGridView行上显示按钮,您应该在网格的列中添加DataGridViewButtonColumn。以下是使用按钮列时应该了解的一些常见任务:

  • 将按钮列添加到DataGridView
  • 在按钮上显示图像
  • 设置按钮文字
  • 处理Click按钮事件

将按钮列添加到DataGridView

要在网格的每一行上显示一个按钮,您可以通过编程方式或使用设计器向网格的列添加DataGridViewButtonColumn

var deleteButton=new DataGridViewButtonColumn();
deleteButton.Name="dataGridViewDeleteButton";
deleteButton.HeaderText="Delete";
deleteButton.Text="Delete";
deleteButton.UseColumnTextForButtonValue=true;
this.dataGridView1.Columns.Add(deleteButton);

在按钮上显示图片

如果您希望在按钮上绘制图像,则应在资源中拥有图像,然后处理网格的CellPainting事件:

void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
    if (e.RowIndex == dataGridView1.NewRowIndex || e.RowIndex < 0)
        return;

    if (e.ColumnIndex == dataGridView1.Columns["dataGridViewDeleteButton"].Index)
    {
        var image = Properties.Resources.DeleteImage; //An image
        e.Paint(e.CellBounds, DataGridViewPaintParts.All);
        var x = e.CellBounds.Left + (e.CellBounds.Width - image.Width) / 2;
        var y = e.CellBounds.Top + (e.CellBounds.Height - image.Height) / 2;
        e.Graphics.DrawImage(image, new Point(x, y));

        e.Handled = true;
    }
}

设置按钮文字

您可以使用以下任一选项:

您可以设置Text的{​​{1}}属性,并将其DataGridViewButtonColumn设置为UseColumnTextForButtonValue,这样文本就会显示在该列的每个单元格上。

true

您还可以使用单元格的deleteButton.Text="Delete"; deleteButton.UseColumnTextForButtonValue=true; 属性:

Value

另外,您可以处理网格的CellFormatting事件。当您想要为按钮设置不同的文本时,这种方式可能很有用。

this.dataGridView1.Rows[1].Cells[0].Value = "Some Text";

处理按钮的点击事件

要点击按钮,您可以处理网格的CellClickCellContentClick事件。通过单击和按 Space 键触发这两个事件。

void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
    //If this is header row or new row, do nothing
    if (e.RowIndex < 0 || e.RowIndex == this.dataGridView1.NewRowIndex)
        return;

    //If formatting your desired column, set the value
    if (e.ColumnIndex=this.dataGridView1.Columns["dataGridViewDeleteButton"].Index)
    {
        e.Value = "Delete";
    }
}

注意

  • 正如Ivan在评论中所提到的,当您使用void dataGridView_CellClick(object sender, DataGridViewCellEventArgs e) { //if click is on new row or header row if( e.RowIndex == dataGridView1.NewRowIndex || e.RowIndex < 0) return; //Check if click is on specific column if( e.ColumnIndex == dataGridView1.Columns["dataGridViewDeleteButton"].Index) { //Put some logic here, for example to remove row from your binding list. yourBindingList.RemoveAt(e.RowIndex); } } 时,您不需要将网格数据源设置为null,并在每次更改时返回绑定列表。 BindingList本身反映了对BindingList
  • 的更改