К сожалению, в Binding я еще чайник
и вопрос соответствующий
Подключаю таблицу из DataSet-а к DataGrid-у и отдельное поле таблицы к textBox-у
В дизайнтайме.
Запускаю программу.
Все отображается нормальною. Хожу по гриду, в textBox отображается значение поля из ТЕКУЩЕЙ записи
Создаю вторую форму и кидаю на нее textBox.
Хочу в нем видеть тоже самое что и в предыдущем textBox
Для этого я беру строку подсоединения, сформированную дизайнером, слегка ее правлю, чтобы видеть из Формы2 Форму1.
Вот что получилось:
Запускаю.
Хожу по гриду. В textBox на Форме1 отображается значение поля из ТЕКУЩЕЙ записи. А в textBox на Форме2 отображается значение поля из ПЕРВОЙ записи.
И хождение по гриду никак не влияет на выводимое значение
Что я делаю не так?
Я пока еще не до конца понимаю принцип Binding. Где можно почитать что-нибудь по этому поводу? Желательно по-русски.
Спасибо
31.03.04 11:41: Перенесено модератором из '.NET' — AVK
//Мне кажется, лучше всего про 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;
}
Теперь попытаюсь кратко указать на свои ошибки:
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>
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.
Здравствуйте, MirrorBoy, Вы писали:
MB>Если эти методы эквивалентны, почему же первый не работает?
Так а никто не говорил, что он не будет работать. Обещены лишь проблемы при СМЕШИВАНИИ этих стилей. А поскольку кодогенератор VS заточен под вар.1 у нас практически не остается выбора.
MB>И где можно почитать об этом? MB>В частности, можно ссылочку на статью, из которой была цитата?
Это набрано мной из книги(бумажной) "Windows Forms Programming in C#". Автор — C.Sells