У меня возникают проблемы при обновлении элементов управления форм 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
}
}
Мы пытаемся связать каждую из трех таблиц DataTable с набором текстовых ящиков 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.
Вот наша проблема. Если мы выберем другой ключ ссуды и сделаем тот же вызов службе и получим новый DataSet, снова с 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.
Заранее спасибо
Уэс