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


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

Для примера: добавил 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

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

Автор: zxsanny 16.11.2010, 22:14
Мда, 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();
    }
    }

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

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