Как поместить n списков в виде строк таблицы данных

#c# #list #gridview #dynamic #datarow

#c# #Список #просмотр сетки #динамический #datarow

Вопрос:

Я хочу иметь общий метод для достижения следующего:

У меня есть ‘n’ Lists of string , и я хочу, чтобы они отображались как строки a Data Table в соответствующих столбцах.

Может быть, приведенный ниже код прояснит мой вопрос:

 List<string> list1 = new List<string>();
List<string> list2 = new List<string>();
List<string> list3 = new List<string>();
for (int num1 = 0; num1 < 4; num1  )
{
list1.Add(num1.ToString());
}
for (int num2 = 4; num2 < 8; num2  )
{
list2.Add(num2.ToString());
}
for (int num3 = 8; num3 < 12; num3  )
{
list3.Add(num3.ToString());
}
DataTable dtTable = new DataTable();
dtTable.Columns.Add("Column1", typeof(string));
dtTable.Columns.Add("Column2", typeof(string));
dtTable.Columns.Add("Column3", typeof(string));

for (int num4 = 0; num4 < list1.Count; num4  )
{
dtTable.Rows.Add(list1[num4], list2[num4], list3[num4]);
}
GridView2.DataSource = dtTable;
GridView2.DataBind();
  

В приведенном выше коде элементы под list1 , list2 , list3 представлены в виде строк под столбцами Column1 , Column2 , Column3 соответственно, как:

 Column1 Column2 Column3
0       4        8
1       5        9
2       6        10
3       7        11
  

У меня есть требование иметь около 50 списков, отображать их в 50 разных столбцах, в конечном итоге привязывая их к a GridView .

Я не могу просто продолжать добавлять списки в виде строк вручную, т. Е.

 dtTable.Rows.Add(list1[num4], list2[num4], list3[num4], list4[num4],.......,listn[num4]);
  

Как обобщить вышесказанное, чтобы включить n списков?

Эксперты, пожалуйста, помогите здесь.

Комментарии:

1. Глядя на то, что вы делаете, у меня такое чувство, что вам не следует расширять свои данные в виде столбцов. Базы данных работают лучше, когда данные находятся в строках. Возможно, вы захотите рассмотреть возможность наличия двух таблиц данных. Например: если вы хотите хранить телефонные номера людей и не хотите ограничивать количество телефонных номеров для хранения. Вместо того, чтобы иметь имена столбцов, такие как Phone # 1, Phone # 2, Phone # 3 … и т.д. Вы используете две таблицы, в одной таблице будет столбец ID #, который ссылается на второй столбец таблицы с именем ID #, после чего ваши данные будут помещены в строки. Затем вы можете расти столько, сколько хотите по строкам.

2. @Pabinator У меня нет преимущества использования баз данных здесь, я имею в виду, что я не могу использовать базы данных. Любые другие предложения?

3. Ну, я имел в виду таблицы данных как базы данных. Другими словами, вам не нужно использовать базу данных. В моем примере у вас может быть таблица данных с этими столбцами: ИДЕНТИФИКАТОР, имя пользователя. Затем вторая таблица данных с этими столбцами: ИДЕНТИФИКАТОР, PersonPhoneNumber. Тогда ваши данные в первой таблице данных будут выглядеть так: Row1 = 1, Пабло; Row2 = 2, Хосе; и т.д., а для второй таблицы данных ваши данные будут выглядеть так: Row1 = 1, (555) 123-4567; Row2 = 1, (555) 123-1234. В этом случае вы знаете, что телефонные номера (555) 123-4567 и (555) 123-1234 — это телефонные номера Пабло. И вы можете расти столько, сколько захотите.

4. Каковы требования к именам столбцов? Могут ли они быть просто пронумерованы вплоть до 50, как у вас в вашем примере? Должна ли таблица иметь несколько строк?

5. @MikeHixson Хороший улов.. Ну, я думаю, я могу управлять именами столбцов как Column1, Column2…. Столбец 50. Если бы должны были быть разные имена столбцов, как можно было бы подойти к этому? Любая идея.

Ответ №1:

Вы можете попробовать это. Создайте метод для обработки всех списков

 private void PopulateGrid(params List<string>[] list)
{
    DataTable dtTable = new DataTable();
    for (int listIndex = 0; listIndex < list.Length; listIndex  )
    {
        dtTable.Columns.Add(string.Format("Column{0}", listIndex), typeof(string));
    }

    for (int rowIndex = 0; rowIndex < list[0].Count; rowIndex  )
    {
        DataRow dr = dtTable.NewRow();
        for (int listIndex = 0; listIndex < list.Length; listIndex  )
        {
            dr[listIndex] = list[listIndex][rowIndex];
        }
        dtTable.Rows.Add(dr);
    }
    dataGridView1.DataSource = dtTable;
}
  

Затем создайте main List , чтобы вы могли добавлять столько списков, сколько пожелаете

 List<List<string>> allLists = new List<List<string>>();

/* Code to populate the lists */    

allLists.Add(list1);
allLists.Add(list2);
allLists.Add(list3);
...
allLists.Add(listn);
  

Затем вызовите метод

 PopulateGrid(allLists.ToArray());   
  

Комментарии:

1. ваш подход выглядит аккуратно. Позвольте мне попробовать

2. Это сработало, приятель. Спасибо за это. Если мне нужны разные имена столбцов, то какой процедуре я должен следовать.

3. Хорошо… вы можете попробовать изменить main List на a Dictionary<string, List<string>> и взять в key качестве имени столбца.