WinForms: вопрос по Binding
От: MirrorBoy  
Дата: 29.03.04 18:03
Оценка:
К сожалению, в Binding я еще чайник
и вопрос соответствующий

Подключаю таблицу из DataSet-а к DataGrid-у и отдельное поле таблицы к textBox-у
В дизайнтайме.
Запускаю программу.
Все отображается нормальною. Хожу по гриду, в textBox отображается значение поля из ТЕКУЩЕЙ записи
Создаю вторую форму и кидаю на нее textBox.
Хочу в нем видеть тоже самое что и в предыдущем textBox
Для этого я беру строку подсоединения, сформированную дизайнером, слегка ее правлю, чтобы видеть из Формы2 Форму1.
Вот что получилось:

this.textBox1.DataBindings.Add(new System.Windows.Forms.Binding("Text", Form1.form1.dataSet11, "Orders.CustomerID"));

Запускаю.
Хожу по гриду. В textBox на Форме1 отображается значение поля из ТЕКУЩЕЙ записи. А в textBox на Форме2 отображается значение поля из ПЕРВОЙ записи.
И хождение по гриду никак не влияет на выводимое значение

Что я делаю не так?
Я пока еще не до конца понимаю принцип Binding. Где можно почитать что-нибудь по этому поводу? Желательно по-русски.

Спасибо

31.03.04 11:41: Перенесено модератором из '.NET' — AVK
Re: WinForms: вопрос по Binding
От: Ael США  
Дата: 29.03.04 22:48
Оценка: 1 (1)

//Мне кажется, лучше всего про Binding написано в MSDN
        //(а вот по-русски даже не знаю)
        // вот пример 
        //ЕСТЬ типизированный DataSet ds,
        //DataAdaper da (запрос "SELECT CompanyName FROM Customers" БАЗА ДАННЫХ Notrhwind ),
        //TextBox txt, DataGrid grd;
       CurrencyManager cm,cm1;
        private void Form1_Load(object sender, System.EventArgs e)
        {
            //НАПОЛНЯЕМ DATASET ИЗ БАЗЫ ДАННЫХ
            this.da.Fill(this.ds);
           //СВЯЗЫВАЕМ TEXTBOX НА ГЛАВНОЙ ФОРМЕ
            txt.DataBindings.Add("Text",this.ds.Customers,"CompanyName");
            //СВЯЗЫВАЕМ DATAGRID НА ГЛАВНОЙ ФОРМЕ
            this.grd.DataSource=this.ds.Customers;
             //СОЗДАЕМ ДРУГУЮ ФОРМУ
            Form frm=new Form();
            //СОЗДАЕМ НА ДРУГОЙ ФОРМЕ TEXTBOX И СВЯЗЫВАЕМ ЕГО
            TextBox    txt1=new TextBox();
            txt1.DataBindings.Add("Text",this.ds.Customers,"CompanyName");
            txt1.Parent=frm;
            //ПОКАЗЫВАЕМ ВТОРУЮ ФОРМУ
            frm.Show();
            //САМОЕ ГЛАВНОЕ:
            //ПОЛУЧАЕМ CURRENCYMANAGER ДЛЯ ГЛАВНОЙ ФОРМЫ
            cm=(CurrencyManager)this.BindingContext[this.ds.Customers];
             //ПОЛУЧАЕМ CURRENCYMANAGER ДЛЯ ВТОРОЙ ФОРМЫ
            cm1=(CurrencyManager)frm.BindingContext[this.ds.Customers];  
             //ПОДПИСЫВАЕМСЯ НА СОБЫТИЕ ДЛЯ CURRENCYMANAGER ГЛАВНОЙ ФОРМЫ
            cm.PositionChanged+=new EventHandler(cm_PositionChanged);
        }

    
        private void cm_PositionChanged(object sender, EventArgs e)
        {
            //ТАКИМ ОБРАЗОМ СИНХРОНИЗИРУЕМ НАШИ ДВА CURRENCYMANAGER
            cm1.Position=((CurrencyManager)sender).Position;
        }
Re[2]: WinForms: вопрос по Binding
От: MirrorBoy  
Дата: 31.03.04 20:55
Оценка:
Все заработало
Спасибо огромное

Теперь попытаюсь кратко указать на свои ошибки:
1.
Я писал так:
this.textBox1.DataBindings.Add("Text", Form1.form1.dataSet11, "Orders.CustomerID");

А нужно было писать так:
this.textBox1.DataBindings.Add("Text", Form1.form1.dataSet11.Orders, "CustomerID");

Причем, первый вариант генерится дизайнером. И он работает неправильно.
Не понятно, для чего так сделано

2.
Поскольку я хочу отображать значение в ДРУГОЙ форме, нужно синхронизировать CurrencyManager этих форм.

Для этого и был реализован механизм подписки на событие PositionChanged
Ael>
Ael>            //САМОЕ ГЛАВНОЕ:
Ael>            //ПОЛУЧАЕМ CURRENCYMANAGER ДЛЯ ГЛАВНОЙ ФОРМЫ
Ael>            cm=(CurrencyManager)this.BindingContext[this.ds.Customers];
Ael>             //ПОЛУЧАЕМ CURRENCYMANAGER ДЛЯ ВТОРОЙ ФОРМЫ
Ael>            cm1=(CurrencyManager)frm.BindingContext[this.ds.Customers];  
Ael>             //ПОДПИСЫВАЕМСЯ НА СОБЫТИЕ ДЛЯ CURRENCYMANAGER ГЛАВНОЙ ФОРМЫ
Ael>            cm.PositionChanged+=new EventHandler(cm_PositionChanged);
Ael>        }
    
Ael>        private void cm_PositionChanged(object sender, EventArgs e)
Ael>        {
Ael>            //ТАКИМ ОБРАЗОМ СИНХРОНИЗИРУЕМ НАШИ ДВА CURRENCYMANAGER
Ael>            cm1.Position=((CurrencyManager)sender).Position;
Ael>        }
Ael>


Еще раз благодарю Ael за ответ
Re[3]: WinForms: вопрос по Binding
От: Smarty Россия  
Дата: 31.03.04 21:36
Оценка:
MB>Теперь попытаюсь кратко указать на свои ошибки:
MB>1.
MB>Я писал так:
MB>this.textBox1.DataBindings.Add("Text", Form1.form1.dataSet11, "Orders.CustomerID");

MB>А нужно было писать так:

MB>this.textBox1.DataBindings.Add("Text", Form1.form1.dataSet11.Orders, "CustomerID");
Короче — вот(копирайт не мой, ессесно):
// 1. Bind to data set + table.column (good!) — это как раз вариант 1 выше
textBox1.DataBindings.Add(Text", customerSet1, "Customers.ContactTitleName");

// 2. Bind the table + column (BAD!) — а это как раз вариант 2 выше
textBox1.DataBindings.Add("Text", customerSet1.Customers, "ContactTitleName");

Although both techniques of binding to a column seem to display equivalent results, there is an "issue" in .NET 1.x that causes inconsistencies if you mix the two methods. The reason to always use technique 1 (data set + table.column) is that the Designer-generated code uses this technique when you choose a data member in the Property Browser.

Короче — непрекрытая агитация за вариант 1.
Re[4]: WinForms: вопрос по Binding
От: MirrorBoy  
Дата: 01.04.04 15:37
Оценка:
Если эти методы эквивалентны, почему же первый не работает?

И где можно почитать об этом?
В частности, можно ссылочку на статью, из которой была цитата?
Re[5]: WinForms: вопрос по Binding
От: Smarty Россия  
Дата: 01.04.04 21:53
Оценка:
Здравствуйте, MirrorBoy, Вы писали:

MB>Если эти методы эквивалентны, почему же первый не работает?


Так а никто не говорил, что он не будет работать. Обещены лишь проблемы при СМЕШИВАНИИ этих стилей. А поскольку кодогенератор VS заточен под вар.1 у нас практически не остается выбора.

MB>И где можно почитать об этом?

MB>В частности, можно ссылочку на статью, из которой была цитата?

Это набрано мной из книги(бумажной) "Windows Forms Programming in C#". Автор — C.Sells
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.