Search code examples
c#winformsdatagridinfragistics

Set datasource of particular cell's combobox based on another column of particular row


private void dgGrid_CellListSelect(object sender, CellEventArgs e)
{
    if (e.Cell.Column.Key == "ColumnA")
    {
        UltraGridRow selectedItem = ((UltraCombo)e.Cell.EditorControlResolved).SelectedRow;

        if (selectedItem != null)
        {
            //Option A
            cmbColumnB.DataSource = GetUISender<someBF>().RetrieveData(dataset).dataTable;
            cmbColumnB.DataBind();

            //Option B
            //((UltraCombo)e.Cell.Row.Cells["ChipSetID"].EditorControlResolved).DataSource = GetUISender<someBF>().RetrieveData(dataset).dataTable;
        }

    }
}

There is a button that allow the datagrid to add new row. This datagrid have 2 columns and both columns are UltraCombo. ColumnB combobox's dataSource will based on ColumnA. Based on the above code, it works if the datagrid only have 1 row, but once user add another row, both row's ColumnB will be sharing the same DataSource.

How to make sure ColumnB's DataSource stay independently without affecting other rows? It's very obvious that this happened because every row are sharing the same component which is cmbColumnB but I'm not sure on how to remove the reference


Solution

  • I've found the solution which is everytime create a new UltraCombo and bind it to the particular cell's EditorControl

    private void dgGrid_CellListSelect(object sender, CellEventArgs e)
    {
        if (e.Cell.Column.Key == "ColumnA")
        {
            UltraGridRow selectedItem = ((UltraCombo)e.Cell.EditorControlResolved).SelectedRow;
    
            if (selectedItem != null)
            {
                UltraCombo cmbValue = new UltraCombo();
                cmbValue.LimitToList = true;
                cmbValue.DropDownStyle = UltraComboStyle.DropDownList;
                cmbValue.DataSource = GetUISender<someBF>().RetrieveData(dataset).dataTable;
                cmbValue.ValueMember = someDS.someDT.someColumnIDColumn.ColumnName;
                cmbValue.DisplayMember = someDS.someDT.someColumnDescriptionColumn.ColumnName;
                cmbValue.BindingContext = someDg.BindingContext;
                cmbValue.DataBind();
                e.Cell.Row.Cells["ColumnB"].EditorControl = cmbValue;
                e.Cell.Row.Cells["ColumnB"].Style = Infragistics.Win.UltraWinGrid.ColumnStyle.DropDownList;
    
            }
    
        }
    }