0

I have a dataGridView with 4 columns. 3 of the columns i want to use a combobox. In the datagridview properties from the design view i already set the columns to DataGridViewComboBoxColumns. how do i from the code set the columns values from a dataset?

I can get the data i need in two datasets just don't know how to tie the data from my dataset to the related columns.

Here is what i have so far. I keep getting a error when the grid loads: "DatqaGridView Default Error Dialog. The following exception occurred in the DataGridView: System.ArgumentException:DataGridViewComboBoxCell value is not valid.

private void StoreHardwareListForm_Load(object sender, EventArgs e)
		{
			hardwareBindingSource.DataSource = hardware.Tables[ 0 ];
			dataGridView1.DataSource = hardwareBindingSource;
			
			DataSet hardwareTypes = DAL.FetchData(SQLCoreSelect.HardwareTypes());
			hardwareDescription.DataSource = hardwareTypes;
			hardwareDescription.DisplayMember = "hardwareDescription";
			hardwareDescription.ValueMember = "hardwareTypeID";

			hardwareGroup.DataSource = hardwareTypes;
			hardwareGroup.DisplayMember = "hardwareGroup";
			dataGridView1.ClearSelection();
		}

Edited by Sailor_Jerry: add error msg i get

3
Contributors
8
Replies
11
Views
6 Years
Discussion Span
Last Post by Sailor_Jerry
Featured Replies
  • 1
    __avd 1,826   6 Years Ago

    [b]>System.ArgumentExceptionataGridViewComboBoxCell value is not valid.[/b] Please take a look at this sample, [code] DataTable dt1 = new DataTable(); dt1.Columns.Add("Code", typeof(int)); dt1.Columns.Add("Product"); dt1.Rows.Add(0, "None"); dt1.Rows.Add(1, "Foo"); dt1.Rows.Add(2, "Bar"); DataTable dt2 = new DataTable(); dt2.Columns.Add("Code", typeof(int)); dt2.Columns.Add("Qty", typeof(int)); DataGridViewComboBoxColumn col1 = new DataGridViewComboBoxColumn(); DataGridViewTextBoxColumn col2 = new DataGridViewTextBoxColumn(); col1.DataSource = dt1; col1.DisplayMember … Read More

0

First set the data source for the combobox column as you would for just a regular combo box. Then set the DataPropertyName property for the combobox column to the name of the column you want to bind to in your data set.

0

Thanks for the reply. I tried setting this up like a regular combo, and the data still does not display and i get the same datagridview error. This is what i changed

hardwareDescription.DataSource = hardwareTypes.Tables[0];
0

This is working a bit better now that i changed the order. I set up the combo boxes first, then set the datagridview

0

I'm still getting this "DataGridView Default Error Dialog. The following exception occurred in the DataGridView: System.ArgumentExceptionataGridViewComboBoxCell value is not valid.
I have removed the datagridview from my form and started from scratch. When i re-add, i was able to pinpoint that the error happens if i set the Valuemember on the combobox. I do this on all my other comboboxes outside a datagridview, so I'm not sure why this causes the exception to be thrown

1

>System.ArgumentExceptionataGridViewComboBoxCell value is not valid.

Please take a look at this sample,

DataTable dt1 = new DataTable();
            dt1.Columns.Add("Code", typeof(int));
            dt1.Columns.Add("Product");

            dt1.Rows.Add(0, "None");
            dt1.Rows.Add(1, "Foo");
            dt1.Rows.Add(2, "Bar");

            DataTable dt2 = new DataTable();
            dt2.Columns.Add("Code", typeof(int));
            dt2.Columns.Add("Qty", typeof(int));


            DataGridViewComboBoxColumn col1 = new DataGridViewComboBoxColumn();
            DataGridViewTextBoxColumn  col2 = new DataGridViewTextBoxColumn();

            col1.DataSource = dt1;
            col1.DisplayMember = "Product";
            col1.ValueMember = "Code";

            col1.DataPropertyName = "Code";
            col2.DataPropertyName = "Qty";



            //  dt2.Rows.Add(5, 100);   //  This statement causes an error
                                        //  because value 5 is not present in combobox.

            dataGridView1.Columns.Add(col1);
            dataGridView1.Columns.Add(col2);

            dataGridView1.DataSource = dt2;
0

Thanks you for the reply. i changed my code but I still get exception. If i comment out the value member i do not get the exception.

DataSet hardwareTypes = DAL.FetchData(SQLCoreSelect.HardwareTypes());
			
			hardwareDescription.DataSource = hardwareTypes.Tables[ 0 ];
			hardwareBindingSource.DataSource = hardware.Tables[ 0 ];

			hardwareDescription.DisplayMember = "hardwareDescription";
			hardwareDescription.ValueMember = "hardwareTypeID";
			hardwareDescription.DataPropertyName = "hardwareTypeID";

			hardwareGroup.DisplayMember = "hardwareGroup";
			hardwareGroup.ValueMember = "hardwareTypeID";
			hardwareGroup.DataPropertyName = "hardwareTypeID";

			
			dataGridView1.DataSource = hardwareBindingSource;

			dataGridView1.ClearSelection();
0

I'm stuck here. Two things I need help on.
1. I need to understand why I keep getting this error: The following exception occurred in the DataGridView: System.FormatException: DataGridViewComboBoxCell value is not valid."
In my code if i comment out line 20 where i set the valueMember i do not get the error. But i need to know what the related hardware id is, because i want to use this to determine the type of group from my hardwareType table.
Basically if the user changes the hardwareDescription from the datagridview via the combobox, i call a function that will update the hardwareGroup cell for that row based on the hardwareTypeID

2. I can not get the columns to display in the order i have them in the designer?

In the designer i have the columns in this order: hardwareTypeID, hardwareDescription, hardwareGroup, serialNumber, hardwareStatus.

hardwareTypeId Visaible is set to false
hardwareDescription, and hardwareStatus ColumnType is set to DataGridViewComboBoxColumn
hardwareGroup is a readonly column
This is what my sql query looks like:

select sh.hardwareStatus, h.serialNumber, ht.hardwareTypeID, ht.hardwareDescription, ht.hardwareGroup from storehardware sh join store s ON s.storeID = sh.storeID join  hardware h ON sh.hardwareID = h.hardwareID join hardwaretype ht ON ht.hardwareTypeID = h.hardwareTypeID WHERE s.storeID=@storeID

When i run the code, i keep getting "The following exception occurred in the DataGridView: System.FormatException: DataGridViewComboBoxCell value is not valid."

When the datagridview displays the columns are in this order: hardwareDescription, hardwareGroup, hardwareStatus, serialNumber

Please let me know what is wrong with my code!! I'm just not getting this.

private BindingSource hardwareBindingSource = new BindingSource();
private DataSet hardware = new DataSet();
private DbDataAdapter adapter;

		/// <summary>
		/// Default constructor
		/// </summary>
		/// <param name="rowDetails">A DbDataAdapter that contains select, update, and insert statements</param>
		public StoreHardwareListForm(DbDataAdapter storeHardwareAdapter)
		{
			InitializeComponent();
			adapter = storeHardwareAdapter;			
		}

private void StoreHardwareListForm_Load(object sender, EventArgs e)
		{
                        //description combobox
			DataSet hardwareTypes = DAL.FetchData(SQLCoreSelect.HardwareTypes());
			hardwareDescription.DataSource = hardwareTypes.Tables[ 0 ];
			hardwareDescription.ValueMember = "hardwareTypeID";
			hardwareDescription.DisplayMember = "hardwareDescription";

                        //status combobox
			hardwareStatus.Items.Add("active");
			hardwareStatus.Items.Add("loaner");
			hardwareStatus.Items.Add("replaced");
			hardwareStatus.Items.Add("failed");
			hardwareStatus.Items.Add("pending");
			hardwareStatus.Items.Add("not active");

			adapter.Fill(hardware);
			hardwareBindingSource.DataSource = hardware.Tables[0];
			dataGridView1.DataSource = hardwareBindingSource;
			dataGridView1.ClearSelection();
		}
0

Not going use the ValueMember. I already pass in the id via the hardwareTypeID column

So problem 1 is solved.

This question has already been answered. Start a new discussion instead.
Have something to contribute to this discussion? Please be thoughtful, detailed and courteous, and be sure to adhere to our posting rules.