i have a DataGridview with some ComboBox cells in there.
each row should have a different list of items to select the value from.
you can set the bindingsource on Enter and reset the bindingsource to the list with all items on EndEdit...
in dataGridView CellEnter
if (e.ColumnIndex == CELLINDEXWhereComboBoxIs)
{
//Set DataSource of cell if comboBoxCell
DataGridViewComboBoxCell cell = (DataGridViewComboBoxCell)dataGridView[e.ColumnIndex, e.RowIndex];
cell.DataSource = bindingSourceFiltered;
}
in dataGridView CellEndEdit
if (e.ColumnIndex == CELLINDEXWhereComboBoxIs)
{
//set DataSource to BindingSource with all items
DataGridViewComboBoxCell cell = (DataGridViewComboBoxCell)dataGridView[e.ColumnIndex, e.RowIndex];
cell.DataSource = bindingSourceAll;
}
ps:
you can add filters to the bindingsource!
but only if the underlying list supports filtering!!
DataGridView daily problems...
Labels: databinding, winforms
Latest Posts
Popular Posts
-
I am *very* keen on automating tests, so I was looking into unit testing a WCF service. If I say "unit test", I mean a fast ,...
-
It's easy I thought, just select the Property of the EntityType and set the Default Value in the Properties window to: DateTime.Now ...
-
*Updated* 26. September 2010: Updated with comments from Adam Cogan *Updated* 27. September 2010: Updated the comparison between anonymo...
3 comments:
I'm doing something similar but trying to change the datasource for the combobox cell as I add the row. My method is failing but not sure why. it gives me -
Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index
If I try to add the column in the Rows.add method with the other columns, I get: DataGridViewComboBoxCell value is not valid.
Here is the code:
foreach (DataRow dr in dt.Rows)
{
int itemID = Convert.ToInt32(dr["ItemID"]);
col1 = dr["ComponentDescription"].ToString();
col2 = Convert.ToInt32(dr["TotalQuantity"]);
col3 = dr["UnitDescription"].ToString();
DataGridViewComboBoxCell cboCell = GetComboBox(itemID);
int index = grdBOM.Rows.Add(col1, col2, col3);
grd.Rows[index].Cells["LotNumber"] = cboCell; //Column is defined as a comboBoxColumn in other method.
}
private DataGridViewComboBoxCell GetComboBox(int itemID)
{
try
{
ArrayList lotItems = new ArrayList();
dsDataAccess.dtItemLotReceivedListDataTable dtLots = new dsDataAccess.dtItemLotReceivedListDataTable();
dtLots = doh.GetRawLotList(itemID);
foreach (DataRow dr in dtLots.Rows)
{
lotItems.Add(new ComboBoxItems((string)dr["Lot"], Convert.ToInt32(dr["ItemID"])));
}
DataGridViewComboBoxCell dgvComboBoxCell = new DataGridViewComboBoxCell();
dgvComboBoxCell.ToolTipText = "Some Text";
dgvComboBoxCell.DataSource = lotItems;
dgvComboBoxCell.DisplayMember = "Display";
dgvComboBoxCell.ValueMember = "Value";
return dgvComboBoxCell;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
return null;
}
Is there an easier way to accomplish this?
I'm cant understand why you would do this when you add a row...
the logic of this Filter Solution is:
you have a list with many items, but in different rows you want to display only part of this long list...
HINT
you could use the bindingSource AddingNew event to set some fields when adding a row...
void bindingSourceTEST_AddingNew(object sender, AddingNewEventArgs e)
{
MyObject temp = new MyObject();
temp.Prop1 = -1;
temp.PropXX = "Name";
e.NewObject = temp;
}
Thanks! a very helpful post!
Post a Comment