Использование списка в качестве источника данных для DataGridView
Я извлек имена параметров и их соответствующие значения из файла конфигурации в упорядоченный словарь. Словарь содержит ключи и значения, которые относятся к классу ICollection. Я хочу связать эти данные и отобразить их в DataGridView. Я попытался скопировать строки в массивы и отобразить эти массивы, но когда я запустил программу, столбцы были пустыми и вообще не были привязаны.
Я также попытался установить источник DataGridView непосредственно в одну упорядоченную коллекцию словарей (ключи или значения), но это также не привело к чему-либо, что я хотел; столбцы были пустыми. Тем не менее, третий столбец создается с именем столбца как "длина" и отображает длины записей в ICollection. Но, разумеется, мне не нужны длины, я хочу сами записи.
Вот код, который я использую для этого вопроса: после загрузки формы я загружаю файл конфигурации, а частный член с именем m_Settings имеет все пары ключ-значение. Затем я создаю список и добавляю ключи и значения отдельно. После установки источника привязки "данные" я запустил программу, и оба столбца, которые я добавил, оба пустые.
private void Form4_Load(object sender, EventArgs e)
{
loadconfigfile(Properties.Settings.Default.Config);
List<Object> data = new List<Object>();
data.Add(m_Settings.Keys);
data.Add(m_Settings.Values);
bindingSource1.DataSource = data;
dataGridView1.DataSource = bindingSource1;
dataGridView1.Refresh();
}
Любые идеи относительно того, как я мог получить упорядоченный словарь и отобразить записи в двух столбцах с надписью "Настройки" и "Значения"? Я считаю, что списки были совместимы с DataSources для DataGridViews, но теперь я начинаю вторгаться в себя.
Любая помощь или руководство приветствуются! Я буду рад предоставить дополнительную информацию, если это необходимо.
Спасибо!
ИЗМЕНИТЬ
Вот обновленный код с реализованным классом myStruct:
List<myStruct> list = new List<myStruct>();
for(int index = 0; index < m_Settings.Count; index++)
{
myStruct pair = new myStruct(keys[index], values[index].ToString());
list.Add(pair);
}
public class myStruct
{
private string Key { get; set; }
private string Value { get; set; }
public myStruct(string key, string value)
{
Key = key;
Value = value;
}
}
Однако, когда я устанавливаю привязку DataDource для списка, в DataGridView ничего не отображается, оно просто пустое. Кто-нибудь знает, почему?
Ответы
Ответ 1
Во-первых, я не понимаю, почему вы добавляете все значения ключей и значений, индекс никогда не используется.
Я попробовал этот пример:
var source = new BindingSource();
List<MyStruct> list = new List<MyStruct> { new MyStruct("fff", "b"), new MyStruct("c","d") };
source.DataSource = list;
grid.DataSource = source;
и это работает очень хорошо, я получаю два столбца с правильными именами. Тип MyStruct предоставляет свойства, которые может использовать механизм привязки.
class MyStruct
{
public string Name { get; set; }
public string Adres { get; set; }
public MyStruct(string name, string adress)
{
Name = name;
Adres = adress;
}
}
Попробуйте создать тип, который принимает один ключ и значение, и добавьте его один за другим.
Надеюсь, это поможет.
Ответ 2
Задайте свойство DataGridView
gridView1.AutoGenerateColumns = true;
И убедитесь, что список объектов, которые вы связываете, эти свойства объекта должны быть общедоступными.
Ответ 3
этот Func может вам помочь. он добавляет каждый объект списка в вид сетки
private void show_data()
{
BindingSource Source = new BindingSource();
for (int i = 0; i < CC.Contects.Count; i++)
{
Source.Add(CC.Contects.ElementAt(i));
};
Data_View.DataSource = Source;
}
Я пишу это для простого приложения базы данных