У меня есть простой, List<string>
и я бы хотел, чтобы он отображался в DataGridView
столбце.
Если бы список содержал более сложные объекты, просто установил бы список как значение его DataSource
свойства.
Но при этом:
myDataGridView.DataSource = myStringList;
Я получаю вызов столбца, Length
и отображается длина строк.
Как отобразить фактические строковые значения из списка в столбце?
c#
binding
datagridview
Агнешка
источник
источник
DataPropertyName
Колонны должна бытьValue
Попробуй это:
IList<String> list_string= new List<String>(); DataGridView.DataSource = list_string.Select(x => new { Value = x }).ToList(); dgvSelectedNode.Show();
Надеюсь, это поможет.
источник
List.ConvertAll(x => new { Value = x});
.Следующее должно работать, если вы привязаны ко всему, что реализует IEnumerable <string>. Он привяжет столбец непосредственно к самой строке, а не к пути свойства этого строкового объекта.
<sdk:DataGridTextColumn Binding="{Binding}" />
источник
вы также можете использовать linq и анонимные типы для достижения того же результата с гораздо меньшим объемом кода, как описано здесь .
ОБНОВЛЕНИЕ: блог не работает, вот содержание:
(..) Значения, показанные в таблице, представляют длину строк, а не строковых значений (!) Это может показаться странным, но именно так механизм связывания работает по умолчанию - для данного объекта он будет пытаться привязать к первому свойству этого объект (первое свойство, которое он может найти). При передаче экземпляра класса String свойство, к которому он привязывается, - String.Length, поскольку нет другого свойства, которое предоставило бы саму строку.
Это означает, что для правильной привязки нам нужен объект-оболочка, который будет отображать фактическое значение строки как свойство:
public class StringWrapper { string stringValue; public string StringValue { get { return stringValue; } set { stringValue = value; } } public StringWrapper(string s) { StringValue = s; } } List<StringWrapper> testData = new List<StringWrapper>(); // add data to the list / convert list of strings to list of string wrappers Table1.SetDataBinding(testdata);
Хотя это решение работает так, как ожидалось, для него требуется довольно много строк кода (в основном для преобразования списка строк в список оболочек строк).
Мы можем улучшить это решение, используя LINQ и анонимные типы - мы будем использовать запрос LINQ для создания нового списка строковых оболочек (в нашем случае строковая оболочка будет анонимным типом).
var values = from data in testData select new { Value = data }; Table1.SetDataBinding(values.ToList());
Последнее изменение, которое мы собираемся сделать, это переместить код LINQ в метод расширения:
public static class StringExtensions { public static IEnumerable CreateStringWrapperForBinding(this IEnumerable<string> strings) { var values = from data in strings select new { Value = data }; return values.ToList(); }
Таким образом, мы можем повторно использовать код, вызывая единственный метод для любой коллекции строк:
источник
Это обычная проблема, другой способ - использовать объект DataTable.
DataTable dt = new DataTable(); dt.Columns.Add("column name"); dt.Rows.Add(new object[] { "Item 1" }); dt.Rows.Add(new object[] { "Item 2" }); dt.Rows.Add(new object[] { "Item 3" });
Эта проблема подробно описана здесь: http://www.psworld.pl/Programming/BindingListOfString
источник
Вы можете столкнуться с проблемами производительности при назначении действительно больших списков через LINQ. Следующее решение подходит для больших списков и без подкласса String:
Установите DataGridView (здесь «Просмотр») в виртуальный режим, создайте нужный столбец и переопределите / зарегистрируйте событие CellValueNeeded.
private void View_CellValueNeeded(object sender, DataGridViewCellValueEventArgs e) { // Optionally: check for column index if you got more columns e.Value = View.Rows[e.RowIndex].DataBoundItem.ToString(); }
тогда вы можете просто назначить свой список DataGridView:
источник
Попробуй это :
//i have a List<string> g_list = new List<string>(); //i put manually the values... (for this example) g_list.Add("aaa"); g_list.Add("bbb"); g_list.Add("ccc"); //for each string add a row in dataGridView and put the l_str value... foreach (string l_str in g_list) { dataGridView1.Rows.Add(l_str); }
источник
Альтернативным вариантом является использование новой вспомогательной функции, которая будет принимать значения из списка и обновлять в DataGridView следующим образом:
private void DisplayStringListInDataGrid(List<string> passedList, ref DataGridView gridToUpdate, string newColumnHeader) { DataTable gridData = new DataTable(); gridData.Columns.Add(newColumnHeader); foreach (string listItem in passedList) { gridData.Rows.Add(listItem); } BindingSource gridDataBinder = new BindingSource(); gridDataBinder.DataSource = gridData; dgDataBeingProcessed.DataSource = gridDataBinder; }
Тогда мы можем вызвать эту функцию следующим образом:
DisplayStringListInDataGrid(<nameOfListWithStrings>, ref <nameOfDataGridViewToDisplay>, <nameToBeGivenForTheNewColumn>);
источник