2015-11-05 2 views
2

Я хочу кнопку «Удалить» в конце каждой строки DataGridView и нажав на нее, я хочу удалить нужную строку из списка привязки, который является источником данных моей сетки.DataGridView с кнопкой управления - Удалить строку

Но я не могу это сделать Я создал объект кнопки в классе продукта и создал его с уникальным идентификатором, чтобы удалить этот объект из списка. но кнопка не отображается в строке.

Screen shot

Есть TextBoxes в форме и пользователи могут вводить текст, а при нажатии клавиши на кнопку Добавить новый объект продукта инстанцируется соответствующие поля и затем добавляют к 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; 
    } 
    ..... 
} 
+0

Я думаю, что на это был дан ответ раньше. stackoverflow.com/questions/21191950/how-to-add-a-button-to-a-column-in-the-datagridview – Wayne

+0

Я не могу сделать это в списке. Я могу добавить кнопку в datatable. как это сделать в списке? – namsu

+0

Если по списку вы имеете в виду свой список привязки, то ответ заключается в том, что вы не хотите этого делать :) Ваша сетка привязана к вашему Bindinglist of T, а столбцы отражают свойства в вашем объекте типа T, t хочу свойство «удалить» в вашем объекте, что не имеет особого смысла. Привяжите datagridviwe к вашему списку (как и раньше), а затем вручную добавьте столбец с кнопкой удаления, как это предлагает этот ответ. – TDull

ответ

9

Чтобы показать кнопку на DataGridView строк, вы должны добавить DataGridViewButtonColumn к столбцам сетки. Вот некоторые общие задачи, которые вы должны знать при использовании кнопки колонки:

  • кнопку Добавить столбец в DataGridView
  • Показать изображение на кнопку
  • Set Text Баттона
  • Ручка Нажмите событие Баттона
Кнопка Колонка

Добавить в 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; 
    } 
} 

Set текст кнопки

Вы можете использовать любого из этих вариантов:

Вы можете установить Text свойства вашего DataGridViewButtonColumn, а также установить его UseColumnTextForButtonValue к true, таким образом текст будет отображаться на каждую ячейку этого столбца.

deleteButton.Text="Delete"; 
deleteButton.UseColumnTextForButtonValue=true; 

Также вы можете использовать Value свойство клетки:

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

Кроме того, как другой вариант, вы можете обрабатывать CellFormatting событие вашей сети.Этот способ может быть полезен, если вы хотите установить разные тексты для кнопок.

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"; 
    } 
} 

Ручка Нажмите Событие Баттона

Для hanlde кликов на кнопку, вы можете обрабатывать CellClick или CellContentClick событие Вашей сети. Оба события срабатывают щелчком и путем нажатия Пробел ключ.

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); 
    } 
} 

Примечание

  • Как отметил Ivan в комментариях, когда вы используете BindingList вам не нужно, чтобы установить источник данных сетки обнулить и обратно в список связывания с каждым изменением. Сам BindingList отражает изменения вашего DataGridView.
+0

Hi Reza. Я собирался ответить на это, но заметил, что вы уже это сделали. Не могли бы вы включить в свой ответ советы удалить строки, которые устанавливают DataSource в null, а затем в список привязки при каждом добавлении в список привязки. Приветствия. –

+0

Привет, Спасибо за ваш комментарий Иван, не стесняйтесь редактировать мой ответ и сделать его более полезным :) –

+0

Спасибо, но я не так хорош в таких объяснениях, как вы :-) Код, который я упомянул, кроме того, избыточным и неэффективным, потребует от OP воссоздать колонку, о которой идет речь, в случае, если AutoGenerateColumns истинно, и я уверен. –

Смежные вопросы