C# Datagridview — поле со списком с разными значениями в строкеC#

Место общения программистов C#
Ответить
Anonymous
 C# Datagridview — поле со списком с разными значениями в строке

Сообщение Anonymous »

Я выполнил свой обычный поиск в Google, но все темы, с которыми я столкнулся, похоже, не делали это так же, как я, или не стремились сделать это таким же образом. Самое близкое, что я смог найти, это
https://www.experts-exchange.com/questi ... olumn.html
Не обращая внимания на то, что это VB, и я работаю на C#, у них набор данных/источник и т. д. установлен вверху и создаются новые столбцы построчно, тогда как я создание моих данных в сетке с помощью SQL-запроса. В двух словах, я хочу сделать следующее:
  • иметь представление сетки данных с информацией, заполненной с помощью SQL-запроса, с полем со списком, имеющим разные значения на основе по другому значению в каждой строке.
У меня уже все сделано и настроено, проблема, с которой я сталкиваюсь, заключается в том, чтобы превратить его в один список со списком с разными значения при построчной проверке конечного значения (скриншот ниже, чтобы было легче понять)
http://i67.tinypic.com/1zdqafd.jpg
«Оценка опыта» должна быть разные значения в зависимости от того, как читается столбец идентификатора. Я пробовал несколько разных способов сделать это одним столбцом с разными оценками, но я получаю либо первый набор, либо второй набор (если я оставляю столбец if не существующим), либо получаю несколько столбцов (если я удаляю это для id = 2 и далее). В этом первом фрагменте используется запрос, который проверяет значение столбца идентификатора для каждой строки
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);
}
}
}

Этот второй набор также проверяет, но вместо этого жестко кодирует значения:
/*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")
{

}*/

Может ли кто-нибудь указать мне правильное направление или, может быть, указать, что я делаю неправильно?
Спасибо-отредактируйте полный код ниже:
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");
}


Подробнее здесь: https://stackoverflow.com/questions/439 ... es-per-row
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»