Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > Привязка своего класса к данным


Автор: ainis 26.11.2014, 11:58
Приветствую уважаемых участников форума.

Создаю свой класс на основе UserControl, создаю в нем новое свойство, пытаюсь привязать его к данным и ничего не получается.

Код описания класса:

Код

public class MyControl : UserControl
  {
    
    public event EventHandler Text1Changed;
    private string _Text1 = "";
    [Bindable(true, BindingDirection.TwoWay)]
    [SettingsBindable(true)]
    public string Text1
    {
      get { return _Text1; }
      set
      {
        _Text1 = value;
        if (Text1Changed != null) Text1Changed(this, new EventArgs());
      }
    }
  }


Код загрузки формы (на форме три текстбокса и одна кнопка) и привязки:

Код

public partial class MainForm : Form
  {
    public MyControl MC;
    public MainForm()
    {

      InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {//Здесь осуществляем собственно привязку.
      this.MC = new MyControl();
      this.MC.DataBindings.Add(new Binding("Text1", this.textBox1, "Text", false, DataSourceUpdateMode.OnPropertyChanged));
      this.textBox2.DataBindings.Add(new Binding("Text", this.textBox1, "Text", true, DataSourceUpdateMode.OnPropertyChanged));
      this.textBox3.DataBindings.Add(new Binding("Text", this.MC, "Text1", true, DataSourceUpdateMode.OnPropertyChanged));
      int ii = 1;
    }
    private void button1_Click(object sender, EventArgs e)
    {
      this.MC.Text1 = "TEST";
    }
  }


В итоге экземпляр моего класса (MC) не привязывается к текстовому полю textBox1 (свойство IsBinding = false), а поле textBox3 без ошибок привязывается к MC. Т. е. объект MC не получается задать как источник данных.
Интересно, что в некоторых (очень редких) случаях привязка все-таки осуществляется.
В чем здесь проблема?

Автор: ainis 26.11.2014, 13:11
Решил использовать это решение: http://www.sql.ru/forum/531708/uvyazka-datagridview-i-propertygrid?hl=ibindablecomponent#5361195

Автор: ainis 26.11.2014, 18:00
Есть класс, который пытаюсь привязать к DataTable. Не получается, Position у BindingSource не меняется.

Код класса:

Код

class InterRepresentation : IBindableComponent, INotifyPropertyChanged
  {
    public event EventHandler DocKChanged;
    public event PropertyChangedEventHandler PropertyChanged;
    private int _DocK = 0;
    [property: BindableAttribute(true, BindingDirection.TwoWay)]
    [property: SettingsBindableAttribute(true)]
    public int DocK
    {
      get { return _DocK; }
      set
      {
        _DocK = value;
        if (DocKChanged != null)
          DocKChanged(this, new EventArgs());
        OnPropertyChanged("DocK");
      }
    }
    protected void OnPropertyChanged(string name)
    {
      PropertyChangedEventHandler handler = PropertyChanged;
      if (handler != null)
      {
        handler(this, new PropertyChangedEventArgs(name));
      }
    }
    #region IBindableComponent Members

    private BindingContext bindingContext;
    private ControlBindingsCollection dataBindings;

    public BindingContext BindingContext
    {
      get
      {
        if (bindingContext == null)
        {
          bindingContext = new BindingContext();
        }
        return bindingContext;
      }
      set
      {
        bindingContext = value;
      }
    }

    public ControlBindingsCollection DataBindings
    {
      get
      {
        if (dataBindings == null)
        {
          dataBindings = new ControlBindingsCollection(this);
        }
        return dataBindings;
      }
    }

    #endregion
    #region IComponent Members

    public event EventHandler Disposed;

    ISite site;

    public ISite Site
    {
      get
      {
        return site;
      }
      set
      {
        site = value;
      }
    }

    #endregion

    #region IDisposable Members

    public void Dispose()
    {
      if (Disposed != null)
        Disposed(this, EventArgs.Empty);
    }

    #endregion

  }



Привязка класса:

Код

 this.InterRep = new InterRepresentation();//this - это форма
---
this.InterRep.DataBindings.Add(new Binding("DocK", RegisteredProcesses, "ProcType"));
 this.textBox2.DataBindings.Add(new Binding("Text", RegisteredProcesses, "ProcType"));//здесь для примера привязываю текстбокс



При перемещении по строкам таблицы (DataTable) RegisteredProcesses (эта таблица привязана к DataGridView) textBox2.Text меняется, а свойство DocK объекта InterRep типа InterRepresentation остается неизменным.
В чем проблема?

Добавлено через 5 минут и 21 секунду
Когда кликаю по заголовкам столбцов DataGridView (сортируя его строки), привязанного к RegisteredProcesses, свойство DocK объекта InterRep меняется.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)