WinForms + привязка DataGridView к списку <T>
Я пытаюсь привязать элемент List<T>
к элементу управления DataGridView, и мне нечего создавать пользовательские привязки.
Я пробовал:
gvProgramCode.DataBindings.Add(new Binding("Opcode",code,"Opcode"));
Он выдает исключение, говоря, что это имя свойства не найдено.
Имя рассматриваемого столбца - "Код операции". Имя свойства в List<T>
- это код Opcode.
ANSWER EDIT: проблема заключалась в том, что у меня не было полей bindable в моем классе в качестве свойств, а только для общедоступных полей... По-видимому, он не отражает поля, просто свойства.
Ответы
Ответ 1
Является ли свойство на сетке, которое вы связываете с Opcode?.. Если вы хотите напрямую связать с List, вы просто DataSource = list. Связывание данных позволяет настраивать привязку. вы пытаетесь сделать что-то другое, кроме источника данных?
Вы получаете пустую строку? У автогенерируемых столбцов есть имена? Вы проверяли данные в объекте (а не просто string.empty)?
class MyObject
{
public string Something { get; set; }
public string Text { get; set; }
public string Other { get; set; }
}
public Form1()
{
InitializeComponent();
List<MyObject> myList = new List<MyObject>();
for (int i = 0; i < 200; i++)
{
string num = i.ToString();
myList.Add(new MyObject { Something = "Something " + num , Text = "Some Row " + num , Other = "Other " + num });
}
dataGridView1.DataSource = myList;
}
это должно работать нормально...
Ответ 2
Я не могу сказать, что вы пытаетесь сделать с приведенным вами примером, но привязка к общему списку объектов довольно проста, если вы просто хотите перечислить объекты:
private BindingSource _gridSource;
private BindingSource GridSource
{
get
{
if (_gridSource == null)
_gridSource = new BindingSource();
return _gridSource;
}
}
private void Form1_Load(object sender, EventArgs e)
{
List<FluffyBunny> list = new List<FluffyBunny>();
list.Add(new FluffyBunny { Color = "White", EarType = "Long", Name = "Stan" });
list.Add(new FluffyBunny { Color = "Brown", EarType = "Medium", Name = "Mike" });
list.Add(new FluffyBunny { Color = "Mottled", EarType = "Short", Name = "Torvald" });
GridSource.DataSource = list;
dataGridView1.Columns["EarType"].Visible = false; //Optionally hide a column
dataGridView1.DataSource = GridSource;
}
Если вы хотите отображать только определенные свойства типа List, вы можете сделать невидимый столбец невидимым.
Технически вам не нужно создавать BindingSource, но мне становится намного проще, когда я делаю обновления или изменения, если у меня есть.
Надеюсь, что это поможет.
Ответ 3
Имел ту же проблему... У меня была структура с публичными полями. ничего в сетке. предоставлял публичные геттеры, работал.
Ответ 4
Другим решением, которое я нашел, является использование коллекции BindingList.
private void Form1_Load(object sender, EventArgs e)
{
BindingList people= new BindingList {
new Person {Name="John",Age=23},
new Person {Name="Lucy",Age=16}
};
dataGridView1.DataSource= people;
}
Это отлично работает для меня,