我有一个包含两列的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(*符号),并且未添加新行。
答案 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。
希望这对你有所帮助。