Не удается добавить новые строки при использовании DefaultValuesNeeded в DataGridView

1

У меня проблема с datagridview в приложении для Windows. Я устанавливаю AllowUserToAddRows = true, поэтому при двойном щелчке мышью на последних пустых строках выбранная ячейка переходит в режим редактирования, и когда пользователь пишет что-то в текстовой колонке, добавляется новая строка.

Это нормально, но теперь я бы это сделал, когда новая строка редактируется пользователем (двойной щелчок), все поля заполняются значениями по умолчанию, например, используя значения из первой строки, поэтому я устанавливаю событие DefaultValuesNeeded на моем datagridview и в коде Я заполняю все поле в выбранной строке.

Проблема в том, что теперь ни одна новая строка не появляется внизу после DefaultValuesNeeded fire.

Как я могу решить эту проблему?

  • 0
    У вас есть источник привязки к вашему DataGridView?
Теги:
winforms
datagridview

1 ответ

0

Если у вас есть источник привязки к вашему DataGridView, вы можете вызвать EndCurrentEdit() в DefaultValuesNeeeded события DefaultValuesNeeeded для немедленной фиксации новой строки со значениями по умолчанию.

    {
        dt = new DataTable();
        dt.Columns.Add("Cat");
        dt.Columns.Add("Dog");

        dataGridView1.AllowUserToAddRows = true;
        dataGridView1.DefaultValuesNeeded += dataGridView1_DefaultValuesNeeded;

        dataGridView1.DataSource = dt;          
    }

    void dataGridView1_DefaultValuesNeeded(object sender, DataGridViewRowEventArgs e)
    {
        var dgv = sender as DataGridView;
        if(dgv == null)
           return;

        e.Row.Cells["Cat"].Value = "Meow";
        e.Row.Cells["Dog"].Value = "Woof";

        // This line will commit the new line to the binding source
        dgv.BindingContext[dgv.DataSource].EndCurrentEdit();
    }

Если у вас нет источника привязки, мы не сможем использовать событие DefaultValuesNeeded так как оно не работает. Но мы можем имитировать его, захватив событие CellEnter.

    {
        dataGridView1.Columns.Add("Cat", "Cat");
        dataGridView1.Columns.Add("Dog", "Dog");

        dataGridView1.AllowUserToAddRows = true;
        dataGridView1.CellEnter += dataGridView1_CellEnter;    
    }

    void dataGridView1_CellEnter(object sender, DataGridViewCellEventArgs e)
    {
        var dgv = sender as DataGridView;
        if (dgv == null)
            return;

        var row = dgv.Rows[e.RowIndex];

        if (row.IsNewRow)
        {
            // Set your default values here
            row.Cells["Cat"].Value = "Meow";
            row.Cells["Dog"].Value = "Woof";

            // Force the DGV to add the new row by marking it dirty
            dgv.NotifyCurrentCellDirty(true);
        }
    }
  • 0
    спасибо, но у меня нет привязки источника, пользователь добавляет данные в сетку, редактируя поле и добавляя новые строки
  • 0
    @ tulkas85 Я добавил раздел о том, как это сделать без источника привязки.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню