datagridview не позволяет пользователю удалить строку - PullRequest
4 голосов
/ 28 февраля 2012

У меня есть сетка данных, привязанная к таблице данных.Столбцы не генерируются автоматически, я создаю их в коде.Я хочу, чтобы мой пользователь мог добавлять и удалять строки, поэтому у меня есть AllowUserToAddRows = true, AllowUserToDeleteRows = true.

Проблема заключается в том, что при выборе строки и нажатии DEL информация заменяется назначения по умолчанию для ячейки строки.Ряд не уходит.

Что это за поведение (почему / что происходит) и как я могу его обойти?

Вот мой код создания сетки:

    private void resetDowntimeGrid()
    {
        downtimeEntries = new DataTable();

        downtimeEntries.Columns.Add("Category", typeof(int));
        downtimeEntries.Columns.Add("HoursDown");
        downtimeEntries.Columns.Add("Reason");

        //deptDowntimeCategories.Select("", "ListOrder ASC");

        gridDowntime.Columns.Clear();

        DataGridViewComboBoxColumn cboCategory = new DataGridViewComboBoxColumn();
        {
            cboCategory.HeaderText = "Category";
            cboCategory.DataSource = deptDowntimeCategories;
            cboCategory.DisplayMember = "Name";
            cboCategory.ValueMember = "CategoryID";
            cboCategory.DataPropertyName = "Category";
            cboCategory.Width = Convert.ToInt16(gridDowntime.Width * 0.20);
            cboCategory.DisplayStyle = DataGridViewComboBoxDisplayStyle.ComboBox;
            cboCategory.AutoComplete = true;

            gridDowntime.Columns.Add(cboCategory);
        }

        DataGridViewTextBoxColumn txtDowntime = new DataGridViewTextBoxColumn();
        txtDowntime.HeaderText = "HoursDown";
        txtDowntime.DataPropertyName = "HoursDown";
        txtDowntime.Width = Convert.ToInt16(gridDowntime.Width * 0.15);
        gridDowntime.Columns.Add(txtDowntime);

        DataGridViewTextBoxColumn txtReason = new DataGridViewTextBoxColumn();
        txtReason.HeaderText = "Reason";
        txtReason.DataPropertyName = "Reason";
        txtReason.Width = Convert.ToInt16(gridDowntime.Width * 0.60);
        gridDowntime.Columns.Add(txtReason);

        gridDowntime.DataSource = downtimeEntries;

        lblStatus.Text = "Downtime grid reset.";
    }

Ответы [ 3 ]

6 голосов
/ 29 февраля 2012

Я создал пустую winform и просто поместил в нее код сетки. Разница была в том, как у меня был набор DataGridView.EditMode. У меня было = EditOnEnter, но удаление работает отлично, если я установил = EditOnKeystroke.

1 голос
/ 29 февраля 2012

Вот быстрый пример, который я сделал, за исключением двух ваших столбцов, используя часть вашего кода.Я не мог продублировать твою проблему.Возможно, вы захотите подтвердить, что вы на самом деле выбираете значение, щелкаете значение в раскрывающемся списке и затем нажимаете «Удалить».(В этом случае я просто перетащил DataGridView из панели инструментов в форму. Других изменений я не внес.)

public partial class Form1 : Form
{
       public Form1()
       {
           InitializeComponent();
       }

       private void button1_Click(object sender, EventArgs e)
       {
           DataTable myTable = new DataTable("MyTable");
           myTable.Columns.Add("CategoryID", typeof(int));
           myTable.Columns.Add("CategoryName", typeof(string));
           myTable.Rows.Add(new object[] { 1, "Small" });
           myTable.Rows.Add(new object[] { 2, "Medium" });
           myTable.Rows.Add(new object[] { 3, "Large" });

           DataGridViewComboBoxColumn cboCategory = new DataGridViewComboBoxColumn();
           cboCategory.HeaderText = "Category";
           cboCategory.DataSource = myTable;
           cboCategory.DisplayMember = "CategoryName";
           cboCategory.ValueMember = "CategoryID";
           cboCategory.DataPropertyName = "Category";
           cboCategory.Width = Convert.ToInt16(dataGridView1.Width * 0.20);
           cboCategory.DisplayStyle = DataGridViewComboBoxDisplayStyle.ComboBox;
           cboCategory.AutoComplete = true;

           dataGridView1.Columns.Add(cboCategory);

       }
}
0 голосов
/ 18 января 2019

Другая причина, по которой нажатие кнопки Delete не удаляет строки, заключается в том, что для свойства RowHeadersVisible установлено значение False, поэтому * не отображается в крайнем левом столбце.С этим исправлением решение @ MAW74656 сработало для меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...