Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / DataGridView обновить содержимое / 22 сообщений из 22, страница 1 из 1
01.10.2013, 13:17
    #38412980
Pallaris
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DataGridView обновить содержимое
У грида через BindingSource прицеплен List<T>. Надо по таймеру обновлять данные.
Проблема: не получается.

Что пробовал:
1. grid.Refresh() - данные не меняются.
2. grid.DataSource=null; gridDataSource = bindingSource_ - работает, но при нажатии на строку падает IndexOutOfRangeException

То ли я туплю, то ли... Помогите.
...
Рейтинг: 0 / 0
01.10.2013, 13:26
    #38413005
pation
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DataGridView обновить содержимое
Pallaris,

bindingSource.DataSource = GetData();
...
Рейтинг: 0 / 0
01.10.2013, 13:33
    #38413025
Pallaris
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DataGridView обновить содержимое
pation,

не понял. GetData() должен вернуть мой List<>? Но в BindingSource.DataSource и так уже он лежит.

Вот тестовый пример. В верхний грид вводятся данные и они должны отобразиться в нижнем с интервалом 5 сек.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
public partial class Form1 : Form
    {
        List<SomeClass> list_ = new List<SomeClass>();
        System.Threading.Timer tm_;

        public Form1()
        {
            InitializeComponent();
            bindingSource1.DataSource = list_;
            bindingSource2.DataSource = list_;
            dataGridView1.DataSource = bindingSource1;
            dataGridView2.DataSource = bindingSource2;
            tm_= new System.Threading.Timer(UpdateTimer,null,0,5000);
        }

        public void UpdateTimer(object obj_)
        {
            RefreshGrid2();
        }

        public void RefreshGrid2()
        {
            if (this.InvokeRequired)
                this.Invoke(new MethodInvoker(RefreshGrid2));
            else
            {
                bindingSource2.DataSource = list_;
                /*dataGridView2.DataSource = null;
                dataGridView2.DataSource = bindingSource2;*/
            }
        }

        
    }

    public class SomeClass
    {
        public string name { set; get; }
        public string description { set; get; }

        public SomeClass()
        {
            name = "testName";
            description = "testDescription";
        }
    }
...
Рейтинг: 0 / 0
01.10.2013, 13:44
    #38413041
Pallaris
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DataGridView обновить содержимое
Обана, помогло!

Код: c#
1.
2.
bindingSource2.DataSource = null;
bindingSource2.DataSource = list_;



Спасибо, pation!!!
...
Рейтинг: 0 / 0
01.10.2013, 14:17
    #38413089
Pallaris
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DataGridView обновить содержимое
Удивляет, что для корректного отображения в Гриде нужно перебиндивать данные. Оно так и задумывалось?
...
Рейтинг: 0 / 0
01.10.2013, 14:20
    #38413097
fortibransa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DataGridView обновить содержимое
PallarisУдивляет, что для корректного отображения в Гриде нужно перебиндивать данные. Оно так и задумывалось?Ну дык у тебя тогда должны быть события в источнике данных по типу nameChanged(object sender, EventArgs e)
...
Рейтинг: 0 / 0
01.10.2013, 14:26
    #38413112
Pallaris
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DataGridView обновить содержимое
fortibransa,

допустим, я подпишу Грид на это событие. Что дальше, что в этом обработчике должно быть написано, чтобы Грид перерисовался с правильными данными?
...
Рейтинг: 0 / 0
01.10.2013, 14:34
    #38413124
fortibransa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DataGridView обновить содержимое
Pallarisfortibransa,

допустим, я подпишу Грид на это событие. Что дальше, что в этом обработчике должно быть написано, чтобы Грид перерисовался с правильными данными?Да грид не надо подписывать на это, нужно чтоб были такие события у источника данных, а сам источник был прибинден к гриду.
...
Рейтинг: 0 / 0
01.10.2013, 14:51
    #38413142
fortibransa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DataGridView обновить содержимое
Как-то так
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
    public partial class Form1 : Form
    {
        List<SomeClass> list_ = new List<SomeClass>();
        public Form2()
        {
            InitializeComponent();
        }

        private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {

        }
        private void Form2_Load(object sender, EventArgs e)
        {
            list_.Add(new SomeClass());
            bindingSource1.DataSource = list_;
            bindingSource2.DataSource = list_;
            dataGridView1.DataSource = bindingSource1;
            dataGridView2.DataSource = bindingSource2;
        }
    }
    public class SomeClass
    {
        public event EventHandler nameChanged;
        void OnnameChanged(string value)
        {
            EventHandler d = nameChanged;
            if (d != null)
                d(this, new EventArgs());
        }
        public event EventHandler descriptionChanged;
        void OndescriptionChanged(string value)
        {
            EventHandler d = descriptionChanged;
            if (d != null)
                d(this, new EventArgs());
        }
        string _name;
        string _des;
        public string name
        {
            set
            {
                if (string.Compare(_name, value, StringComparison.OrdinalIgnoreCase) != 0)
                {
                    _name = value;
                    OnnameChanged(_name);
                }
            }
            get { return _name; }
        }
        public string description
        {
            set
            {
                if (string.Compare(_des, value, StringComparison.OrdinalIgnoreCase) != 0)
                {
                    _des = value;
                    OndescriptionChanged(_des);
                }
            }
            get { return _des; }
        }

        public SomeClass()
        {
            name = "testName";
            description = "testDescription";
        }
    }
...
Рейтинг: 0 / 0
01.10.2013, 14:53
    #38413145
fortibransa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DataGridView обновить содержимое
А вот на добавление/удаление см. сам.
...
Рейтинг: 0 / 0
01.10.2013, 15:01
    #38413162
Pallaris
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DataGridView обновить содержимое
fortibransa,

ты ж так и не подписал никого на это событие.
...
Рейтинг: 0 / 0
01.10.2013, 15:10
    #38413177
Pallaris
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DataGridView обновить содержимое
В любом случае, добавление и удаление уже ж нужно навешивать на BindingSource, а не на сам класс. Плюс прописать вызов событий для каждого property у класса. Не дофига ли это получается, чтобы просто осуществить обновление Грида по актуальным данным, которые кстати ему доступны в любой момент?
...
Рейтинг: 0 / 0
01.10.2013, 15:11
    #38413179
fortibransa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DataGridView обновить содержимое
Pallarisfortibransa,

ты ж так и не подписал никого на это событие.Ты попробуй, ты не поверишь
...
Рейтинг: 0 / 0
01.10.2013, 15:14
    #38413184
Pallaris
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DataGridView обновить содержимое
fortibransaТы попробуй, ты не поверишь

Что должно быть в этом обработчике? Вот это:
Код: c#
1.
2.
bindingSource.DataSource = null;
bindingSource.DataSource = list_;


?
...
Рейтинг: 0 / 0
01.10.2013, 15:18
    #38413195
Pallaris
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DataGridView обновить содержимое
fortibransaТы попробуй, ты не поверишь

Скопипастил твой SomeClass, естественно нифига не обновляется в гриде
...
Рейтинг: 0 / 0
01.10.2013, 15:34
    #38413220
fortibransa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DataGridView обновить содержимое
PallarisfortibransaТы попробуй, ты не поверишь

Скопипастил твой SomeClass, естественно нифига не обновляется в гриде
Код: c#
1.
2.
3.
4.
        private void Form1_Load(object sender, EventArgs e)
        {
            list_.Add(new SomeClass());
....
...
Рейтинг: 0 / 0
01.10.2013, 15:44
    #38413237
Pallaris
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DataGridView обновить содержимое
fortibransa,

вообще говоря, для отображения изменений в полях name и description уже существующих записей на момент прибинживания твоих обработчиков (ни к чему не прицепленных кстати) не нужно - оно все-таки само происходит.
...
Рейтинг: 0 / 0
01.10.2013, 15:55
    #38413255
fortibransa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DataGridView обновить содержимое
Pallarisfortibransa,

вообще говоря, для отображения изменений в полях name и description уже существующих записей на момент прибинживания твоих обработчиков (ни к чему не прицепленных кстати) не нужно - оно все-таки само происходит.Ты разницу посмотри, при валидации (на другую клетку уйти) в 1 таблице изм сразу появляются во 2-й.
Для добавление удаления, можно использовать не List а BindingList<SomeClass> list_=new BindingList<SomeClass>();
...
Рейтинг: 0 / 0
01.10.2013, 15:56
    #38413262
fortibransa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DataGridView обновить содержимое
А лучше вообще ObservableCollection<T>
...
Рейтинг: 0 / 0
01.10.2013, 15:58
    #38413266
Pallaris
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DataGridView обновить содержимое
fortibransaТы разницу посмотри, при валидации (на другую клетку уйти) в 1 таблице изм сразу появляются во 2-й.;

Абсолютно то же самое получается (проверил), если убрать твои обработчики - они вообще не нужны.
...
Рейтинг: 0 / 0
01.10.2013, 16:09
    #38413282
fortibransa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DataGridView обновить содержимое
PallarisfortibransaТы разницу посмотри, при валидации (на другую клетку уйти) в 1 таблице изм сразу появляются во 2-й.;

Абсолютно то же самое получается (проверил), если убрать твои обработчики - они вообще не нужны.Тут да, пардон List<T>, это уже сделал.
...
Рейтинг: 0 / 0
01.10.2013, 17:02
    #38413369
fortibransa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DataGridView обновить содержимое
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
namespace WindowsFormsApplication1
{
    
    public partial class Form1 : Form
    {
        BindingList<SomeClass> _list = new BindingList<SomeClass>();
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            bindingSource1.DataSource = _list;
            bindingSource2.DataSource = _list;
            dataGridView1.DataSource = bindingSource1;
            dataGridView2.DataSource = bindingSource2;
        }
    }
    public class SomeClass : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        void FirePropertyChangedNotification(string propName)
        {
            PropertyChangedEventHandler d = PropertyChanged;
            if (d != null)
                d(this, new PropertyChangedEventArgs(propName));
        }
        string _name;
        string _des;
        public string name
        {
            set
            {
                _name = value;
                FirePropertyChangedNotification("name");
            }
            get { return _name; }
        }
        public string description
        {
            set
            {
                _des = value;
                FirePropertyChangedNotification("description");
            }
            get { return _des; }
        }

        public SomeClass()
        {
            name = "testName";
            description = "testDescription";
        }
    }
}
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / DataGridView обновить содержимое / 22 сообщений из 22, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]