有人可以建议怎么做吗?
目前我有:
问题是:当我尝试编辑第二个字段(Text2)时,第一个字段(Text1)失去焦点,退出编辑模式并保存我所做的更改同时我要保存所有更改同时连续。
我想实施的内容:
问题是:在按特定按钮之前如何将所有单元格保持在编辑模式中?
答案 0 :(得分:2)
也许您可以像这样使用自定义DataGridView
public class CustomDGV : DataGridView
{
private object _cellValue;
private Dictionary<int, object[]> _pendingChanges;
public CustomDGV()
{
_pendingChanges = new Dictionary<int, object[]>();
}
protected override void OnCellBeginEdit(DataGridViewCellCancelEventArgs e)
{
// Save the value of the cell before edit
_cellValue = this[e.ColumnIndex, e.RowIndex].Value;
// If there's already a pending change for that cell, display the edited value
if (_pendingChanges.ContainsKey(e.RowIndex))
{
this[e.ColumnIndex, e.RowIndex].Value = _pendingChanges[e.RowIndex][e.ColumnIndex];
}
base.OnCellBeginEdit(e);
}
protected override void OnCellEndEdit(DataGridViewCellEventArgs e)
{
// Adds the edited value of the cell into a dictionary
if (!_pendingChanges.ContainsKey(e.RowIndex))
{
_pendingChanges.Add(e.RowIndex, new object[this.ColumnCount]);
}
_pendingChanges[e.RowIndex][e.ColumnIndex] = this[e.ColumnIndex, e.RowIndex].Value;
// Display the "old" value
this[e.ColumnIndex, e.RowIndex].Value = _cellValue;
}
public void SavePendingChanges(int rowIndex)
{
if (_pendingChanges.ContainsKey(rowIndex))
{
// Gets the pending changes for that row
var rowData = _pendingChanges[rowIndex];
// Update every cell that's been edited
for(int i = 0; i < rowData.Length; i++)
{
if (rowData[i] != null)
this[i, rowIndex].Value = rowData[i];
}
// Removes the pending changes from the dictionary once it's saved
_pendingChanges.Remove(rowIndex);
}
}
}
在CellContentClick上,您可以调用SavePendingChanges()
private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
if (e.ColumnIndex > -1 && e.RowIndex > -1)
{
if (e.ColumnIndex == 3) // Save button
{
dataGridView1.SavePendingChanges(e.RowIndex);
}
}
}
答案 1 :(得分:0)
好吧,我知道它可能看起来有点乱,但这似乎是我可以做到的最简单的解决方案 - 当网格进入编辑模式时,在每个只读单元格上显示TextBox:
public void DisplayEditors(DataGridView grid, DataGridViewRow row)
{
foreach (DataGridViewCell cell in row.Cells)
{
if (cell.ReadOnly == false)
{
var place = grid.GetCellDisplayRectangle(cell.ColumnIndex, cell.RowIndex, true);
var name = string.Format("EDITOR-{0}-{1}", cell.ColumnIndex, cell.RowIndex);
var editor = grid.Controls.Find(name, false).FirstOrDefault();
if (editor == null)
{
editor = new TextBox();
(editor as TextBox).Name = name;
grid.Controls.Add(editor);
}
else
{
editor.Show();
}
editor.Size = place.Size;
editor.Location = place.Location;
editor.Text = Convert.ToString(cell.Value);
}
}
}