Модераторы: gambit, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> DataGridView, Привязка BindingList 
:(
    Опции темы
Jlekc
Дата 28.5.2008, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 520
Регистрация: 10.2.2005
Где: Leopolis

Репутация: нет
Всего: 4



Собстно в чем проблема:
К Гриду привязана колекция, с возможностью модификации. Но изменения могут приходить не только от даного грида, но быть вызваны стороними процесами.
Как заставить обновить отображение объектов в грид?

Для примера: добавил 2 кнопки, по кнопки Edit, редактируеться запись, но обновление происходит только при принудительной прорисовке грида, или при обновление Биндера.

Подписываться на все объекты колекции, чтоб вызвать обновление грида, както тупо.

Предполагаю что есть способы красивее, например релизовать в моих объектах интерфейс, кой прослушивает грид.
Или проставить атрибуты над полями, кстати ставил [Bindable(BindableSupport.Yes)]public int Value {} непонял када он срабатывает и када его использовать.
Мож кто может подсказать как реализовать обновление??

Код

public partial class Test : Form
    {

        DataGridView grid;
        Button buttonAdd;
        Button buttonEdit;

        public Test()
        {

            grid = new DataGridView();
            grid.Dock = DockStyle.Top;
            this.Controls.Add(this.grid);
            
            //  simple initialize
            Item.AddItem(new Item() { Name = "name", Value = 0 });

            this.grid.DataSource = new BindingList<Item>(Item.WorkedItems);

            this.buttonAdd = new Button();
            this.buttonAdd.Text = "Add";
            this.buttonAdd.Dock = DockStyle.Bottom;
            this.Controls.Add(this.buttonAdd);
            this.buttonAdd.Click += delegate
            {
                Item.AddItem(
                    new Item()
                    {
                        Name = "name" + Item.WorkedItems.Count,
                        Value = Item.WorkedItems.Count
                    });
                // Принудительное обновление
                CurrencyManager man = (CurrencyManager)this.grid.BindingContext[this.grid.DataSource];
                man.Refresh();
            };


            this.buttonEdit = new Button();
            this.buttonEdit.Text = "Edit";
            this.buttonEdit.Dock = DockStyle.Bottom;
            this.Controls.Add(this.buttonEdit);
            this.buttonEdit.Click += delegate
            {
                Item item = Item.WorkedItems[0];
                item.Value++;

                // Принудительное обновление
                //CurrencyManager man = (CurrencyManager)this.grid.BindingContext[this.grid.DataSource];
                //man.Refresh();
            };
        }

        class Item : INotifyPropertyChanging
        {
            string m_name;
            int m_value;
            public string Name 
            {
                get { return this.m_name; }
                set
                {
                    this.m_name = value;
                    if (PropertyChanging != null)
                        PropertyChanging(this, new PropertyChangingEventArgs("Name"));
                }
            }
            public int Value 
            {
                get { return this.m_value; }
                set
                {
                    this.m_value = value;
                    if (PropertyChanging != null)
                        PropertyChanging(this, new PropertyChangingEventArgs("Value"));
                }
            }


            static List<Item> s_workedItem;
            public static IList<Item> WorkedItems
            {
                get
                {
                    if (s_workedItem == null)
                    {
                        s_workedItem = new List<Item>();
                    }
                    return s_workedItem;
                }
            }
            public static void AddItem(Item item)
            {
                WorkedItems.Add(item);
            }


            #region INotifyPropertyChanging Members

            public event PropertyChangingEventHandler PropertyChanging;

            #endregion
        }
    }


Добавлено через 14 минут и 14 секунд
млин, вопрос снят
тестировал, реализовал INotifyPropertyChanging, не реализовал INotifyPropertyChanged


--------------------
PM MAIL ICQ   Вверх
Jlekc
Дата 28.5.2008, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 520
Регистрация: 10.2.2005
Где: Leopolis

Репутация: нет
Всего: 4



так, вопрос еще не снят
С обновлением объектов разобрался. 
А если изменения происходит в самой колекции (добавление/удаление) ?
Колекция может об этом сообщать(реализация своих событий), но должны быть стандартные интерфейсы оповешения??


--------------------
PM MAIL ICQ   Вверх
zxsanny
Дата 16.11.2010, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 12.7.2010

Репутация: нет
Всего: нет



Мда, 2 года уже прошло.... но отвечу
Код

    class MyModel
    {
        public string Name { get; set; }
        public string Description { get; set; }
        public int Value { get; set; }
    }
//...
        var list = new BindingList<MyModel>
    
// Скорее всего где то на форме
        var dg = new DataGridView();
        dg.DataSource = list;
        list.ListChanged +=new ListChangedEventHandler(list_ListChanged);

//....    

    void list_ListChanged(object sender, ListChangedEventArgs e)
    {
      ((CurrencyManager)(dg.BindingContext[list])).Refresh();
    }
    }

То есть в принципе тоже самое что и выше, но чуть проще


Это сообщение отредактировал(а) zxsanny - 16.11.2010, 22:18
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




[ Время генерации скрипта: 0.1117 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.