2015-01-08 2 views
0

Чтобы свести к минимуму этот код с помощью цикла?динамическое имя объекта

DataGridViewComboBoxColumn combo_1 = new DataGridViewComboBoxColumn(); 
string name_1 = "name_1"; 
string name1 = "Name 1"; 
combo_1.Name = name_1; 
combo_1.HeaderText = name1; 

DataGridViewComboBoxColumn combo_2 = new DataGridViewComboBoxColumn(); 
string name_2 = "name_2"; 
string name2 = "Name 2"; 
combo_2.Name = nazwa_2; 
combo_2.HeaderText = nazwa2; 

DataGridViewComboBoxColumn combo_3 = new DataGridViewComboBoxColumn(); 
string name_3 = "name_3"; 
string name3 = "Name_3"; 
combo_3.Name = name_3; 
combo_3.HeaderText = name3; 

DataGridViewComboBoxColumn combo_4 = new DataGridViewComboBoxColumn(); 
string nazwa_4 = "name_4"; 
string nazwa4 = "Name 4"; 
combo_4.Name = name_4; 
combo_4.HeaderText = name4; 

Извините за не ясный вопрос, я попытаюсь объяснить ... Я хочу, чтобы добавить таблицу, чтобы dataGridView1

// define combobox column 
DataGridViewComboBoxColumn combo_1 = new DataGridViewComboBoxColumn(); 
string name_1 = "name_1"; 
string name1 = "Name 1"; 
combo_1.Name = name_1; 
combo_1.HeaderText = name1; 

// set value to combobox column 
pol.Open(); 
string list_value = "SELECT value FROM table ORDER BY name ASC"; 
SqlCommand cmd = new SqlCommand(list_value, conn); //conn is defined above in code 
SqlDataReader rdr = cmd.ExecuteReader(); 
while (rdr.Read()) 
{ 
string name = rdr.GetString(0); 
combo_1.Items.Add(name);/
} 
pol.Close(); 


// add all column 
dataGridView1.Columns.Add("name_column_1", "Name"); 
dataGridView1.Columns.Add("name_column_2", "Forname"); 
int index = 2; 
dataGridView1.Columns.Insert(index, combo_1); 

//add value to cell 
DataGridViewComboBoxCell cell = (DataGridViewComboBoxCell)dataGridView1.Rows[i].Cells[index]; 
cell.Value = dt.Rows[i].ItemArray[index]; 

Для «combo_2», «combo_3» и т.д. Я бы чтобы сделать некоторые из этих фрагментов, отличающихся только в «_1»

Если я могу использовать цикл для добавления combo_1, combo_2, combo_3

//define combobox 
DataGridViewComboBoxColumn combo = new DataGridViewComboBoxColumn(); 
for (int i = 1; i <= number_column; i++) 
{ 
string name_1 = "name_" + i; 
string name1 = "Name " + i; 
combo_1.Name = name_1; 
combo_1.HeaderText = name1; 
} 
//add column 
for (int i = 1; i <= liczba_kolumn; i++) 
{ 
int nr = 2; 
dataGridView1.Columns.Insert(nr, combo); 
nr= nr + 1; 
} 
//set value 
for (int i = 0; i < dt.Rows.Count; i++) 
{ 
dataGridView1.Rows.Add(); 
dataGridView1.Rows[i].Cells[0].Value = dt.Rows[i].ItemArray[0]; 
dataGridView1.Rows[i].Cells[1].Value = dt.Rows[i].ItemArray[1]; 

for (int j = 1; j <= number_column; j++) 
{ 
int nr = 2; 
DataGridViewComboBoxCell cell = (DataGridViewComboBoxCell)dataGridView1.Rows[i].Cells[nr]; 
cell.Value = dt.Rows[i].ItemArray[nr]; 
nr = nr + 1; 
} 
} 

error: Дополнительная информация: Указанный столбец уже принадлежит элементу управления DataGridView. Я знаю, почему эта ошибка, но я не знаю, как изменить имя комбо динамически.

+1

Пожалуйста, попробуйте отредактировать, это не имеет большого смысла ... Откуда «комбо» ...? Вы понимаете, что каждый раз, когда вы используете 'index', оно имеет одно и то же значение' 2'? –

+1

C# имеет массивы, словари и т. Д., Используя их. –

ответ

0

Я не уверен, что понял вопрос, но я возьму удар в этом ... Давайте начнем с ошибкой у вас есть:

error: Additional information: The specified column already belongs to a DataGridView control.

Я подозреваю, что это из-за этих 2 линии:

int index = 2; 
dataGridView1.Columns.Insert(index, combo); 

Возможно, вы хотите использовать «i» из цикла for? Или, может быть, вы хотели объявить index вне цикла for (я вижу, что вы увеличиваете его ниже)?

dataGridView1.Columns.Insert(i, combo); 

или

int index = 2; 
for (int i = 1; i <= number_of_columns; i++) 
{ 
    dataGridView1.Columns.Insert(index, combo); 
    index = index + 1; // or this could be index++; 
} 

Теперь давайте посмотрим на заголовок и первую строку вашего вопроса (это другая тема):

c# dynamic object name

To minimize this code using a loop (or other)?

Вы могли бы сделать что-то вроде

List<DataGridViewComboBoxColumn> myColumns = new List<DataGridViewComboBoxColumn>(); 
for(int i=0; i < (the number you want); i++) 
{ 
    DataGridViewComboBoxColumn combo = new DataGridViewComboBoxColumn(); 
    combo.Name = "name_" + i; 
    combo.HeaderText = "Name " + i; 
} 

Это будет дайте вам (несколько) динамический список DataGridViewComboBoxColumn. Однако, если вы только собираетесь добавить их прямо сейчас, вы можете предпочесть:

for(int i=0; i < (the number you want); i++) 
{ 
    dataGridView1.Columns.Insert(i, new DataGridViewComboBoxColumn{ 
             Name = "name_" + i, 
             HeaderText = "Name " + i}); 
} 

Я не проверил, что для синтаксиса, но она должна быть по крайней мере близко.

Это то, что вы искали?

+0

Я исправляю свой пост. – eszymekpl

0

Спасибо, PhatWrat, вы помогли мне решить проблему.

  pol.Open(); 
     SqlDataAdapter list_adapter = new SqlDataAdapter("SELECT value FROM box ORDER BY value ASC", pol); 
     DataTable list_dt = new DataTable(); 
     list_adapter.Fill(list_dt); 

     string[] items = new string[list_dt.Rows.Count]; 

     for (int i = 0; i < list_dt.Rows.Count; i++) 
     { 
      items[i] = list_dt.Rows[i][0].ToString(); 
      //MessageBox.Show(list_dt.Rows[i][0].ToString()); 
     } 
     pol.Close(); 

     int index = 2; 
     for (int i = 1; i <= number_of_columns; i++) 
     { 
      dataGridView1.Columns.Insert(index, new DataGridViewComboBoxColumn 
      { 
       Name = "name_" + i, 
       HeaderText = "Name " + i, 
       DataSource = items 
      }); 
      index = index + 1; 
     } 

      pol.Open(); 
     SqlDataAdapter adapter = new SqlDataAdapter("SELECT * FROM table ORDER BY name ASC", pol); 
     DataTable dt = new DataTable(); 
     adapter.Fill(dt); 

     for (int i = 0; i < dt.Rows.Count; i++) 
     { 
      dataGridView1.Rows.Add(); 
      dataGridView1.Rows[i].Cells[0].Value = dt.Rows[i].ItemArray[0]; 
      dataGridView1.Rows[i].Cells[1].Value = dt.Rows[i].ItemArray[1]; 
      int index_2 = 2; 
      for (int j = 1; j <= number_of_columns; j++) 
      { 
       DataGridViewComboBoxCell cell = (DataGridViewComboBoxCell)dataGridView1.Rows[i].Cells[index_2]; 
       cell.Value = dt.Rows[i].ItemArray[index_2]; 
       index_2 = index_2 + 1; 
      } 

     } 
     pol.Close(); 
Смежные вопросы