Установите значение ячейки DataGridView и добавьте новую строку - PullRequest
2 голосов
/ 25 мая 2011

У меня есть DataGridView с двумя столбцами.При щелчке по ячейке в первом столбце отображается OpenFileDialog, и когда я выбираю файл, в качестве значения ячейки во втором столбце указывается имя выбранного файла.Вот код:

private void dataGridView1_CellContentClick(
    object sender, DataGridViewCellEventArgs e)
{
    if (e.ColumnIndex == 0)
    {
        SelectFile(e.RowIndex);
    }
}

private void SelectFile(int rowIndex)
{
    if (openFileDialog.ShowDialog() == DialogResult.OK)
    {
        dataGridView1.Rows[rowIndex].Cells[1].Value =
            openFileDialog.FileName;
    }
}

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

[edit]

Когда моя форма впервые отображается, DataGridView пуст, и отображается только строка с(* знак - IsNewRow верно).Когда я вручную редактирую ячейку в этой строке, она переходит в состояние редактирования (знак карандаша) и добавляется новая пустая строка.Этого не происходит, когда я использую приведенный выше код.Строка остается как IsNewRow (знак *), а новая строка не добавляется.

enter image description here enter image description here

Ответы [ 7 ]

3 голосов
/ 11 июля 2014

Я тоже столкнулся с той же проблемой.Я сделал что-то вроде следующего, это просто работает !!!(.Net Framework 4.5)

// Set value for some cell, assuming rowIndex refer to the new row.
dateGridView1.Rows[rowIndex].Cells[1].Value = "Some Value";

// Then simply do this:
dataGridView1.BeginEdit(true);
dataGridView1.EndEdit();
3 голосов
/ 30 января 2015

С этим кодом вы можете делать то, что хотите.Я использовал его по той же причине:

myGrid.NotifyCurrentCellDirty(true);

Источник этого ответа: Программно очистить новую строку и вставить новую строку после нее в DataGridView

3 голосов
/ 24 января 2012

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

//...
    DialogResult dr = ofd.ShowDialog();
    if (dr == DialogResult.OK)
        {
            DataGridViewRow curRow = cell.DataGridView.Rows[cell.RowIndex];
            // check if the current row is the new row
            if (curRow.IsNewRow)
            {
                // if yes, add a new one
                int newRowIdx = cell.DataGridView.Rows.Add();
                DataGridViewRow newRow = cell.DataGridView.Rows[newRowIdx];
                DataGridViewCell newCell = newRow.Cells[cell.ColumnIndex];
                // check if the new one is _not_ the new row (this is the unexpected behavior mentioned in the questions comments)
                if (!newRow.IsNewRow)
                    newCell.Value = ofd.FileName;
                else if (!curRow.IsNewRow)
                    cell.Value = ofd.FileName;
            }
            else {
                cell.Value = ofd.FileName;
            }
        }
1 голос
/ 29 августа 2012

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

Когда я пытался заполнить определенные столбцы таблицы данных определенными столбцами некоторого объекта данных и извлекать его данные из базы данных SQL, я использовал это:

       if (dtbl.Rows.Count > 0)
        {
            for (int i = 0; i < dtbl.Rows.Count; i++)
            {
                    // adding a row each time it loops in and find a row in the dtbl
                    dataGridView1.Rows.Add();

                    dataGridView1.Rows[i].Cells[0].Value = dtbl.Rows[i][0].ToString();
                    dataGridView1.Rows[i].Cells[1].Value = dtbl.Rows[i][1].ToString();
                    dataGridView1.Rows[i].Cells[2].Value = dtbl.Rows[i][2].ToString();
            }
            dataGridView1.ReadOnly = true;
            dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
        }  
1 голос
/ 24 апреля 2012

Я столкнулся с этим и решил по-другому.

Обычно пользователь нажимает кнопку на DataGridView, открывает диалоговое окно, которое задает вопросы, а затем заполняет строку.Просто для удовольствия я исправил это, используя SendKeys, чтобы получить строку в режиме редактирования вместо нового режима.Вам не нужно использовать SendKeys, чтобы заполнить всю строку, достаточно одной ячейки, чтобы она заработала.

Две важные вещи, на которые стоит обратить внимание.Во-первых, в сетке данных необходимо отключить множественный выбор или отменить выбор текущих ячеек.Во-вторых, вам нужно событие defaultvaluesneeded, чтобы заполнить сетку нормальными данными.

myRow.Cells("dgvStockNumber").Selected = True
OrderDetailDataGridView.BeginEdit(True)
SendKeys.Send("{Backspace}")
SendKeys.Send(scp.MyStockCard.StockNumber)
Application.DoEvents()
OrderDetailDataGridView.EndEdit()
myRow.Cells("dgvChooseStockCard").Selected = True
OrderDetailDataGridView.CommitEdit(DataGridViewDataErrorContexts.Commit)

Есть лучшие способы сделать это, но это легко. Lol.

0 голосов
/ 30 апреля 2014

Я искал решение, как я могу вставить новую строку и Как установить отдельные значения ячеек внутри нее, как Excel.Я решил с помощью следующего кода:

dataGridView1.ReadOnly = false; //Before you modify it, it should be set to false!

dataGridView1.Rows.Add(); //This inserts first row, index is "0"
dataGridView1.Rows[0].Cells[0].Value = "this is 0,0!"; //This line will set the right hand string to the very first cell of your datagridview.

Примечание: 1. Ранее я проектировал столбцы в режиме разработки.2. Я установил значение видимости заголовка строки в false из свойства datagridview.

Надеюсь, это может вам помочь.

0 голосов
/ 25 мая 2011

Не совсем понятно, что вы пытаетесь сделать, но вы можете добавить новые строки в DataGridView следующим образом:

dataGridView1.Rows.Add()

метод .Add () перегружен, поэтому проверьте, какой метод Add вам нужен в visual studio.

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