привязка winForms + DataGridView к списку <T> - PullRequest
34 голосов
/ 24 сентября 2008

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

Я пробовал:

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

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

Название рассматриваемой колонки - "Код операции". Имя свойства в List<T> - код операции.

РЕДАКТИРОВАНИЕ ОТВЕТА : проблема заключалась в том, что у меня не было привязываемых полей в моем классе в качестве свойств, только в открытых полях ... Очевидно, это не отражается на полях, только свойства.

Ответы [ 4 ]

14 голосов
/ 24 сентября 2008

Является ли свойство в сетке, которое вы также привязываете к Opcode? .. если вы хотите привязать напрямую к списку, вы просто должны 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;
    }

это должно работать нормально ...

5 голосов
/ 24 сентября 2008

Я не могу точно сказать, что вы пытаетесь сделать с примером, который вы включили, но связывание с общим списком объектов довольно просто, если вы просто хотите перечислить объекты:

    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;

    }

Если вы хотите отображать только определенные свойства типа Списка, вы должны сделать ненужные столбцы невидимыми.

Технически, вам не нужно создавать BindingSource, но я считаю, что намного проще, когда я делаю обновления или изменения, если они у меня есть.

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

4 голосов
/ 13 ноября 2009

Другое решение, которое я нашел, - это использование коллекции 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;
}

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

4 голосов
/ 26 марта 2009

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

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