如何在XtraGrid列中访问存储库组合框值

时间:2015-10-30 09:50:26

标签: c# combobox devexpress xtragrid

我有一个XtraGrid GridControl,它定义了3列,2个数据绑定,还有一个我设置为RepositoryItemComboBox。该列的设置如下:

this.gridColumn3.Caption = "Test";
this.gridColumn3.FieldName = "test";
this.gridColumn3.Name = "gridColumn3";
this.gridColumn3.UnboundType = DevExpress.Data.UnboundColumnType.String;
this.gridColumn3.Visible = true;
this.gridColumn3.VisibleIndex = 2;

创建RepositoryItemComboBox,如:

RepositoryItemComboBox cbo = new RepositoryItemComboBox();

cbo.Items.Add("1");
cbo.Items.Add("2");
cbo.Items.Add("3");
cbo.Items.Add("4");
cbo.Items.Add("5");
cbo.Items.Add("6");
cbo.Items.Add("7");

gridView1.Columns[3].ColumnEdit = cbo;

查看网格时,combobox会完全按照我的要求显示。此问题是在尝试检索combobox中选择的值时。当按下网格外的button时,应处理combobox值。我使用以下代码:

for (int i = 0; i < gridView1.DataRowCount; i++)
{
    int ID = (int)gridView1.GetRowCellValue(i, "id");
    string Test = gridView1.GetRowCellValue(i, "test").ToString();

    ProcessCombo(ID, Test);
}

在上面的代码ID按预期检索,但gridView1.GetRowCellValue(i, "test")返回null。我有什么可能错过的?这甚至是解决这个问题的正确方法吗?

2 个答案:

答案 0 :(得分:0)

仅当聚焦单元格处于编辑状态时,

ComboBox编辑器才存在。因此,ComboBox在您激活它时会被创建,并在您离开时被销毁。因此,当您Button被按下时,ComboBox中没有GridView

如果您想获得ComboBox值,则需要使用RepositoryItemComboBox的事件或编辑GridView的事件。指向编辑器的链接存储在sender事件的RepositoryItemComboBox参数和GridView.ActiveEditor属性中。您可以使用ComboBox.EditValue属性或使用GridView.EditingValue属性获得ComboBox的值。您也可以使用EventArgs GridView编辑活动的ValidatedEditor参数获取价值,例如CellValueChangingCellValueChangedprivate void RepositoryItemComboBox1_Closed(object sender, ClosedEventArgs e) { //Get the value from sender: var comboBox = (ComboBoxEdit)sender; object value = comboBox.EditValue; //Get the value from active editor: object activeEditorValue = gridView1.ActiveEditor.EditValue; //Get the value from editing value: object editingValue = gridView1.EditingValue; }

例如:

private Dictionary<int, string> _comboBoxValues = new Dictionary<int, string>();

private void gridView1_CustomUnboundColumnData(object sender, CustomColumnDataEventArgs e)
{
    if (e.Column.FieldName != "test")
        return;

    int id = (int)gridView1.GetListSourceRowCellValue(e.ListSourceRowIndex, "id");

    if (e.IsSetData)
        _comboBoxValues[id] = (string)e.Value;
    else if (e.IsGetData && _comboBoxValues.ContainsKey(id))
        e.Value = _comboBoxValues[id];
}

此外,如果您想存储您的值并在以后使用它,那么您可以使用ColumnView.CustomUnboundColumnData事件。

以下是示例:

{{1}}

答案 1 :(得分:0)

我决定将列更改为绑定字段,在填充网格时传入空字符串,现在我可以通过以下方式访问数据:

string Test = gridView1.GetRowCellValue(i, "test").ToString();

不想这样做,但它确实有效......