У меня возникают трудности с обновлением элементов управления форм Windows, использующих объект BindingSource. У нас есть клиент CAB/MVP/SCSF, который я (на самом деле «мы», поскольку это работа команды) разрабатываю, который будет взаимодействовать со службами WCF, работающими на удаленном сервере. (Это наша первая попытка, поэтому мы находимся в режиме обучения). Один из вызовов (от презентатора) к службе возвращает набор данных, который содержит 3 таблицы данных с именами «Контракт», «Ссуда» и «Условия». Каждая таблица содержит только одну строку. Когда служба возвращает набор данных, мы сохраняем его в SmartPart/View в переменной-члене класса, вызывая в представлении функцию BindData() и передавая набор данных в представление из класса презентатора;
private System.Data.DataSet _ds = null;
public void BindData(System.Data.DataSet ds)
{
string sErr = "";
try
{
_ds = ds; // save to private member variable
// more code goes down here
}
}
Мы пытаемся связать каждый из трех DataTables с набором текстовых полей Windows Forms, MaskedEditBox и раскрывающихся списков Infragistics UltraComboEditor. Мы создали три объекта BindingSource, по одному для каждого DataTable, используя IDE VS2008.
private System.Windows.Forms.BindingSource bindsrcContract;
private System.Windows.Forms.BindingSource bindsrcLoan;
private System.Windows.Forms.BindingSource bindsrcTerms;
Мы привязываем такие значения
if (bindsrcContract.DataSource == null)
{
bindsrcContract.DataSource = _ds;
bindsrcContract.DataMember = “contract”;
txtContract.DataBindings.Add(new Binding("Text", bindsrcContract, "contract_id", true));
txtLateFeeAmt.DataBindings.Add(new Binding("Text", bindsrcContract, "fee_code", true));
txtPrePayPenalty.DataBindings.Add(new Binding("Text", bindsrcContract, "prepay_penalty", true));
txtLateFeeDays.DataBindings.Add(new Binding("Text", bindsrcContract, "late_days", true));
}
if (bindsrcLoan.DataSource == null)
{
bindsrcLoan.DataSource = _ds;
bindsrcLoan.DataMember = “loan”;
mskRecvDate.DataBindings.Add(new Binding("Text", bindsrcLoan, "receive_date", true));
cmboDocsRcvd.DataBindings.Add(new Binding("Value", bindsrcLoan, "docs", true));
}
Это работает, когда мы делаем первое чтение из службы и возвращаем набор данных. Информация отображается в элементах управления формы, мы можем обновить ее с помощью формы, а затем «сохранить», передав измененные значения обратно в службу WCF.
Вот наша проблема. Если мы выберем другой ключ кредита и сделаем тот же вызов службы и получим новый набор данных, опять же с 3 таблицами с одной строкой в каждой, элементы управления (текстовые поля, маскированные поля редактирования и т. д.) не будут обновляться с новой информацией . Обратите внимание, что smartPart/View не закрывается или что-то еще, а остается загруженным между вызовами службы. При втором вызове мы не перепривязываем вызовы, а просто пытаемся обновить данные из обновленного набора данных.
Мы перепробовали все, что могли придумать, но явно чего-то не хватает. Это наша первая попытка использовать элемент управления BindingSource. мы пробовали
bindsrcContract.ResetBindings(false);
и
bindsrcContract.ResetBindings(true);
и
bindsrcContract.RaiseListChangedEvents = true;
и
for (int i = 0; i < bindsrcContract.Count; i++)
{
bindsrcContract.ResetItem(i);
}
А также повторный сброс свойства DataMember.
bindsrcContract.DataMember = ”Contract”;
Мы рассмотрели множество примеров. Многие примеры ссылаются на BindingNavigator, но, поскольку DataTables имеют только одну строку, мы не думали, что нам это нужно. Есть много примеров для сеток, но мы не используем их здесь. Может ли кто-нибудь указать, где мы ошибаемся, или указать нам ресурсы, которые предоставят дополнительную информацию?
Мы используем VisualStudio 2008, C# и .Net 2.0, клиент XP, сервер W2K3.
заранее спасибо
Уэс