Как прочитать привязку данных в элементах управления Windows Forms - PullRequest
0 голосов
/ 26 июня 2018

Я знаю, как привязать данные к элементу управления.

Каков допустимый способ считывания настроек привязки данных в коде?

В графическом интерфейсе есть раздел (DataBindings) с Tag и Text .

Ниже вы можете видеть, что (привязки данных) имеет текст : _rosterBS - LastName.

Я пытаюсь получить этот источник и свойство привязки (т. Е. Прочитать текстовое значение).

screenshot

В конструкторе

// 
// txtLastName
// 
this.txtLastName.DataBindings.Add(new System.Windows.Forms.Binding("Text", this._rosterBS, "LastName", true));
this.txtLastName.Location = new System.Drawing.Point(7, 32);
this.txtLastName.Name = "txtLastName";
this.txtLastName.Size = new System.Drawing.Size(198, 20);
this.txtLastName.TabIndex = 1;

DataBindings происходит из этой версии класса Control:

//
// Summary:
//     Defines the base class for controls, which are components with visual representation.
[ClassInterface(ClassInterfaceType.AutoDispatch)]
[ComVisible(true)]
[DefaultEvent("Click")]
[DefaultProperty("Text")]
[Designer("System.Windows.Forms.Design.ControlDesigner, System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")]
[DesignerSerializer("System.Windows.Forms.Design.ControlCodeDomSerializer, System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", "System.ComponentModel.Design.Serialization.CodeDomSerializer, System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")]
[ToolboxItemFilter("System.Windows.Forms")]
public class Control : Component, IDropTarget, ISynchronizeInvoke, IWin32Window, IArrangedElement, IBindableComponent, IComponent, IDisposable
{

Оттуда я начал искать IBindableComponent

//
// Summary:
//     Enables a non-control component to emulate the data-binding behavior of a Windows
//     Forms control.
public interface IBindableComponent : IComponent, IDisposable
{
    //
    // Summary:
    //     Gets or sets the collection of currency managers for the System.Windows.Forms.IBindableComponent.
    //
    // Returns:
    //     The collection of System.Windows.Forms.BindingManagerBase objects for this System.Windows.Forms.IBindableComponent.
    BindingContext BindingContext { get; set; }

Затем я стал гоняться за BindingContext, но, похоже, я не получаю ничего, что содержит информацию, которую я ищу.

К вашему сведению: зачем мне это? В настоящее время я могу проверить контекст данных Linq-To-SQL на наличие изменений, чтобы запросить сохранение при выходе, но это не позволяет пользователю узнать, какое поле изменилось. У меня есть способ вручную сравнить оригинал с новой версией в каждом элементе управления, но реализация этого во всем нашем наборе решений потребует ручного кодирования каждой формы.

Обновление: это НЕ для элементов управления DevExpress.

1 Ответ

0 голосов
/ 26 июня 2018

Ориентировочно, вот что я придумал:

// Occurs when all the clients have been bound to the Windows Forms BindingSource
private void rosterBindingSource_BindingComplete(object sender, BindingCompleteEventArgs e)
{
    if (_dataDictionary != null)
    {
        _dataDictionary.Clear();
    }
    _dataDictionary = new Dictionary<string, Control>();
    rosterBindingSource_BindingData(this);
}

private void rosterBindingSource_BindingData(Control control)
{
    foreach (var item in control.Controls)
    {
        var ctrl = item as Control;
        if (ctrl != null)
        {
            rosterBindingSource_BindingData(ctrl);
            // see what is data bound
            var bindable = item as IBindableComponent;
            if (bindable != null)
            {
                foreach (Binding binding in bindable.DataBindings)
                {
                    if (!_dataDictionary.ContainsKey(binding.PropertyName))
                    {
                        _dataDictionary.Add(binding.PropertyName, ctrl);
                    }
                }
            }
        }
    }
}

Это может быть лучшим способом. Мне все еще нужно сделать общий источник связывания более общим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...