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

C# 设置DataGridView单元格值并添加新行,c#,winforms,datagridview,C#,Winforms,Datagridview,我有一个带有两列的DataGridView。单击第一列中的单元格时,将显示OpenFileDialog,选择文件时,第二列中的单元格值将设置为选定的文件名。代码如下: private void dataGridView1_CellContentClick( object sender, DataGridViewCellEventArgs e) { if (e.ColumnIndex == 0) { SelectFile(e.RowIndex); }

我有一个带有两列的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(*符号),不添加新行


不清楚您想做什么,但您可以向DataGridView添加新行,如下所示:

dataGridView1.Rows.Add()

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

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

//...
    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;
            }
        }

我遇到了这个问题,用另一种方式解决了它

基本上,用户单击
DataGridView
上的一个按钮,它会打开一个对话框,询问问题,然后填写该行。只是为了好玩,我通过使用
SendKeys
以编辑模式而不是新模式获取行来修复它。您不必使用
SendKeys
填写整行,只要一个单元格就足够了

有两件重要的事情需要注意。首先,datagridview需要关闭multiselect,或者需要取消选择当前单元格。其次,您需要DefaultValuesNeed事件工作,并用sane数据填充网格

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。

如果它正在加载,你需要先添加新行,然后给它的单元格一个值,这样做

当我试图用某个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;
        }  
if(dtbl.Rows.Count>0)
{
对于(int i=0;i
我搜索了如何插入新行以及如何像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


希望这能对你有所帮助。

我也遇到了同样的问题。我做了如下的事情,它只是工作!!!(.Net framework 4.5)


有了这段代码,你可以做你想做的事情。我使用它也是出于同样的原因:

myGrid.NotifyCurrentCellDirty(true);
这个答案的来源:

谢谢你的回答。我编辑了我的问题,希望它现在清楚了。我试图用Add方法来做,但行被添加到了第一个位置。我能想到的唯一解决方案是添加新行,然后用当前行交换值。Probaj,možda uspe:)是的,我可能必须这样做,但添加新行似乎是合乎逻辑的,即使我用代码编辑第一行。是的,显然这是DataGridView的一个“特性”(更不用说bug)。也许这是有原因的。试着问一下msdn。不!该链接现在有了一个答案,添加了
myGrid.NotifyCurrentCellDirty(false)
myGrid.NotifyCurrentCellDirty(true)之后
对我来说,这有助于删除myGrid.NotifyCurrentCellDirty(true)中的“正在编辑的行”标记;事业,干得好!我在将excel文件改编为datagridview和“dateGridView1.Rows[rowIndex].Cells[1].Value=“Some Value”;“我解决了一个问题!现在我可以独立于行和列的大小上传xls ou xlsx文件了,我的datagridview已经成功地被动态填充了!
myGrid.NotifyCurrentCellDirty(true);