Как связать список с dataGridView?

Кажется, я бегаю по кругу и делаю это в последние часы.

Я хочу заполнить datagridview из массива строк. Я читал, что это невозможно напрямую, и что мне нужно создать настраиваемый тип, который содержит строку как общедоступное свойство. Поэтому я сделал class:

public class FileName { private string _value; public FileName(string pValue) { _value = pValue; } public string Value { get { return _value; } set { _value = value; } } } 

это class контейнера, и он просто имеет свойство со значением строки. Все, что я хочу сейчас, это строка, которая появится в datagridview, когда я привяжу его источник данных к списку.

Также у меня есть этот метод, BindGrid (), который я хочу заполнить datagridview. Вот:

  private void BindGrid() { gvFilesOnServer.AutoGenerateColumns = false; //create the column programatically DataGridViewTextBoxColumn colFileName = new DataGridViewTextBoxColumn(); DataGridViewCell cell = new DataGridViewTextBoxCell(); colFileName.CellTemplate = cell; colFileName.Name = "Value"; colFileName.HeaderText = "File Name"; colFileName.ValueType = typeof(FileName); //add the column to the datagridview gvFilesOnServer.Columns.Add(colFileName); //fill the string array string[] filelist = GetFileListOnWebServer(); //try making a List from that array List filenamesList = new List(filelist.Length); for (int i = 0; i < filelist.Length; i++) { filenamesList.Add(new FileName(filelist[i].ToString())); } //try making a bindingsource BindingSource bs = new BindingSource(); bs.DataSource = typeof(FileName); foreach (FileName fn in filenamesList) { bs.Add(fn); } gvFilesOnServer.DataSource = bs; } 

Наконец, проблема: строковый массив заполняется нормально, список создается нормально, но я получаю пустой столбец в datagridview. Я также попробовал datasource = list напрямую, а не = bindingsource, все равно ничего.

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

спасибо

Используйте BindingList и установите DataPropertyName -Property столбца.

Попробуйте следующее:

 ... private void BindGrid() { gvFilesOnServer.AutoGenerateColumns = false; //create the column programatically DataGridViewCell cell = new DataGridViewTextBoxCell(); DataGridViewTextBoxColumn colFileName = new DataGridViewTextBoxColumn() { CellTemplate = cell, Name = "Value", HeaderText = "File Name", DataPropertyName = "Value" // Tell the column which property of FileName it should use }; gvFilesOnServer.Columns.Add(colFileName); var filelist = GetFileListOnWebServer().ToList(); var filenamesList = new BindingList(filelist); // <-- BindingList //Bind BindingList directly to the DataGrid, no need of BindingSource gvFilesOnServer.DataSource = filenamesList } 

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

 public class FileName { [DisplayName("File Name")] public string FileName {get;set;} [DisplayName("Value")] public string Value {get;set;} } 

а затем вы можете связать List как источник данных как

 private void BindGrid() { var filelist = GetFileListOnWebServer().ToList(); gvFilesOnServer.DataSource = filelist.ToArray(); } 

для получения дополнительной информации вы можете посетить эту страницу Bind List объектов classа в качестве источника данных для DataGridView

Надеюсь, что это поможет вам.

Я знаю, что это старо, но это повесило меня на некоторое время. Свойства объекта в вашем списке должны быть действительными «свойствами», а не только публичными членами.

 public class FileName { public string ThisFieldWorks {get;set;} public string ThisFieldDoesNot; } 

Вместо создания нового classа Container вы можете использовать dataTable.

 DataTable dt = new DataTable(); dt.Columns.Add("My first column Name"); dt.Rows.Add(new object[] { "Item 1" }); dt.Rows.Add(new object[] { "Item number 2" }); dt.Rows.Add(new object[] { "Item number three" }); myDataGridView.DataSource = dt; 

Подробнее об этой проблеме вы найдете здесь: http://psworld.pl/Programming/BindingListOfString

Использование DataTable действует как указано пользователем927524. Вы также можете сделать это, добавив строки вручную, что не потребует добавления определенного classа упаковки:

 List filenamesList = ...; foreach(string filename in filenamesList) gvFilesOnServer.Rows.Add(new object[]{filename}); 

В любом случае, спасибо user927524 за устранение этого странного поведения!

  • DataTrigger, где значение НЕ равно нулю?
  • Программно прокрутите до метки привязки
  • Пользовательское связующее устройство для объекта
  • Разница между {Binding PropertyName} и {Binding Path = PropertyName}
  • Как связать WPF DataGrid с переменным числом столбцов?
  • В bash, как связать функциональный ключ с командой?
  • MvvmCross Android - альтернатива привязке RelativeSource для команды button
  • Установить значение null в привязке WPF
  • когда вызывается цикл $ digest?
  • Привязка списка в @RequestParam
  • Ввод текста заголовка WPF datagrid
  • Interesting Posts

    Выполнение запросов регулярного выражения с помощью pymongo

    Список в будущее последовательность

    ggplot, facet, piechart: размещение текста в середине круговых диаграмм

    Как я могу String.Format объект TimeSpan с пользовательским форматом в .NET?

    Приложение для автоматического запуска после завершения загрузки в Android

    Потерянное подключение к хосту Hyper V после создания внешнего коммутатора

    Могу ли я использовать свой ПК в качестве Bluetooth-гарнитуры для своего мобильного телефона?

    Выбор подмножества столбцов в таблице данных.

    Где найти идентификатор продукта Windows 8 (PID)

    Что такое LINQ и что он делает?

    Веб-сайты Azure API KUDU REST – аутентификация

    загружать изображение и аудио в один запрос в android

    Java: добавьте несколько строк в MySQL с помощью PreparedStatement

    `Какой python` указывает на питон, который я хочу, но` python` запускает неправильную версию

    Как сделать HTTP-запрос с помощью файлов cookie на Android?

    Давайте будем гением компьютера.