Связывание флажка.Проверено свойство свойства в DataSet

78
8

Среда: Visual Studio 2010,.NET 4.0, WinForms


У меня есть DataSet, который реализует INotifyPropertyChanged и создал свойство bool на DataSet. Я пытаюсь связать свойство CheckBox.Checked с этим свойством bool. Когда я пытаюсь сделать это в дизайнере, я вижу DataSet и таблицы в DataSet, но не свойство. Я попытался сделать это вручную, но получаю ошибку, что свойство не найдено. Единственное, что я вижу, что я делаю, это свойство в форме - это суперкласс класса DataSet, который создается, но я даже не вижу, как это повлияет на что-либо. Ниже приведен фрагмент кода.


Определение производного класса


public class DerivedDataSetClass: SuperDataSetClass, INotifyPropertyChanged
{
private bool _mainFile = false;
public bool MainFile
{
get { return this._mainFile; }
set {
this._mainFile = value;
this.NotifyPropertyChanged("MainFile");
}
}
}

Определение свойства


private SuperDataSetClass _dataSet;
public DerivedDataSetClass DataSet
{
get { return (DerivedDataSetClass)_dataSet;
}

CTOR


this._DataSet = new DerivedDataSetClass (this);

this.mainFileBindingSource = new BindingSource();
this.mainFileBindingSource.DataSource = typeof(DerivedDataSetClass);
this.mainFileBindingSource.DataMember = "MainFile";

var binding = new Binding("Checked", this.mainFileBindingSource, "MainFile");
this.chkMainFile.DataBindings.Add(binding);


Мысли?

спросил(а) 2021-01-19T16:46:04+03:00 6 месяцев, 1 неделя назад
1
Решение
79

Проблемы возникают непосредственно из того, как вы хотите использовать DerivedDataSetClass. Поскольку это DataSet, любая привязка сделана, будет использоваться по умолчанию DataViewManager, которая "подталкивает" привязку далее к Tables.


Когда вы привязываетесь к свойству DerivedDataSet MainFile, то, что делается под капотом, является попыткой привязать к таблице с именем MainFile в ваших таблицах набора данных. Конечно, это не удается, если у вас действительно нет такой таблицы в наборе данных. По той же причине вы не можете привязываться к какому-либо другому свойству базы DataSet - например. Locale или HasErrors - он также проверяет, такие таблицы существуют, а не свойства.


Каковы решения этой проблемы? Вы можете попробовать реализовать разные DataViewManager - однако я не смог найти надежные ресурсы по этой теме.


Я предлагаю создать простой класс-оболочку для вашего свойства MainFile и связанного с ним DerivedDataSetClass, например:


public class DerivedDataSetWrapper : INotifyPropertyChanged
{
private bool _mainFile;

public DerivedDataSetWrapper(DerivedDataSetClass dataSet)
{
this.DataSet = dataSet;
}

// I assume no notification will be needed upon DataSet change;
// hence auto-property here
public DerivedDataSetClass DataSet { get; private set; }

public bool MainFile
{
get { return this._mainFile; }
set
{
this._mainFile = value;
this.PropertyChanged(this, new PropertyChangedEventArgs("MainFile"));
}
}
}

Теперь вы можете привязать как к внутреннему содержимому набора данных (таблиц), так и к MainFile в вашем классе-оболочке.


var wrapper = new DerivedDataSetWrapper(this._DataSet);
BindingSource source = new BindingSource { DataSource = wrapper };

// to bind to checkbox we essentially bind to Wrapper.MainFile
checkBox.DataBindings.Add("Checked", source, "MainFile", false,
DataSourceUpdateMode.OnPropertyChanged);


Чтобы привязать данные из таблиц в наборе данных, вам необходимо привязать к свойству DerivedDataSetWrapper DataSet, а затем перемещаться по именам таблиц и столбцам. Например:


textBox.DataBindings.Add("Text", source, "DataSet.Items.Name");

... будет привязываться к таблице Items и столбцу Name в исходном _DataSet.

ответил(а) 2021-01-19T16:46:04+03:00 6 месяцев, 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема