我试图在DataGridView
控件名称和数据库表字段中显示。在每个行中,表的名称显示在第一个单元格中,第二列允许选择该表的任何字段。
为此,我正在处理'DataGridView.CellBeginEdit'事件,并为具有字段名称的单元格填充DataSource。当我尝试编辑这些单元格时,提供的列表会正确显示,并且可以选择正常。
但是,当我尝试在另一行中执行相同操作时,我开始收到有关我编辑过的单元格的DataError
个事件。
DataRow的事件参数在Context
字段中有'格式化|显示',并且消息“DataGridViewComboBoxCell中不允许值”(或接近它)。在调试中,单元格事件引用具有正确的Value
字段,但其DataSource
为空,其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));
}
}