C# 设置DataGridView单元格值并添加新行
我有一个带有两列的DataGridView。单击第一列中的单元格时,将显示OpenFileDialog,选择文件时,第二列中的单元格值将设置为选定的文件名。代码如下: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); }
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);