Предотвращение появления новой строки в DataGridView до заполнения текущей строки? - PullRequest
6 голосов
/ 03 апреля 2012

У меня есть DataGridView в моем приложении WinForm на C # 3.5.

AllowUserToAddNewRow свойство установлено в true.Когда пользователь вводит любой текст в DataGridView, другая новая строка автоматически добавляется в DataGridView.Я не хочу, чтобы эта новая строка добавлялась до тех пор, пока не будут выполнены некоторые проверки для текущей строки и не заполнена вся необходимая информация.

Пример: у меня есть DataGridView с пустой строкой: DataGridView with one blank row

Когда я начинаю печатать, добавляется новая строка, что слишком рано:

Я хочу, чтобы новая строка добавлялась только после того, как пользователь вводит количество:

Ответы [ 5 ]

4 голосов
/ 03 апреля 2012

Set AllowUserToAddNewRow = false Теперь сначала добавьте пустую строку в ваш источник данных, например, для. если вы привязываете DataGridView к DataTable, называемому DT, то перед

dataGridView1.DataSource = DT;

Сделайте что-то вроде

 DT.Rows.Add(DT.NewRow());

Это изначально одна пустая строка, чтобы можно было ввести первую запись. Затем обработайте событие dataGridView1.CellEndEdit, в этом случае напишите что-то вроде этого:

void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
    {
        if (e.ColumnIndex == 1)//The index of your Quantity Column
        {
            int qty = (int)DT.Rows[e.RowIndex][e.ColumnIndex];
            if (qty > 0)//Your logic if required
            {
                DT.Rows.Add(DT.NewRow());                    
            }
        }
    }
3 голосов
/ 29 февраля 2016

В основном это простая игра с некоторыми событиями и включением / отключением свойства AllowUserToAddRow:

public Form1()
        {
            InitializeComponent();
            //creating a test DataTable and adding an empty row
            DataTable dt = new DataTable();
            dt.Columns.Add("Column1");
            dt.Columns.Add("Column2");
            dt.Rows.Add(dt.NewRow());

            //binding to the gridview
            dataGridView1.DataSource = dt;

            //Set  the property AllowUserToAddRows to false will prevent a new empty row
            dataGridView1.AllowUserToAddRows = false;
        }

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

private void dataGridView1_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
{
    dataGridView1.AllowUserToAddRows = false;
}

Когда ячейка распознает конец редактирования, она вызовет событие CellEndEdit.Когда он завершает режим редактирования, проверьте ваши условия.На основе результата установите для параметра AllowUserToAddRows значение true или оставьте значение false.

private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
    //instead of MessageBox there could be as well your check conditions
    if (MessageBox.Show("Cell edit finished, add a new row?", "Add new row?", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
        dataGridView1.AllowUserToAddRows = true;
    else dataGridView1.AllowUserToAddRows = false;
}
0 голосов
/ 05 июля 2015

Я знаю, что это старый.Самый простой способ - снять флажок «Включить добавление» в режиме конструктора

enter image description here

0 голосов
/ 03 апреля 2012

Вот как это достигается.

a) Вы можете проверить содержимое текущей строки в событии RowLeave, используя

String.IsNullOrWhiteSpace(GridPGLog.Rows[e.RowIndex].Cells[0].value.toString())
using (or) Cells[0] || cells[1] || cell[2] || ..

если обнаружена какая-либо ошибка, установите фокус на ячейку ошибки и вынудите пользователя ввести данные.

DataGridViewRow rowToSelect = this.dgvJobList.CurrentRow;
rowToSelect.Selected = true;
rowToSelect.Cells[0].Selected = true;
this.dgvJobList.CurrentCell = rowToSelect.Cells[0];

б) или вы можете поместить кнопку Сохранить и проверить все вновь добавленные строки, используя цикл foreach

0 голосов
/ 03 апреля 2012

Я думаю, что на событии CellClick вы можете проверить, в каком столбце вы находитесь, а затем добавить новую строку, что-то вроде: DataGridView1.Rows.Add()

...