Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > Связывание данных List<T> c DataGridView


Автор: [email protected] 26.5.2009, 00:38
Здравствуйте у меня такой вопрос я создал класс
Код

public class Point
    {
        private int _x;
        private int _y;
        public Point()
        { }
        public Point(int x1, int y1)
        {
            x = x1;
            y = y1;
        }
        public int x
        {
            get { return _x; }
            set { _x = value; }
        }
        public int y
        {
            get { return _y; }
            set { _y = value; }
        }
    }


далее создал список на основе этого класса
Код

     List<Point> pList = new List<Point>();

и связал с компонентом DataGridView 
Код

void InitListPoint()
        {
            Point p;
            for (int i = 1; i <= 10; i++)
            {
                p = new Point();
                p.x = i;
                p.y = i * i;
                pList.Add(p);
            }
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            InitListPoint();
            dataGridView1.DataSource = pList;
        }

Данные отображаются нормально.
Но вот такая проблема если данные в списке изменяются
то эти изменения не отображаются в DataGridView
Как сделать так что изменения отображались.
Например после нажатия на кнопку
Код

private void button1_Click(object sender, EventArgs e)
        {
            pList[0].x = 100;
            pList[1].y = 100;
            dataGridView1.Update();
        }

Автор: Partizan 26.5.2009, 14:47
[email protected], возможно реализация классом Point интерфейса INotifyPropertyChanged поможет...

Автор: Raistlin 26.5.2009, 16:37
Дополнительно к тому, что посоветовал Partizan: (когда с INotifyPropertyChanged разберетесь)
Можно посмотреть в сторону DataBinding и реализовывать такую цепочку:
List<> - BindingList<> - BindingSource - DataGridView

Автор: Лен 28.5.2009, 11:47
Можно каждый раз на изменение свойств конкретного объекта / содержимого списка Refresh-ить грид или вызывать ResetBindings(false) у bindingSourc-а, связанного с ним. При работе с List<> в качестве DataSource напрягать по скорости не должно.

Автор: [email protected] 28.5.2009, 11:52
Можно пример кода пожалуйста

Автор: Лен 28.5.2009, 12:10
Ну, хотя бы уже и так... )))
Код

private void button1_Click(object sender, EventArgs e)
{
  pList[0].x = 100;
  pList[1].y = 100;
  pointBindingSource.ResetBindings(false);
}

Автор: [email protected] 28.5.2009, 14:46
Ясно поробуем

Автор: Raistlin 28.5.2009, 20:04
Цитата(Лен @  28.5.2009,  12:10 Найти цитируемый пост)

pList[0].x = 100;  
pList[1].y = 100;  

Тогда уж брать список из pointBindingSource.DataSource и работать с ним, а не хранить где-то отдельно.

Автор: Alex23 23.4.2010, 23:20
Спасибо, Лен! Была аналогичная проблема и решилась с помощью ResetBindings(false).

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)