我试图在DataGridView
数据库表的控件名称和字段中显示。在表格的每一行名称显示在第一个单元格中,第二列允许选择该表格的任何字段。
为此,我正在处理“DataGridView.CellBeginEdit”事件并使用字段名称填充单元格的 DataSource。当我尝试编辑这些单元格时,提供的列表会正确显示,并且可以很好地选择。
但是,当我尝试在另一行中执行相同操作时,我开始收到DataError
有关已编辑单元格的事件。
DataRow 的事件参数在Context
字段中有“Formatting|Display”,并且有消息“DataGridViewComboBoxCell 中不允许值”(或接近它)。在调试中,单元格事件引用具有正确Value
的字段,但它DataSource
是 null 并且它的FormattedValue
是空字符串。并且之前显示的文本变为空白。
这应该如何正确解决?我是否应该派生自己的自定义 datagridview 单元格,该单元格显示文本但具有组合框编辑器?如果是这样,怎么做?
编辑:这是我目前正在使用的代码:
public class FieldDataNeededEventArgs: EventArgs
{
public List<string> FieldNames
{
get; private set;
}
public string TableName
{
get; private set;
}
public ReferenceFieldDataNeededEventArgs(stringdata)
: base()
{
FieldNames = new List<string>();
TableName= data;
}
}
...
public event EventHandler<FieldDataNeededEventArgs> FieldDataNeeded =
new EventHandler<FieldDataNeededEventArgs>((sender, args) => { });
...
//handler for CellBeginEdit
//dgvMatch - dataGridView, DocsReferenceToTableMatch is class that datagridview is bound to
private void dgvMatch_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
{
if (e.ColumnIndex == dgvMatch.Columns["TableKey"].Index)
{
DocsReferenceToTableMatch data = dgvMatch.Rows[e.RowIndex].DataBoundItem as DocsReferenceToTableMatch;
FieldDataNeededEventArgs ea = new FieldDataNeededEventArgs(data.TableName);
FieldDataNeeded(this, ea);
var cell = (dgvMatch.Rows[e.RowIndex].Cells[e.ColumnIndex] as DataGridViewComboBoxCell);
cell.DataSource = ea.FieldNames;
}
}
//example handler for the FieldDataNeeded event
static void ld_ReferenceFieldDataNeeded(object sender, ReferenceFieldDataNeededEventArgs e)
{
for (int i = 0; i < 4; i++)
{
e.FieldNames.Add(String.Format("{0}_fld{1}", e.ReferenceName, i));
}
}