为datagridview组合框单元设置不同的数据源后出错

时间:2013-04-25 09:07:49

标签: c# datagridview datagridcomboboxcolumn

我试图在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));
        }
    }

0 个答案:

没有答案