DataGridViev BindingList
Здравствуйте! в очередной раз обращаюсь к вам!
Проблема такая есть DataGridview. Через DataSource я указываю источник данных BindingList.
Список состоит из класса наследника родительского класса ChaildClass например.
Вопрос как сделать что бы в DataGrid выводились все поля вместе с наследуемыми?
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Дубликаты в datagridviev
Есть файл(>1 млн стр.). Нужно найти дубликаты по 3 столбцу и 5 (прайс-лист). Как это можно.
Непослушный DataGridViev
Вообщем делаю я базу данных в C# с большим набором данных, уже смог создать подключение и заставить.
Вычисление в dataGridViev
private void button1_Click(object sender, EventArgs e) < int a, b, c; .
8935 / 4847 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
Указывай BindingList
Регистрация: 03.12.2015
Сообщений: 51
ViterAlex, Я бы с удовольствием))) Но есть проблема, у меня 3 наследника. и что бы получить BindingList надо его перебрать и сделать приведение типов. Есть другие способы? мб какие-то методы переопределить в классах наследниках.
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь
DataGridViev — робота з ячейками
В датагриде сделал ячейку кнопкой. Как описать событие на клик по ней, чтобы в эту ячейку.
DataGridViev сменить на текстбокс
Доброе время суток Интересует такой вопрос у меня при нажатии кнопки открывается файл и.

Извлечение объекта из BindingList<>
Прошу подсказать каким образом могу извлечь необходимый объект по индексу из BindingList<> .
Bindinglist c что это
Команда может принимать параметры, через которые в команду можно передать некоторые данные извне. В частности, если мы посмотрим на определение метода Execute , то увидим, что он принимает параметр, через который в команду передаются данные любого типа:
void Execute(object? parameter);
Для передачи данных в команду элементы графического интерфейса, которые поддерживают команды, например, класс Button , имеют свойство CommandParameter . Это свойство и представляет передаваемые в команду данные.
Рассмотрим применение параметров команды. Пусть у нас реализован следующий класс MainCommand :
public class MainCommand : ICommand < public event EventHandler? CanExecuteChanged; Actionaction; public MainCommand(Action action) < this.action = action; >public bool CanExecute(object? parameter) => true; public void Execute(object? parameter) => action?.Invoke(parameter); >
Метод Execute принимает параметр parameter — это то, что будет передаваться через свойство CommandParameter визуальных компонентов. Затем это значение передается в действие action.
Пусть данные представлены следующим классом Person:
public class Person < public int Id < get; set; >public string Name < get; set; >= ""; public int Age < get; set; >public override string ToString() => Name; >
Определим следующий класс модели представления MainViewModel :
using System.ComponentModel; using System.Runtime.CompilerServices; using System.Windows.Input; namespace HelloApp; public class MainViewModel : INotifyPropertyChanged < static int // для генерации id // данные для нового объекта string name =""; int age; // команда для добавления public ICommand AddCommand < get; set; >// команда для удаления public ICommand RemoveCommand < get; set; >// данные для отображения в списке public BindingList People < get; >public string Name < get =>name; set < if (name != value) < name = value; OnPropertyChanged(); >> > public int Age < get =>age; set < if (age != value) < age = value; OnPropertyChanged(); >> > public MainViewModel() < People = new() < new Person, new Person , new Person >; // определяем команду добавления AddCommand = new MainCommand(_ => < People.Add(new Person < Name = this.Name, Age = this.Age >); Name = ""; Age = 0; >); // определяем команду удаления RemoveCommand = new MainCommand(obj => < // ищем объект по id if(obj is int id) < var person = People.FirstOrDefault(p =>p.Id == id); // если объект найден, удаляем его if (person != null) < People.Remove(person); >> >); > public event PropertyChangedEventHandler? PropertyChanged; public void OnPropertyChanged([CallerMemberName] string prop = "") < PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(prop)); >>
Модель представления определяет свойство People, которое представляет коллекцию объектов, а также свойства Name и Age, через которые пользователь будет добавлять в список People новые данные.
MainViewModel определяет две команды. Команда AddCommand по свойствам Name и Age создает объект Person и добавляет его в коллекцию People.
Для удаления данных определена команда RemoveCommand , которая получает параметр:
RemoveCommand = new MainCommand(obj => < if(obj is int id) < var person = People.FirstOrDefault(p =>p.Id == id); if (person != null) < People.Remove(person); >> >);
Для получения параметра в конструктор класса MainCommand передается делегат с одним параметров типа object? . Такой параметр может представлять любой тип. И в данном случае мы ожидаем, что будет передаваться идентификатор удаляемого объекта Person. Поэтому преобразуем параметр obj к типу int, находим соответствующий объект Person и удаляем из коллекции People.
В коде установим данную модель представления в качестве констекста привязки:
namespace MetanitApp; public partial class Form1 : Form < public Form1() < InitializeComponent(); ListBox peopleListBox = new ListBox(); peopleListBox.Dock = DockStyle.Left; peopleListBox.SelectionMode = SelectionMode.One; Controls.Add(peopleListBox); Panel personForm = new Panel< Padding = new Padding(10), Width=260 >; personForm.Dock = DockStyle.Right; TextBox nameBox = new TextBox(); nameBox.Location = new Point(12, 10); nameBox.Size = new Size(230, 27); personForm.Controls.Add(nameBox); NumericUpDown ageBox = new NumericUpDown < Minimum=0, Maximum=100 >; ageBox.Location = new Point(12, 50); ageBox.Size = new Size(230, 27); personForm.Controls.Add(ageBox); Button addButton = new Button < Text = "Save", AutoSize = true >; addButton.Location = new Point(12, 80); personForm.Controls.Add(addButton); Button removeButton = new Button < Text = "Remove", AutoSize = true >; removeButton.Location = new Point(12, 110); personForm.Controls.Add(removeButton); Controls.Add(personForm); // устанавливаем модель представления DataContext = new MainViewModel(); peopleListBox.DataBindings.Add(new Binding("DataSource", DataContext, "People")); peopleListBox.DisplayMember = "Name"; peopleListBox.ValueMember = "Id"; nameBox.DataBindings.Add(new Binding("Text", DataContext, "Name", true, DataSourceUpdateMode.OnPropertyChanged)); ageBox.DataBindings.Add(new Binding("Value", DataContext, "Age", true, DataSourceUpdateMode.OnPropertyChanged)); // привязка к команде добавления addButton.DataBindings.Add(new Binding("Command", DataContext, "AddCommand", true)); // привязка к команде удаления removeButton.DataBindings.Add(new Binding("Command", DataContext, "RemoveCommand", true)); // привязка к параметру команды removeButton.DataBindings.Add(new Binding("CommandParameter", peopleListBox, "SelectedValue")); > >
Вначале страницы определен компонент ListBox для вывода списка People. Далее на элементе Panel определены два поля ввода — TextBox и NumericUpDown о два текстовых поля, которые привязаны к свойствам Name и Age.
свойство Command кнопки addButton привязано к команде AddButton. Таким образом, по нажатию на кнопку будет срабатывать команда AddCommand , в которой введенные в текстовые поля данные будут добавлены в список People в MainViewModel.
Кроме того, определена кнопка удаления, которая привязана к команде RemoveCommand и которая в качестве параметра команды передает выделенное значение в ListBox:
// привязка к команде удаления removeButton.DataBindings.Add(new Binding("Command", DataContext, "RemoveCommand", true)); // привязка к параметру команды выделенного значения в списке ListBox removeButton.DataBindings.Add(new Binding("CommandParameter", peopleListBox, "SelectedValue"));
Здесь стоит отметить, что выше для ListBox в качестве свойства значения задано свойство Id:
peopleListBox.ValueMember = "Id";
Поэтому свойство SelectedValue в ListBox будет представлять Id выделенного элемента Person. А прявязка к параметру команды позволяет его передать в команду.
Таким образом, после выделения объекта в ListBox и нажатия на кнопку удаления выделенный объект будет удален:
Bindinglist c что это
Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: » Сказочное королевство»
Репутация: 6
Всего: 65
Приветствую уважаемое сообщество.
В приложении использую классы для описания объектов (один объект = запись в таблице БД).
Для получения всех записей из таблицы использую методы, которые возвращают List .
Это все реализовано в бизнес слое приложения.
В слое представления для отображения данных и реализации навигации по записям использую BindingSource,
которые передаются DataGridView в качестве источника данных.
Все работает.
Но вот возникла необходимость при отображении данных в табличной форме фильтровать их по тому или иному параметру (столбцу).
К примеру — в DataGridView отображены все фактуры клиента, фактура может быть оплачена или не оплачена, пользователь жмет кнопочку и
в DataGridView отображаются только не оплаченнные фактуры данного клиента.
Пытаюсь фильтровать BindingSource присваивая его свойству Filter необходимое значение. Но ничего не происходит.
Вот тут смотрел в первую очередь.
Но это ничего не дало, так как там пример дан с DataView, а я присваиваю свойству DataSource моего BindingSource заполненный BindingList,
которому в качестве значения присваивается результат работы метода класса из бизнес слоя приложения в виде List.
Прошу помощи у уважаемого сообщества. Подскажите в чем может быть проблема и как ее решить.
Потому как в приложении нужно будет реализовать еще много раз фильтрацию данных по заданным параметрам.
Да DataSet-ы в приложении не используются вообще. Все реализовано через коллекции List. А в слое представления через BindingList и BindingSource.
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: » Сказочное королевство»
Репутация: 6
Всего: 65
Это код котрый сейчас в приложении.
Два метода срабатывают на ура, загрузка формы(конструктор) и SetupBinding()
А вот код в обработчике события «нажать кнопку» не срабатывает.
| Код |
| public frmKlantEdit() InitializeComponent(); SetupBinding(); > private void SetupBinding() ContactFilter _contactFilter = new ContactFilter(«K»); Predicate filterByType = new Predicate(_contactFilter.MatchesContactType); BindingList klantList = new BindingList(Contact.GetEntityList().FindAll(filterByType)); this.contactBindingSource.DataSource = klantList; |
BindingList artikelList = new BindingList(Artikel.GetEntityList());
this.artikelBindingSource.DataSource = artikelList;
>
private void button1_Click(object sender, EventArgs e)
this.klantFactuurBindingSource.Clear();
this.klantFactuurDataGridView.DataSource = null;
может я там много чего лишнего понаписал или надо как-то по другому?
Это сообщение отредактировал(а) thomas — 13.3.2009, 17:46
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
Let’s do some .NET
Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург
Репутация: 18
Всего: 67
thomas, это решение проблемы? или это ваш код, который не работает?
СУВ,
Partizan.
Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: » Сказочное королевство»
Репутация: 6
Всего: 65
Partizan,
Это код который не работает. Имею ввиду код события (нажать кнопку Button1)
ЗЫ добавлял код с другого компа, поэтому в саму тему код не попал, а добавился отдельным постом. Упс, извиняюсь.
Это сообщение отредактировал(а) thomas — 13.3.2009, 17:48
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
Профиль
Группа: Модератор
Сообщений: 5820
Регистрация: 14.8.2008
Где: В Коньфпольте
Репутация: 31
Всего: 142
Для того, чтобы коллекция поддерживала фильтрацию, надо чтобы в ней был реализован интерфейс
System.ComponentModel.IBindingListView.
Хочешь получить мудрый совет — читай подписи участников форумов.
Злой доктор Щасзаболит
Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: » Сказочное королевство»
Репутация: 6
Всего: 65
diadiavova,
приветствую.
в msdn вот по этому ms-help://MS.MSDNQTR.v90.ru/fxref_system.windows.forms/html/7a1ee03a-f316-f86f-a007-8891c1965901.htm адресу
НАПИСАНО
| Цитата |
| C# [ComplexBindingPropertiesAttribute(«DataSource», «DataMember»)] public class BindingSource : Component, IBindingListView , IBindingList, IList, ICollection, IEnumerable, ITypedList, ICancelAddNew, ISupportInitializeNotification, ISupportInitialize, ICurrencyManagerProvider |
это означает что в классе BindingSource РЕАЛИЗОВАН интерфес, на который вы мне указываете.
Иначе, насколько я понимаю, у этого класса не было бы свойства Filter.
Так вот, вопрос остается открытым.
Что я делаю не так и что надо сделать, чтобы ПРОИЗВОДИЛАСЬ ФИЛЬТРАЦИЯ?
ЗЫ в статье про IBindingListView написано
| Цитата |
| Заметки Интерфейс IBindingListView позволяет реализовать расширенную сортировку как набор пар «дескриптор свойства-направление». Фильтрацию можно реализовать как строку, интерпретируемую реализацией источника данных. Интерфейс IBindingListView реализуется с помощью класса BindingSource. |
Это сообщение отредактировал(а) thomas — 14.3.2009, 00:18
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
Профиль
Группа: Модератор
Сообщений: 5820
Регистрация: 14.8.2008
Где: В Коньфпольте
Репутация: 31
Всего: 142
Я написал о коллекции BindingList. у биндингсорса есть свойство SupportsFiltering, о возвращаемом значении этого свойства написано
| Цитата |
| Значение true, если список имеет тип System.ComponentModel.IBindingListView и поддерживает фильтрацию. В противном случае — значение false. |
Хочешь получить мудрый совет — читай подписи участников форумов.
Злой доктор Щасзаболит
Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: » Сказочное королевство»
Репутация: 6
Всего: 65
diadiavova,
Я про Фому
| Цитата |
| [C#]BindingSource.Filter проблема с фильтрацией |
а ты про Ерёму
| Цитата |
| Я написал о коллекции BindingList. |
Ладно, это все лирика
Будем проверять свойство SupportsFiltering своего BindingSource.
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
Профиль
Группа: Модератор
Сообщений: 5820
Регистрация: 14.8.2008
Где: В Коньфпольте
Репутация: 31
Всего: 142
На самом деле я про того же фому, ты просто меня не понял. Биндингсорс никаких чудес не творит, если в источнике реализован указанный интерфейс, то он будет фильтровать, а если нет — то будет возникать как раз та проблема, из-за которой ты создал тему. Возьми вместо биндинглист таблицу и будет тебе счастье.
Добавлено через 9 минут и 54 секунды
Точнее не таблицу напрямую, DataView.
Хочешь получить мудрый совет — читай подписи участников форумов.
Злой доктор Щасзаболит
Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: » Сказочное королевство»
Репутация: 6
Всего: 65
diadiavova,
приветствую.
То что ты советуешь
| Цитата |
| Возьми вместо биндинглист таблицу и будет тебе счастье. |
не покатит
| Цитата |
| Да, DataSet-ы в приложении не используются вообще. Все реализовано через коллекции List. А в слое представления через BindingList и BindingSource. |
В приложении два слоя: слой данных и слой представления.
В слое данных на каждый объект написан класс, который представляет одну запись из той или иной таблицы, в нем есть статические методы, которые выдают коллекцию объектов, считав записи из БД посредством dataReader.
В слое представления данные отображаются.
Никаких DataSet, DataTable, DataView в приложении нет и не будет.
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
Профиль
Группа: Модератор
Сообщений: 5820
Регистрация: 14.8.2008
Где: В Коньфпольте
Репутация: 31
Всего: 142
Тогда для фильтрации можно выбирать из листа нужные записи методом FindAll, создавать на их основе биндинглист и передавать его дэйтасорсу грида. Как это выглядит с точки зрения кривизны реализации и производительности — не знаю, но на небольшом примере пробовал — работает
| Код |
| datagridView1.DataSource = new BindingList(List1.FindAll(cont=> ! cont.Afbetaald)); |
что-то в этом роде.
Хочешь получить мудрый совет — читай подписи участников форумов.
Злой доктор Щасзаболит
Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: » Сказочное королевство»
Репутация: 6
Всего: 65
diadiavova,
привет.
С точки зрения кривизны и производительности
| Цитата |
| Тогда для фильтрации можно выбирать из листа нужные записи методом FindAll |
выглядит нормально и одобрено большим спецом по данным Джоном Папа.
Программа построена по его «схеме», которую он описывает в .NET Magazin за 2007 год (блин ссылки нет под рукой)
Если ты внимательно смотрел на код метода SetupBinding, то там видно что для получения клиентов используется как раз то о чем ты говоришь.
| Код |
| private void SetupBinding() ContactFilter _contactFilter = new ContactFilter(«K»); Predicate filterByType = new Predicate(_contactFilter.MatchesContactType); BindingList klantList = new BindingList(Contact.GetEntityList().FindAll(filterByType)); this.contactBindingSource.DataSource = klantList; BindingList artikelList = new BindingList(Artikel.GetEntityList()); this.artikelBindingSource.DataSource = artikelList; > |
вот тут BindingList
Для этого в классе формы написан вложенный приватный класс ContactFilter, для фильтрации контактов. Контакт может быть поставщиком или клиентом.
В данном случае нужны были клиенты.
Значит придется писать еще один класс — фильтр для фактур и по нажатию кнопочки перезаполнять
BindingList factuurList = new BindingList(KlantFactuur.GetEntityList(klant.ContactId).FindAll(фильтр для фактур));
вот таким макаром.
Короче танцы с бубном.
А интересно какие коллекции реализуют этот хитрый интерфейс(IBindingListView)?
Почему спрашиваю? Потому как, класс BindingSource является наследником этого интерфейса, но он получает коллекцию BindingList, а тот в свою очередь получает List. И получается что, свойство класса наследника интерфейса не работает. Так на фига нужно это свойство? Или что этому классу надо скармливать что бы оно работало? Или мы должны переписывать этот класс из FW что бы реализовать в нем этот хитрый интерфейс?
Короче, дело ясное, что дело темное.
Пойду плясать с бубном.
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
Профиль
Группа: Модератор
Сообщений: 5820
Регистрация: 14.8.2008
Где: В Коньфпольте
Репутация: 31
Всего: 142
| Цитата(thomas @ 14.3.2009, 20:23 ) |
| А интересно какие коллекции реализуют этот хитрый интерфейс(IBindingListView)? |
К сожалению, порадовать особо нечем. Кроме BindingSource и DataView этот интерфейс нигде не реализован. При этом биндингсорс — просто посредник, а дэйтавью ориентирован на работу с таблицами.
Хочешь получить мудрый совет — читай подписи участников форумов.
Злой доктор Щасзаболит
Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: » Сказочное королевство»
Репутация: 6
Всего: 65
В общем проблему фильтра решил таким образом.
Написал вложенный класс.
Потом подсовываю его Predicate-у и при помощи метода FindAll для List нахожу все неоплаченные фактуры для заданного клиента.
| Код |
| private class FactuurFilter private bool afbetaald = false; |
public FactuurFilter(bool afbetaald)
this.afbetaald = afbetaald;
>
public bool MatchesFactuurType(KlantFactuur factuur)
return factuur.Afbetaald == afbetaald;
>
>
private void btnFilterFactuur_Click(object sender, EventArgs e)
this.klantFactuurBindingSource.Clear();
Будем считать что данная конкретная задача решена.
Но вопрос об использовании свойства Filter для BindingSource при использовании в качестве источника данных коллекции вместо DataView (как в примерах в msdn ) остался открытым.
diadiavova спасибо за участие .
Это сообщение отредактировал(а) thomas — 14.3.2009, 23:16
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
- Что же такое .NET? Краткое описание,изучаем.
- Какой язык программирования выбрать? выбираем.
- C#. С чего начать? начинаем.
- Защита исходного кода .NET приложений, защищаем.
- Литература по .NET, обращаемся.
- FAQ раздела,ищем здесь.
- Архиполезные ссылки:www.connectionstrings.com, www.pinvoke.net, www.codeproject.com
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
[ Время генерации скрипта: 0.2056 ] [ Использовано запросов: 21 ] [ GZIP включён ]
Управление выражениями Delphi с помощью компонента списка привязок

После изучения выражений привязки и того, как они могут связываться с компонентами, перейдем к компоненту, предназначенному для управления выражениями привязки.
В недавних сообщениях в блоге я рассмотрел основной движок выражений RTL Delphi и привязку компонентов . Теперь мы можем сделать дополнительный шаг и изучить ключевой компонент всей архитектуры привязок, который называется BindingsList. Список привязок — это набор различных типов выражений привязок, управляемых конструкторами.
Другими словами, выражения и привязки компонентов, которые я определил в исходном коде в последнем сообщении блога, могут быть полностью определены в конструкторах (и мастерах) компонента BindingsList. Просто перетащите компонент этого типа в форму плюс несколько визуальных компонентов (в моем примере два редактирования, вращение и индикатор выполнения — см. Изображение ниже).

Компонент BindingsList имеет конструктор, который позволяет определять набор привязок. Каждую привязку можно выбрать с помощью одного из множества доступных вариантов (их слишком много, чтобы исследовать в этой статье, и в основном они сосредоточены на привязках источников данных и полей данных). Я собираюсь использовать здесь два основных параметра: TBindExpression и TBindExprItems.

После выбора одной из этих привязок, скажем TBindExpression, вам необходимо взаимодействовать с двумя разными поверхностями дизайна для работы с выражением: с одной стороны, вы можете настроить свойства выражения в инспекторе объектов, например SourceComponent и ControlComponent (the использование термина для обозначения целевого элемента управления) и связанных выражений; с другой стороны, дважды щелкнув выражение в редакторе BindingList, вы можете открыть нам специальный конструктор выражений, который, в свою очередь, имеет дополнительные редакторы элементов и средства просмотра:

На изображении выше вы можете видеть, что я подключил выражение к исходному и целевому элементам управления, но до сих пор не определил выражение. Это может быть простое имя свойства или более сложная комбинация значений и выражений. Его можно настроить в свойствах выражений инспектора объектов для привязки или в специальном конструкторе, показанном выше. Дизайнер также предлагает возможность оценивать и проверять различные выражения.
Возвращаясь к выражениям, мы можем просто использовать Value и Position для Spin Edit и Progress Bar соответственно. Обратите внимание, что выражение привязки имеет направление (по умолчанию, источник для управления), которое может быть изменено на противоположное или также может быть двунаправленным.
Я использовал двунаправленное выражение для двух полей редактирования, так что при вводе в одно из них содержимое копируется в другое. В этом втором примере я использовал привязку TBindExprItems (но регулярного выражения было бы достаточно). Это более сложная привязка, в которой вы указываете источник и элемент управления (как указано выше), но определяете набор выражений очистки и форматирования, которые могут включать несколько свойств элементов управления. В этом примере отображение текста в текст (двунаправленное), как вы можете видеть ниже:

При всем этом единственный код Delphi, который требуется в приложении, — это вызов для повторной оценки привязок при изменении значения источника. Это легко сделать, обработав события OnChange различных элементов управления и запустив общее обновление привязок для текущего элемента управления ( отправителя ):