DataViewManager и DataGrid
От: Аноним  
Дата: 18.03.03 15:52
Оценка:
Как я понял при создании DataViewManager для DataSet, генерится отдельный DataView для каждой таблицы. Вопрос в том как задать для этих сгенерированных DataView свойства AllowNew, AllowDelete.
Вопрос второй, можно ли автоматически привязать combobox на форме и одно из полей выбранной строки грида? Что бы не обновлять его самому при изменении текущей строки. Заранее благодарен за ответ!



22.12.03 18:00: Перенесено модератором из '.NET' — AVK
Re: DataViewManager и DataGrid
От: SCS  
Дата: 18.03.03 16:33
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Как я понял при создании 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.
Re[3]: DataViewManager и DataGrid
От: SCS  
Дата: 18.03.03 17:01
Оценка:
Здравствуйте, Аноним, Вы писали:
А>Получается что этот 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"]);

DataViewManager dvmClient = new DataViewManager(dataClient);
DataClient clientView = dvmClient.CreateDataView(dataClient.Tables["CLIENT"]); //??
clientView.AllowNew = false;

dataGridClients.SetDataBinding(dvmClient, "CLIENT"); //не работает свойство AllowNew = false!
dataGridClients.SetDataBinding(clientView, null); //Работает как первый вариант.

Видно я чего не допонимаю в этих DataViewManagerах и DataViewaх, пожалуйста приведи пример для связанных таблиц, что-бы по ним можно было навигировать, и при этом можно было выставлять разное свойство AllowNew.

По поводу BindingContext.
Не понятно к чему его привязывать в гриде, что бы по выбору новой строки — он обновлял combobox.
После установки DataBinding постоянно висит первый элемент.
Re[5]: DataViewManager и DataGrid
От: SCS  
Дата: 18.03.03 23:30
Оценка: 3 (1)
Здравствуйте, Аноним, Вы писали:

А>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'а
// первый привязываем к полю Фамилия из таблицы CLIENT
this.textBox1.DataBindings.Add("Text", dataClient.Tables["CLIENT"], "Фамилия");
// второй привязываем к полю ЦенаКлиента из таблицы CLIENTS_PRICE но не напрямую, а через Relation
this.textBox2.DataBindings.Add("Text", dataClient.Tables["CLIENT"], "Цены.ЦенаКлиента");

PS: чтобы всё синхронно изменялось должен быть один DataSource и настроены Relations между отображаемыми таблицами
SCS
Re[6]: DataViewManager и DataGrid
От: Barboska  
Дата: 19.03.03 07:23
Оценка:
Здравствуйте, 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 а вот как его связать с выбранной строкой в таблице?

И если есть ссылка, где об этом всем подробно почитать можно, желательно на русском, был бы премного благодарен.
Re[7]: DataViewManager и DataGrid
От: SCS  
Дата: 19.03.03 07:45
Оценка: 3 (1)
Здравствуйте, Barboska, Вы писали:
B>С первым вроде разобрались, большое спасибо.
B>Соотвественно можно для DefaultView устанавливать и RowFilter?
да, и RowFilter и Sort

B>По второму — такую привязку я делал, всегда высвечивается первый элемент таблиц.

B>Нутром чувствую нужно как-то настроить BindingContext а вот как его связать с выбранной строкой в таблице?
еще раз внимательно посмотри на свой код
dataGridClients.SetDataBinding(dataClient.Tables["CLIENT"], null); 
textBox1.DataBindings.Add("Text", dataClient.Tables["CLIENT"], "Фамилия");
textBox2.DataBindings.Add("Text", dataClient.Tables["CLIENT"], "Цены.ЦенаКлиента");

DataSource должен быть одним и тем же. всю синхронизацию выполняет CurrencyManager — при изменении текущей строки в grid автоматом поменяет text в bind контролах.
SCS
Re[8]: DataViewManager и DataGrid
От: Barboska  
Дата: 19.03.03 08:15
Оценка:
Здравствуйте, SCS, Вы писали:

SCS>Здравствуйте, Barboska, Вы писали:

B>>С первым вроде разобрались, большое спасибо.
B>>Соотвественно можно для DefaultView устанавливать и RowFilter?
SCS>да, и RowFilter и Sort

B>>По второму — такую привязку я делал, всегда высвечивается первый элемент таблиц.

B>>Нутром чувствую нужно как-то настроить BindingContext а вот как его связать с выбранной строкой в таблице?
SCS>еще раз внимательно посмотри на свой код
SCS>
SCS>dataGridClients.SetDataBinding(dataClient.Tables["CLIENT"], null); 
SCS>textBox1.DataBindings.Add("Text", dataClient.Tables["CLIENT"], "Фамилия");
SCS>textBox2.DataBindings.Add("Text", dataClient.Tables["CLIENT"], "Цены.ЦенаКлиента");
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; //А при переходе в дочернюю таблицу можно добавлять столбцы!
Re[9]: DataViewManager и DataGrid
От: SCS  
Дата: 19.03.03 09:09
Оценка: 3 (1)
Здравствуйте, 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;
  }
}

проверил, вроде мин нет
SCS
Re[10]: В продолжение темы.
От: Barboska  
Дата: 21.03.03 12:29
Оценка:
Здравствуйте, SCS, Вы писали:

Все отлично работает.
Теперь есть такая проблема.
Пусть привязано через DataBinding к TextBox какое-то поле таблицы.
Как при изменении значения TextBox обновить сам DataSet вручную и сохранить в БД.
А то я как заметил обновление происходит автоматически только при переключении строки в гриде.
Может быть есть другое решение этой проблемы.
Заранее спасибо за ответ.
Re[11]: В продолжение темы.
От: SCS  
Дата: 21.03.03 12:43
Оценка: 3 (1)
Здравствуйте, Barboska, Вы писали:

B>Теперь есть такая проблема.

B>Пусть привязано через DataBinding к TextBox какое-то поле таблицы.
B>Как при изменении значения TextBox обновить сам DataSet вручную и сохранить в БД.
B>А то я как заметил обновление происходит автоматически только при переключении строки в гриде.

реально при изменении CurrencyManager.Position

B>Может быть есть другое решение этой проблемы.


через тотже CurrencyManager:
CurrencyManager.EndCurrentEdit();    // сохранить изменения из всех bind контролов для этого mngr
CurrencyManager.CancelCurrentEdit(); // наоборот
SCS
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.