Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Дата биндинг у собственного класса


Автор: Хоббит 24.6.2006, 17:46
Есть класс в нем есть некторое свойство с именм Field  //  как его забиндить с некотом полем таблицы или с обьетом DataBindingSource или  как это еще можно реализовать.

То есть типа как связываются контролы с таблицами, также связать свой класс и что бы все изменялось. 


 

Автор: Хоббит 25.6.2006, 09:55
ладно.... решаю вопрос сам.. может тогда создать свой обьект типа DataBindingSource который в конструкторе будет получать object (исходный обьект) string (имя поля обьекта) DataRow (имя строки с которой связываемся) string (имя поля таблицы)
Дальше подписываемся у обьекта на событие изменнения этого поля и на событие изменения этой строчки и синхронизируем их изменения....
Только вот опять же как по строковому имени свойства получить его и событие по которому оно меняется....???
помогите плз. 

Автор: arilou 25.6.2006, 10:49
Цитата(Хоббит @  25.6.2006,  09:55 Найти цитируемый пост)
Только вот опять же как по строковому имени свойства получить его и событие по которому оно меняется....???
помогите плз.  

Никак, если ты сам такое событие не реализуешь.  

Автор: mr.DUDA 25.6.2006, 11:30
Всё проще, чем кажется. Достаточно реализовать в своём объекте интерфейс IBindableComponent - и можно привязать его свойства (поля) к любому data source:

Код
using System;
using System.Data;
using System.Windows.Forms;

class Program
{
    static void Main(string[] args)
    {
        // создаём таблицу
        DataTable table = new DataTable();
        table.Columns.Add("Id", typeof(int));
        table.Columns.Add("Text", typeof(string));
        table.PrimaryKey = new DataColumn[] { table.Columns[0] };
        table.Rows.Add(1, string.Empty);

        // создаём объект
        TestObject obj = new TestObject();

        // привязка свойства "TheText" к полю таблицы
        obj.DataBindings.Add("TheText", table, "Text");

        // проверяем работу привязки
        table.Rows[0]["Text"] = "1234";
        Console.WriteLine("Row.Text = " + table.Rows[0]["Text"]);
        Console.WriteLine("obj.TheText = " + obj.TheText);

        // и наоборот
        obj.TheText = "5678";
        obj.BindingContext[table].EndCurrentEdit();
        Console.WriteLine("Row.Text = " + table.Rows[0]["Text"]);
        Console.WriteLine("obj.TheText = " + obj.TheText);
    }
}


/// <summary>
/// Тестовый класс, реализующий поддержку Data Bindings
/// </summary>
class TestObject : IBindableComponent
{
    private string theText = string.Empty;
    /// <summary>
    /// Свойство, которое можно будет биндить на data source
    /// </summary>
    public string TheText
    {
        get
        {
            return theText;
        }
        set
        {
            theText = value;
        }
    }

    /// <summary>
    /// Конструктор. Создаём BindingContext и коллекцию DataBindings
    /// </summary>
    public TestObject()
    {
        _context = new BindingContext();
        _bindings = new ControlBindingsCollection(this);
    }

    // ниже - простейшая реализация интерфейса IBindableComponent

    BindingContext _context;
    ControlBindingsCollection _bindings;
    public event EventHandler Disposed;

    public BindingContext BindingContext
    {
        get
        {
            return _context;
        }
        set
        {
            _context = value;
        }
    }

    public ControlBindingsCollection DataBindings
    {
        get
        {
            return _bindings;
        }
    }

    public System.ComponentModel.ISite Site
    {
        get
        {
            return null;
        }
        set
        {
        }
    }

    public void Dispose()
    {
    }
}
   

Автор: Хоббит 25.6.2006, 12:45
и вновь мистер ДУДА выручает в самый сложный момент ... респект ему!
Имеено это я и хотел узнать 

Автор: Хоббит 25.6.2006, 13:02
во.. в продолжении темы... а для семейства обьектов какой интерфейс реализовать .. чтобы он для датасоурца (типа таблицы) заполнился такими вот забиндеными компонентами .... или придется самому семейство заполнять связывает каждый элемент семейства со своей строчкой в таблице? 

Автор: Хоббит 25.6.2006, 14:52
то есть типа я в датагрид бросаю таблицу.. в нем появляются строки связанные с строками в источнике данных
также только с обьектом а не датагридом

Очень важно 

Автор: mr.DUDA 25.6.2006, 14:53
Хм... с семейством сложнее. Знаю, что наоборот можно работать (если в датасоурсе много элементов, а объект - один) с пом. класса CurrencyManager. Надо в мсдн-е порыться... 

Автор: Хоббит 25.6.2006, 16:55
ладно это я и сам смогу сделать ...
по изменению свойтсва датасоур перебрать его элементы и добавить  классы биндя с каждым элементом по отдельности... если датасоур нулл то стереть все из семейства.. 
 smile

будем изворачиваться 

Автор: Хоббит 27.6.2006, 10:41
Получилось сделать так.

Код

            private void LoadDataSource()
            {
                IList list = (dataSource as IListSource).GetList();
                for (int index = 0; index < list.Count; index++)
                {
                    Group group = new Group("");

                    group.DataBindings.Add(
                        new System.Windows.Forms.Binding("Name", dataSource, "Name"));
                                        
                    CurrencyManager currencyManager = (CurrencyManager)this.BindingContext[dataSource];
                    currencyManager.Position = index;                                        

                    this.Add(group);

                }
            }



метод выполняется по приходу датасоурца. Теперь осталось синхронизировать добавление и удаление элементов. Добавление в семейство можно отловить по методам семейства Add и Remove и в них соответственно изменить датасоурц(добавить строчку) а как быть с изменением в датасоурце (когда я в него добавляю строку я должен добавть обьект в семейство) как это отловить? 

Автор: Хоббит 28.6.2006, 14:57
назрел вопрос.. а что за интерфейс IList (для чего?)  и поочему мы вместо него возращаем null? 

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