I've done my usual google searching but all of the topics I came across didn't seem to be doing this in the same way I am doing, or looking to do it in the same way. The closest I could find was this
Ignoring that this is VB and I'm working in C#, they have the dataset/source etc set at the top and creating new columns on a line by line basis, whereas I'm creating my data in the grid via a SQL query. In a nutshell, I'm looking to do this:
- have a datagridview, with the information populated via a SQL query, with a combobox having different values based on another value per line.
I already have everything done and setup, the issue I'm running into is getting it to be a single combobox with different values on a line-by-line check of the end value (screenshot below to make it easier to understand)
http://i67.tinypic.com/1zdqafd.jpg
The "exp grade" should be different values based on what the ID column reads as. I've tried a few different methods of getting it to be one column with different grades, but I either get the first set or second set (if I leave the if column doesn't exist) or I get multiple columns (if I remove it for id = 2 onwards). This first piece is using a query that checks the value of the ID column per row
foreach (DataGridViewRow rw in this.dgvDDL.Rows)
{
if (Convert.ToString(rw.Cells["ID"].Value) == "1")
{
if (!dgvDDL.Columns.Contains("Exp_Grade"))
{
try
{
DataGridViewComboBoxColumn cmbGrade = new DataGridViewComboBoxColumn();
SqlConnection conn = new SqlConnection(@"");
SqlCommand cmd = new SqlCommand("SELECT AREA_CODE, GRADE [Grade] "
+ "FROM RICH_DDL_TEST "
+ "WHERE IDENTIFIER = '1' "
+ "UNION "
+ "SELECT AREA_CODE, GRADE2[Grade] "
+ "FROM RICH_DDL_TEST "
+ "WHERE IDENTIFIER = '1' "
+ "UNION "
+ "SELECT AREA_CODE, GRADE3[Grade] "
+ "FROM RICH_DDL_TEST "
+ "WHERE IDENTIFIER = '1' "
+ "ORDER BY 2", conn);
cmd.CommandType = CommandType.Text;
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
da.Fill(ds);
cmbGrade.DataSource = ds.Tables[0];
this.dgvDDL.Columns.Insert(2, cmbGrade);
this.dgvDDL.Columns[2].HeaderText = "Exp_Grade";
this.dgvDDL.Columns[2].Name = "Exp_Grade";
cmbGrade.ValueMember = "Grade";
cmbGrade.DisplayMember = "Grade";
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OKCancel,
MessageBoxIcon.Warning);
}
}
}
if (Convert.ToString(rw.Cells["ID"].Value) == "2")
{
if (!dgvDDL.Columns.Contains("Exp_Grade"))
{
try
{
DataGridViewComboBoxColumn cmbGrade = new DataGridViewComboBoxColumn();
SqlConnection conn = new SqlConnection(@"");
SqlCommand cmd = new SqlCommand("SELECT AREA_CODE, GRADE [Grade] "
+ "FROM RICH_DDL_TEST "
+ "WHERE IDENTIFIER = '2' "
+ "UNION "
+ "SELECT AREA_CODE, GRADE2[Grade] "
+ "FROM RICH_DDL_TEST "
+ "WHERE IDENTIFIER = '2' "
+ "UNION "
+ "SELECT AREA_CODE, GRADE3[Grade] "
+ "FROM RICH_DDL_TEST "
+ "WHERE IDENTIFIER = '2' "
+ "ORDER BY 2", conn);
cmd.CommandType = CommandType.Text;
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
da.Fill(ds);
cmbGrade.DataSource = ds.Tables[0];
this.dgvDDL.Columns.Insert(2, cmbGrade);
this.dgvDDL.Columns[2].HeaderText = "Exp_Grade";
this.dgvDDL.Columns[2].Name = "Exp_Grade";
cmbGrade.ValueMember = "Grade";
cmbGrade.DisplayMember = "Grade";
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OKCancel,
MessageBoxIcon.Warning);
}
}
}
This second set also checks, but hard codes the values instead:
/*foreach (DataGridViewRow rw in this.dgvDDL.Rows)
{
if (Convert.ToString(rw.Cells["ID"].Value) == "1")
{
if (!dgvDDL.Columns.Contains("Exp_Grade"))
{
try
{
DataGridViewComboBoxColumn a = new DataGridViewComboBoxColumn();
this.dgvDDL.Columns.Insert(2, a);
this.dgvDDL.Columns[2].HeaderText = "Exp_Grade";
this.dgvDDL.Columns[2].Name = "Exp_Grade";
string[] aList = new[] { "A", "B", "C" };
foreach (string str in aList)
{
a.Items.Add(str);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Error at 1", MessageBoxButtons.OKCancel,
MessageBoxIcon.Warning);
}
}
}
if (Convert.ToString(rw.Cells["ID"].Value) == "2")
{
if (!dgvDDL.Columns.Contains("Exp_Grade"))
{
try
{
DataGridViewComboBoxColumn b = new DataGridViewComboBoxColumn();
this.dgvDDL.Columns.Insert(2, B)/>/>/>;
this.dgvDDL.Columns[2].HeaderText = "Exp_Grade";
this.dgvDDL.Columns[2].Name = "Exp_Grade";
string[] bList = new[] { "D", "E", "F" };
foreach (string str in bList)
{
b.Items.Add(str);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Error at 2", MessageBoxButtons.OKCancel,
MessageBoxIcon.Warning);
}
}
}
if (Convert.ToString(rw.Cells["ID"].Value) == "3")
{
}
if (Convert.ToString(rw.Cells["ID"].Value) == "4")
{
}*/
Is anybody able to point me in the right direction, or maybe point out what I'm doing wrong?
Thanks
-edit full code below updated:
private void DDLTest_Load(object sender, EventArgs e) { Cursor.Current = Cursors.WaitCursor;
this.dgvDDL.Focus();
try
{
SqlConnection cnSQL;
DataSet dsData;
String strQuery = "SELECT uio.course_occurrence_code [CourseCode], uio.long_description [CourseDesc], '' [Grade], uio.owning_organisation [Area], ddl.IDENTIFIER [ID] "
+ "FROM unit_instance_occurrences [uio] LEFT JOIN RICH_DDL_TEST [ddl] ON uio.UIO_ID = ddl.UIO_ID "
+ "WHERE uio.calocc_occurrence_code lIKE '16%' AND uio.owning_organisation IS NOT NULL "
+ "ORDER BY 3, 1";
//If using database class
cnSQL = database.AcquireConnection();
//If using database class
dsData = database.GetData(cnSQL, strQuery);
cnSQL.Close();
cnSQL.Dispose();
if (dsData.Tables.Count > 0)
{
dgvDDL.DataSource = dsData.Tables[0];
this.dgvDDL.Columns["Grade"].Visible = false;
this.dgvDDL.AutoGenerateColumns = false;
/*try
{
DataGridViewComboBoxColumn cmbGrade = new DataGridViewComboBoxColumn();
SqlConnection conn = new SqlConnection(@"Data Source = EBS - DB - REPORTSE; Initial Catalog = ebslive; Persist Security Info = True; User ID = sa; Password = W0rk1ngMen5");
SqlCommand cmd = new SqlCommand("SELECT AREA_CODE, 'A'[Grade] "
+ "FROM RICH_DDL_TEST "
+ "UNION "
+ "SELECT AREA_CODE, 'B'[Grade] "
+ "FROM RICH_DDL_TEST "
+ "UNION "
+ "SELECT AREA_CODE, 'C'[Grade] "
+ "FROM RICH_DDL_TEST "
+ "UNION "
+ "SELECT AREA_CODE, 'D'[Grade] "
+ "FROM RICH_DDL_TEST "
+ "UNION "
+ "SELECT AREA_CODE, 'E'[Grade] "
+ "FROM RICH_DDL_TEST "
+ "UNION "
+ "SELECT AREA_CODE, 'F'[Grade] "
+ "FROM RICH_DDL_TEST "
+ "UNION "
+ "SELECT AREA_CODE, 'G'[Grade] "
+ "FROM RICH_DDL_TEST "
+ "UNION "
+ "SELECT AREA_CODE, 'H'[Grade] "
+ "FROM RICH_DDL_TEST "
+ "UNION "
+ "SELECT AREA_CODE, 'I'[Grade] "
+ "FROM RICH_DDL_TEST "
+ "UNION "
+ "SELECT AREA_CODE, 'J'[Grade] "
+ "FROM RICH_DDL_TEST "
+ "UNION "
+ "SELECT AREA_CODE, 'K'[Grade] "
+ "FROM RICH_DDL_TEST "
+ "ORDER BY 2", conn);
cmd.CommandType = CommandType.Text;
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
da.Fill(ds);
cmbGrade.DataSource = ds.Tables[0];
this.dgvDDL.Columns.Insert(2, cmbGrade);
this.dgvDDL.Columns[2].HeaderText = "Exp_Grade";
this.dgvDDL.Columns[2].Name = "Exp_Grade";
cmbGrade.ValueMember = "Grade";
cmbGrade.DisplayMember = "Grade";
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OKCancel,
MessageBoxIcon.Warning);
}*/
}
Int32 intRows = dsData.Tables[0].Rows.Count;
try
{
foreach (DataGridViewRow row in dgvDDL.Rows)
{
if (row.Index < intRows)
{
// row.Cells["Exp_Grade"].Value = dsData.Tables[0].Rows[row.Index]["Grade"].ToString();
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Error detected",
MessageBoxButtons.OKCancel,
MessageBoxIcon.Warning);
}
dsData.Tables[0].Rows.Count.ToString();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Error detected",
MessageBoxButtons.OKCancel,
MessageBoxIcon.Warning);
}
}
private void dgvDDL_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
}
private void dgvDDL_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
{
/* foreach (DataGridViewRow rw in this.dgvDDL.Rows)
{
bool flaga = false;
if (Convert.ToString(rw.Cells["ID"].Value) == "1")
flaga = true;
if (flaga)
{
this.dgvDDL.Columns["Grade"].Visible = false;
if (!dgvDDL.Columns.Contains("Exp_Grade"))
{
try
{
DataGridViewComboBoxColumn a = new DataGridViewComboBoxColumn();
this.dgvDDL.Columns.Insert(2, a);
this.dgvDDL.Columns[2].HeaderText = "Exp_Grade";
this.dgvDDL.Columns[2].Name = "Exp_Grade";
string[] aList = new[] { "C", "D", "E" };
foreach (string str in aList)
{
a.Items.Add(str);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Error at 1", MessageBoxButtons.OKCancel,
MessageBoxIcon.Warning);
}
}
}
else if (Convert.ToString(rw.Cells["ID"].Value) == "2")
{
this.dgvDDL.Columns["Grade"].Visible = false;
if (!dgvDDL.Columns.Contains("Exp_Grade"))
{
try
{
DataGridViewComboBoxColumn a = new DataGridViewComboBoxColumn();
this.dgvDDL.Columns.Insert(2, a);
this.dgvDDL.Columns[2].HeaderText = "Exp_Grade";
this.dgvDDL.Columns[2].Name = "Exp_Grade";
string[] aList = new[] { "D", "E", "F" };
foreach (string str in aList)
{
a.Items.Add(str);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Error at 2", MessageBoxButtons.OKCancel,
MessageBoxIcon.Warning);
}
}
}
else if (Convert.ToString(rw.Cells["ID"].Value) == "3")
{
this.dgvDDL.Columns["Grade"].Visible = false;
if (!dgvDDL.Columns.Contains("Exp_Grade"))
{
try
{
DataGridViewComboBoxColumn a = new DataGridViewComboBoxColumn();
this.dgvDDL.Columns.Insert(2, a);
this.dgvDDL.Columns[2].HeaderText = "Exp_Grade";
this.dgvDDL.Columns[2].Name = "Exp_Grade";
string[] aList = new[] { "G", "H", "I" };
foreach (string str in aList)
{
a.Items.Add(str);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Error at 3", MessageBoxButtons.OKCancel,
MessageBoxIcon.Warning);
}
}
}
else if (Convert.ToString(rw.Cells["ID"].Value) == "4")
{
this.dgvDDL.Columns["Grade"].Visible = false;
if (!dgvDDL.Columns.Contains("Exp_Grade"))
{
try
{
DataGridViewComboBoxColumn a = new DataGridViewComboBoxColumn();
this.dgvDDL.Columns.Insert(2, a);
this.dgvDDL.Columns[2].HeaderText = "Exp_Grade";
this.dgvDDL.Columns[2].Name = "Exp_Grade";
string[] aList = new[] { "J", "K", "L" };
foreach (string str in aList)
{
a.Items.Add(str);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Error at 4", MessageBoxButtons.OKCancel,
MessageBoxIcon.Warning);
}
}
}
}*/
}
private void dgvDDL_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
}
private void dgvDDL_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
try
{
if (e.ColumnIndex == 4)
{
if (dgvDDL.Rows[e.RowIndex].Cells[4].Value != null)
{
DataGridViewComboBoxCell comboCell = dgvDDL.Rows[e.RowIndex].Cells[0] as DataGridViewComboBoxCell;
if (dgvDDL.Rows[e.RowIndex].Cells[4].Value.ToString() == "1")
{
SetCombo(1, comboCell);
}
if (dgvDDL.Rows[e.RowIndex].Cells[4].Value.ToString() == "2")
{
SetCombo(2, comboCell);
}
if (dgvDDL.Rows[e.RowIndex].Cells[4].Value.ToString() == "3")
{
SetCombo(3, comboCell);
}
if (dgvDDL.Rows[e.RowIndex].Cells[4].Value.ToString() == "4")
{
SetCombo(4, comboCell);
}
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OKCancel,
MessageBoxIcon.Warning);
}
}
private void SetCombo (int comboType, DataGridViewComboBoxCell comboCell)
{
comboCell.Value = "";
comboCell.Items.Clear();
if (comboType == 1)
{
comboCell.Items.Add("A");
comboCell.Items.Add("B");
comboCell.Items.Add("C");
return;
}
if (comboType == 2)
{
comboCell.Items.Add("D");
comboCell.Items.Add("E");
comboCell.Items.Add("F");
return;
}
if (comboType == 3)
{
comboCell.Items.Add("G");
comboCell.Items.Add("H");
comboCell.Items.Add("I");
return;
}
if (comboType == 4)
{
comboCell.Items.Add("J");
comboCell.Items.Add("K");
comboCell.Items.Add("L");
return;
}
comboCell.Items.Add("A");
comboCell.Items.Add("B");
comboCell.Items.Add("C");
comboCell.Items.Add("D");
comboCell.Items.Add("E");
comboCell.Items.Add("F");
comboCell.Items.Add("G");
comboCell.Items.Add("H");
comboCell.Items.Add("I");
comboCell.Items.Add("J");
comboCell.Items.Add("K");
comboCell.Items.Add("L");
}
CellValueChangedevent is not firing? - JohnGDataGridView. In the properties window, click on the “events” (lightning bolt) button, and then scroll down to theCellValueChangedevent. To the right of this event, click into the empty box, a list should drop down and allow you to select yourCellValueChangedmethod. It will add the following line to the “designer’ code:this.dgvDDL.CellValueChanged += new System.Windows.Forms.DataGridViewCellEventHandler(this.dgvDDL_CellValueChanged);- JohnGCellValueChangedevent and the code does not stop at that breakpoint, then obviously the event is not being fired. If it does stop at the breakpoint, then step through the code and see what is happening. Looking at the lastCellValueChangedevent you posted, the problem I see is thatSetCombo(5, comboCell)is never called and will leave the combo box empty for cells that do not contain 1, 2, 3 or 4. - JohnG