设置DataGridView单元格值并添加新行

时间:2011-05-25 17:41:18

标签: c# winforms datagridview

我有一个包含两列的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;
    }
}

这样可行,但我希望在设置单元格值时添加新行。当我手动编辑单元格,行进入“编辑”状态并在下面添加新行时,会发生这种情况。我想以编程方式设置单元格值时也会发生相同的情况。

[编辑]

首次显示我的表单时,DataGridView为空,显示的唯一行是(*符号 - IsNewRow为true)。当我手动编辑该行中的单元格时,它将进入编辑状态(铅笔符号)并添加一个新的空行。当我使用上面的代码时,这不会发生。该行仍为IsNewRow(*符号),并且未添加新行。

enter image description here enter image description here

7 个答案:

答案 0 :(得分:3)

我遇到了同样的问题。没有找到更优雅的解决方案,但认为提供一些代码可能会有所帮助:

//...
    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 :(得分:3)

我也遇到了同样的问题。我做了类似下面的事情,它只是有效! (.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();

答案 2 :(得分:3)

使用此代码,您可以执行您想要执行的操作。我出于同样的原因使用它:

myGrid.NotifyCurrentCellDirty(true);

这个答案的来源: Make new row dirty programmatically and insert a new row after it in DataGridView

答案 3 :(得分:1)

我遇到了这个并以不同的方式解决了它。

用户基本上点击DataGridView上的按钮,会打开一个询问问题的对话框,然后填写该行。只是为了它的乐趣,我使用SendKeys来修复它以使行处于编辑模式而不是新模式。您不必使用SendKeys来填写整行,只需一个单元格即可使其正常工作。

需要注意的两件重要事项。首先,datagridview需要关闭多选,否则您需要取消选择当前单元格。其次,您需要使用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)

有更好的方法可以解决这个问题,但这很容易大声笑。

答案 4 :(得分:1)

如果它处于加载状态,则需要先添加新行,然后为其单元格赋值,执行类似这样的操作。

当我尝试使用某些Datatable的某些列填充Datagrid的某些列并从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;
        }  

答案 5 :(得分:0)

目前还不清楚你要做什么,但你可以像这样在DataGridView中添加新行:

dataGridView1.Rows.Add()

.Add()方法已重载,因此请检查哪个Add方法是您在visual studio中所需的方法。

答案 6 :(得分:0)

我搜索了如何插入新行的解决方案以及如何像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.我已经从datagridview的属性将行标题可见性设置为false。

希望这对你有所帮助。