Проводя эксперименты по проверке удобства использования WinForms и .NET 8 для преобразования устаревших проектов .NET 4.8, я столкнулся со своеобразными «слепыми пятнами»:
Кажется, что в пустой форме с TextBox и BindingSource (перетащенной из панели инструментов) нет способа установить привязку данных свойства TextBox «Text» к свойству экземпляра BindingSource (как это было раньше). с .NET 4.8).
Конечно, программно это все еще возможно, например.
this.textbox1.DataBindings.Add("Text", this.bsMain, "name");
(где «bsMain» — это имя BindingSource Form1), но это в первую очередь противоречит всей цели создания экземпляра BindingSource из панели инструментов.
Это все еще поддерживается/я что-то упускаю из виду?
Я попробовал это, но именованный элемент управления BindingSource формы (видимый в нижней части поверхности конструктора формы) (bsMain) просто не отображается как источник данных, который можно выбрать. Сам BindingSource на этом этапе разработки еще не подключен к какому-либо базовому источнику данных. Это может произойти только позже в оставшейся части Конструктора.
Как привязать элемент управления к источнику данных, у которого нет определенного источника, поэтому поля данных фактически не определены? Вам необходимо выбрать источник данных для вашего BindingSource. Может быть объектом класса. Как упоминалось ранее, он не обязательно должен содержать данные; как уже упоминалось, в этом случае для DataSource
установлено значение Type
, которое предоставляет поля данных, к которым вы привязываетесь. Данные могут быть установлены в любой момент после вызова InitializeComponent()
, поскольку именно тогда создаются компонент BindingSource и элементы управления.
Наш типичный сценарий — привязка данных к DataTable или DataView; Источник данных BindingSource для них устанавливается после вызова InitializeComponent(). Привязка данных в дизайнере тогда просто включает в себя настройку, например. Источник данных текстового поля и элемент данных для BindingSource, а также именованное (строковое) поле/столбец этого DataTable DataView. Это работает очень хорошо, сделать то же самое в .NET 8 в дизайнере кажется невозможным, но он использует код. Я просто не понимаю, почему дизайнер не покажет BindingSource формы как возможного кандидата на источник данных, как вы предложили.
Я не понимаю, как можно создать привязку, если нет определенного столбца данных, к которому можно привязать свойство элемента управления. Если у вас есть DataTable, я предполагаю, что вы используете типизированный DataSet в дизайнере, ViewModel или что-то еще. В противном случае, для чего вам нужен компонент BindingSource (который, кстати, автоматически генерируется при выборе любого источника данных)?
DataTables/Views, которые мы иногда используем, являются динамическими/нетипизированными. Выполнение привязки данных в конструкторе к BindingSource, для которого еще не установлен источник данных (во время разработки и при вызове InitializeComponent), просто приведет к появлению строки кода 'this.textbox1.DataBindings.Add("Text", this.bsMain , "имя");' в CS-файле дизайнера. И это очень полезно, поскольку позволяет нам устанавливать поля столбцов без источника типизированного объекта. BindingSource можно использовать таким образом, даже не зная во время разработки, каким в конечном итоге будет источник данных.
Ну, я не совсем понимаю ваши требования; в любом случае, я не думаю, что существует диалоговое окно VS, которое позволяет указать исходное поле/свойство/столбец источника данных, у которого нет источника данных (так в оригинале). Я не помню, чтобы это было возможно и в .NET Framework. BindingSource не является источником данных как таковой, если только вы не установили его свойство DataSource
для конкретного объекта или типа, который предоставляет свойства/столбцы.
Посмотрите Привязка данных с помощью конструктора ООП Windows Forms
Обновление: после тестирования вы можете вручную ввести bsMain-Name
в опции «Текст».
Как сказал Джими, даже в .NET Framework нет опции, позволяющей указать исходное поле/свойство/столбец источника данных, у которого нет источника данных.
Сначала вам необходимо связать DataSource для bsMain
, чтобы в привязке данных текстового поля была опция bsMain
.
Учитывая, что вам нужно установить DataSource динамически, вы можете установить для bsMain DataSource none после генерации bsMain-Name
.
Это именно тот ответ, который я искал, это работает; ему необходимо имя BindingSource с '-' (включая пробелы), а затем имя поля/члена/столбца. Большое спасибо! Это где-то задокументировано?
Это возможно. Выберите TextBox, перейдите к его селектору
(DataBindings)
в PropertyGrid, откройте диалоговое окно(Advanced)
, выберите свойство для привязки и источник данных из раскрывающегося спискаBinding
. Это делает то же самое, что вы делаете в своем коде, с той лишь разницей, что код генерируется в файле.Designer.cs
, а не в основном файле.cs
(BindingSource может изначально быть привязан к типу; в этом случае вам необходимо сбросить источник данных после вызоваInitializeComponent()
)