Как я понял при создании DataViewManager для DataSet, генерится отдельный DataView для каждой таблицы. Вопрос в том как задать для этих сгенерированных DataView свойства AllowNew, AllowDelete.
Вопрос второй, можно ли автоматически привязать combobox на форме и одно из полей выбранной строки грида? Что бы не обновлять его самому при изменении текущей строки. Заранее благодарен за ответ!
22.12.03 18:00: Перенесено модератором из '.NET' — AVK
Здравствуйте, Аноним, Вы писали:
А>Как я понял при создании DataViewManager для DataSet, генерится отдельный DataView для каждой таблицы. Вопрос в том как задать для этих сгенерированных DataView свойства AllowNew, AllowDelete.
что значит генерится ? там появляется только DataViewSetting для каждой таблицы.
а вот когда сам вызывашь метод CreateDataView то и в полученном DataView выставляешь все необходимые св-ва.
А>Вопрос второй, можно ли автоматически привязать combobox на форме и одно из полей выбранной строки грида? Что бы не обновлять его самому при изменении текущей строки. Заранее благодарен за ответ!
через BindingContext
SCS
Re[2]: DataViewManager и DataGrid
От:
Аноним
Дата:
18.03.03 16:48
Оценка:
Здравствуйте, SCS, Вы писали:
SCS>Здравствуйте, Аноним, Вы писали:
А>>Как я понял при создании DataViewManager для DataSet, генерится отдельный DataView для каждой таблицы. Вопрос в том как задать для этих сгенерированных DataView свойства AllowNew, AllowDelete. SCS>что значит генерится ? там появляется только DataViewSetting для каждой таблицы. SCS>а вот когда сам вызывашь метод CreateDataView то и в полученном DataView выставляешь все необходимые св-ва.
А>>Вопрос второй, можно ли автоматически привязать combobox на форме и одно из полей выбранной строки грида? Что бы не обновлять его самому при изменении текущей строки. Заранее благодарен за ответ! SCS>через BindingContext
Получается что этот DataView будет иметь общие свойства для всех связанных таблиц.
А как задать разные параметры AllowNew, AllowDelete для двух связанных таблиц, отображаемых в одном DataGrid.
Можно пример для BindingContext через обработчик CurrentCellChanged.
Здравствуйте, Аноним, Вы писали: А>Получается что этот DataView будет иметь общие свойства для всех связанных таблиц.
для каждой таблицы ты сам в программе создаешь свой view (если оно тебе надо). и свой-ва будут наследоваться для каждого view свои из DataViewSetting (если делать через DataViewManager.CreateDataView).
А>А как задать разные параметры AllowNew, AllowDelete для двух связанных таблиц, отображаемых в одном DataGrid.
через свой DataView или DefaultView А>Можно пример для BindingContext через обработчик CurrentCellChanged.
просто привязывай поле таблицы к соответссвующему Property (например ComboBox.Text)
оно само разберется когда что менять через CurrencyManager
SCS
Re[4]: DataViewManager и DataGrid
От:
Аноним
Дата:
18.03.03 19:40
Оценка:
Здравствуйте, SCS, Вы писали:
SCS>Здравствуйте, Аноним, Вы писали: А>>Получается что этот DataView будет иметь общие свойства для всех связанных таблиц. SCS>для каждой таблицы ты сам в программе создаешь свой view (если оно тебе надо). и свой-ва будут наследоваться для каждого view свои из DataViewSetting (если делать через DataViewManager.CreateDataView).
А>>А как задать разные параметры AllowNew, AllowDelete для двух связанных таблиц, отображаемых в одном DataGrid. SCS>через свой DataView или DefaultView А>>Можно пример для BindingContext через обработчик CurrentCellChanged. SCS> SCS>просто привязывай поле таблицы к соответссвующему Property (например ComboBox.Text) SCS>оно само разберется когда что менять через CurrencyManager
Вариант 1.
DataSet dataClient;
Заполняем dataClient через адаптер...
Проставляем связи
dataClient.Relations.Add("Цены", dataClient.Tables["CLIENT"].Columns["Ccode"], dataClient.Tables["CLIENTS_PRICE"].Columns["Ccode"]);
DataView clientView = new DataView (dataClient.Tables["CLIENT"]);
clientView.AllowNew = false;
dataGridClients.SetDataBinding(clientView, null);
Все таблицы в гриде отображаются по свойствам clientView.
Вариант 2.
DataSet dataClient;
Заполняем dataClient через адаптер...
Проставляем связи
dataClient.Relations.Add("Цены", dataClient.Tables["CLIENT"].Columns["Ccode"], dataClient.Tables["CLIENTS_PRICE"].Columns["Ccode"]);
dataGridClients.SetDataBinding(dvmClient, "CLIENT"); //не работает свойство AllowNew = false!
dataGridClients.SetDataBinding(clientView, null); //Работает как первый вариант.
Видно я чего не допонимаю в этих DataViewManagerах и DataViewaх, пожалуйста приведи пример для связанных таблиц, что-бы по ним можно было навигировать, и при этом можно было выставлять разное свойство AllowNew.
По поводу BindingContext.
Не понятно к чему его привязывать в гриде, что бы по выбору новой строки — он обновлял combobox.
После установки DataBinding постоянно висит первый элемент.
Здравствуйте, Аноним, Вы писали:
А>DataSet dataClient; А>Заполняем dataClient через адаптер...
далее, на мой взгляд, примерно так:
dataClient.Relations.Add("Цены", dataClient.Tables["CLIENT"].Columns["Ccode"], dataClient.Tables["CLIENTS_PRICE"].Columns["Ccode"]);
...
dataClient.EnforceConstraints=true;
dataGridClients.SetDataBinding(dataClient.Tables["CLIENT"], null);
// установи права на изменения через DefaultView таблиц
dataClient.Tables["CLIENT"].DefaultView.AllowNew=false;
dataClient.Tables["CLIENT_PRICE"].DefaultView.AllowDelete=false;
// на форме есть 2 TextBox'а
// первый привязываем к полю Фамилия из таблицы CLIENTthis.textBox1.DataBindings.Add("Text", dataClient.Tables["CLIENT"], "Фамилия");
// второй привязываем к полю ЦенаКлиента из таблицы CLIENTS_PRICE но не напрямую, а через Relationthis.textBox2.DataBindings.Add("Text", dataClient.Tables["CLIENT"], "Цены.ЦенаКлиента");
PS: чтобы всё синхронно изменялось должен быть один DataSource и настроены Relations между отображаемыми таблицами
Здравствуйте, SCS, Вы писали:
SCS>Здравствуйте, Аноним, Вы писали:
А>>DataSet dataClient; А>>Заполняем dataClient через адаптер... SCS>далее, на мой взгляд, примерно так: SCS>
SCS>dataClient.Relations.Add("Цены", dataClient.Tables["CLIENT"].Columns["Ccode"], dataClient.Tables["CLIENTS_PRICE"].Columns["Ccode"]);
SCS>...
SCS>dataClient.EnforceConstraints=true;
SCS>dataGridClients.SetDataBinding(dataClient.Tables["CLIENT"], null);
SCS>// установи права на изменения через DefaultView таблиц
SCS>dataClient.Tables["CLIENT"].DefaultView.AllowNew=false;
SCS>dataClient.Tables["CLIENT_PRICE"].DefaultView.AllowDelete=false;
SCS>// на форме есть 2 TextBox'а
SCS>// первый привязываем к полю Фамилия из таблицы CLIENT
SCS>this.textBox1.DataBindings.Add("Text", dataClient.Tables["CLIENT"], "Фамилия");
SCS>// второй привязываем к полю ЦенаКлиента из таблицы CLIENTS_PRICE но не напрямую, а через Relation
SCS>this.textBox2.DataBindings.Add("Text", dataClient.Tables["CLIENT"], "Цены.ЦенаКлиента");
SCS>
SCS>PS: чтобы всё синхронно изменялось должен быть один DataSource и настроены Relations между отображаемыми таблицами
С первым вроде разобрались, большое спасибо.
Соотвественно можно для DefaultView устанавливать и RowFilter?
По второму — такую привязку я делал, всегда высвечивается первый элемент таблиц.
Нутром чувствую нужно как-то настроить BindingContext а вот как его связать с выбранной строкой в таблице?
И если есть ссылка, где об этом всем подробно почитать можно, желательно на русском, был бы премного благодарен.
Здравствуйте, Barboska, Вы писали: B>С первым вроде разобрались, большое спасибо. B>Соотвественно можно для DefaultView устанавливать и RowFilter?
да, и RowFilter и Sort
B>По второму — такую привязку я делал, всегда высвечивается первый элемент таблиц. B>Нутром чувствую нужно как-то настроить BindingContext а вот как его связать с выбранной строкой в таблице?
еще раз внимательно посмотри на свой код
DataSource должен быть одним и тем же. всю синхронизацию выполняет CurrencyManager — при изменении текущей строки в grid автоматом поменяет text в bind контролах.
Здравствуйте, SCS, Вы писали:
SCS>Здравствуйте, Barboska, Вы писали: B>>С первым вроде разобрались, большое спасибо. B>>Соотвественно можно для DefaultView устанавливать и RowFilter? SCS>да, и RowFilter и Sort
B>>По второму — такую привязку я делал, всегда высвечивается первый элемент таблиц. B>>Нутром чувствую нужно как-то настроить BindingContext а вот как его связать с выбранной строкой в таблице? SCS>еще раз внимательно посмотри на свой код SCS>
SCS>DataSource должен быть одним и тем же. всю синхронизацию выполняет CurrencyManager — при изменении текущей строки в grid автоматом поменяет text в bind контролах.
Сработало, спасибо. А я вручную события отслеживал даже сортировку на MouseUp.
Знание — сила! Вопрос такой, где можно почитать про этот CurrencyManager. и вообще про DataSet и DataGrid.
Почему-то такой код не работает
...
dataClient.Relations.Add("Цены", dataClient.Tables["CLIENT"].Columns["Ccode"],
dataClient.Tables["CLIENTS_PRICE"].Columns["Ccode"]);
dataClient.EnforceConstraints = true;
dataGridClients.SetDataBinding(dataClient.Tables["CLIENT"], null);
dataClient.Tables["CLIENT"].DefaultView.AllowNew = false; //Здесь все нормально!
dataClient.Tables["CLIENTS_PRICE"].DefaultView.AllowNew = false; //А при переходе в дочернюю таблицу можно добавлять столбцы!
Здравствуйте, Barboska, Вы писали:
B>dataGridClients.SetDataBinding(dataClient.Tables["CLIENT"], null); B>dataClient.Tables["CLIENT"].DefaultView.AllowNew = false; //Здесь все нормально! B>dataClient.Tables["CLIENTS_PRICE"].DefaultView.AllowNew = false; //А при переходе в дочернюю таблицу можно добавлять столбцы!
...строки — это связано стем что для дочерних таблиц DataView создаются динамически при каждом новом показе
выход такой — обрабатывать событие Navigate в grid'e
private void dataGrid1_Navigate(object sender, System.Windows.Forms.NavigateEventArgs ne)
{ // запрашиваешь CurrencyManager для текущего bindig'a в grid'e
CurrencyManager cm=(CurrencyManager)(this.dataGrid1.BindingContext[this.dataGrid1.DataSource, this.dataGrid1.DataMember]);
// у CurrencyManager узнаем тот DataView, который он отрабатывает в текущий момент (куда идет навигация)
DataView dv=(DataView)(cm.List);
switch(dv.Table.TableName)
{ case"CLIENT":
dv.AllowNew=false;
...
break;
case"CLIENT_PRICE":
dv.AllowNew=false;
...
break;
}
}
Все отлично работает.
Теперь есть такая проблема.
Пусть привязано через DataBinding к TextBox какое-то поле таблицы.
Как при изменении значения TextBox обновить сам DataSet вручную и сохранить в БД.
А то я как заметил обновление происходит автоматически только при переключении строки в гриде.
Может быть есть другое решение этой проблемы.
Заранее спасибо за ответ.
Здравствуйте, Barboska, Вы писали:
B>Теперь есть такая проблема. B>Пусть привязано через DataBinding к TextBox какое-то поле таблицы. B>Как при изменении значения TextBox обновить сам DataSet вручную и сохранить в БД. B>А то я как заметил обновление происходит автоматически только при переключении строки в гриде.
реально при изменении CurrencyManager.Position
B>Может быть есть другое решение этой проблемы.
через тотже CurrencyManager:
CurrencyManager.EndCurrentEdit(); // сохранить изменения из всех bind контролов для этого mngr
CurrencyManager.CancelCurrentEdit(); // наоборот