Подтвердить что ты не робот

WinForms + привязка DataGridView к списку <T>

Я пытаюсь привязать элемент List<T> к элементу управления DataGridView, и мне нечего создавать пользовательские привязки.

Я пробовал:

gvProgramCode.DataBindings.Add(new Binding("Opcode",code,"Opcode"));

Он выдает исключение, говоря, что это имя свойства не найдено.

Имя рассматриваемого столбца - "Код операции". Имя свойства в List<T> - это код Opcode.

ANSWER EDIT: проблема заключалась в том, что у меня не было полей bindable в моем классе в качестве свойств, а только для общедоступных полей... По-видимому, он не отражает поля, просто свойства.

4b9b3361

Ответ 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;
}

Это отлично работает для меня,