DataGridView с элементом управления «Кнопка» — «Удалить строку»

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

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

Есть 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;
    }
    .....
}

person namsu    schedule 05.11.2015    source источник
comment
Я думаю, что это есть ответ. stackoverflow.com/questions/21191950/how-to-add-a-button-to-a-column-in-the-datagridview   -  person Wayne    schedule 05.11.2015
comment
я не могу сделать это в списке. я могу добавить кнопку DataTable. как сделать это в списке ??   -  person namsu    schedule 05.11.2015
comment
Если списком вы имеете в виду ваш BindingList то ответ, что вы не хотите, чтобы сделать это :) Ваша сетка связана с вашей BindingList Т, а столбцы отражают свойства в вашем объекте типа T, и вы не хотите удалить свойство в вашем объекте - которым не имеет особого смысла. Свяжите datagridviwe в список (как раньше), а затем вручную добавить колонку с удалением кнопкой, как предлагает этот ответ.   -  person TDull    schedule 05.11.2015


Ответы (1)


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

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

<Сильный> Add Button Колонка для DataGridView

Чтобы показать кнопку на каждой строке сетке, вы можете добавить _ 3_ столбцам вашей сетки программно или с помощью дизайнера:

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

<Сильный> Показать изображение на кнопки

Если вы предпочитаете рисовать изображения на кнопке, вы должны иметь изображение в качестве ресурса, а затем обрабатывать _ 5_ событие вашей сетки:

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

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

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 нажатий на кнопку, вы можете обрабатывать _ 16_ или _ 17_ событие вашей сети. Оба события пожаров на мыши и нажав пробел ключ.

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

        // Or
        // var data = (Product)dataGridView1.Rows[e.RowIndex].DataBoundItem;
        // do something 
    }
}

<Сильный> Получить данные записи по щелчку события

У вас есть e.RowIndex, то вы можете получить данные, лежащие в основе ряда:

 var data = (Product)dataGridView1.Rows[e.RowIndex].DataBoundItem;
// then you can get data.Id, data.Name, data.Price, ...

Вы должны привести его к типу данных recore, например, скажем Product.

Если привязки данных был настроен на использование DataTable, то тип для броска DataRowView.

Вы можете также использовать dataGridView1.Rows[e.RowIndex].Cells[some cell index].Value, чтобы получить значение конкретной ячейки, однако DataBoundItem имеет больше смысла.

<Сильный> Примечание

  • Как отмечает Иван в комментариях, когда вы используете BindingList вам не нужно, чтобы установить источник данных сетки в нуль и вернуться в список связывания с каждым изменением. BindingList сами отражают изменения в DataGridView.
person Reza Aghaei    schedule 05.11.2015
comment
Привет Рез. Я собирался ответить на этот вопрос, но заметил, что вы уже сделали. Не могли бы вы включить в совете ответа, чтобы удалить строки, установленные DataSource в нуль, а затем список связывания на каждом добавить в список привязки. Ваше здоровье. - person Ivan Stoev; 05.11.2015
comment
Привет, Спасибо за Ваш комментарий Иван, не стесняйтесь редактировать свой ответ и сделать его более полезным :) - person Reza Aghaei; 05.11.2015
comment
Спасибо, но я не так хорошо в объяснениях, как вы :-) Код я уже говорил, помимо того, чтобы быть избыточной и неэффективной, потребуется ОП воссоздать колонку в вопрос в случае, если AutoGenerateColumns правда, что я ставка. - person Ivan Stoev; 05.11.2015