Аватар для Spectral-Owl
608 / 583 / 157
Регистрация: 29.06.2010
Сообщений: 1,620

Привязка данных

29.01.2013, 14:43. Показов 9212. Ответов 24
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
вопрос в следующем: можно-ли значение какого-либо свойства контрола привязать к полю класса?
пробовал DataBinding и натолкнулся на такую проблемму:
ControlUpdateMode.OnPropertyChanged почему-то не изменяет привязанное значение контрола при изменении значения свойства, приходится пользоваться
методом ReadValue(), который делает бесполезным вышеназванное свойство. может кто разьяснить что я делаю не так?

C#
1
2
3
4
//привязывал следующим образом:
            Binding a = new Binding("Checked", conv.tabInput.Status, "CompleateMeasureStep");
            a.ControlUpdateMode = ControlUpdateMode.OnPropertyChanged;
            checkBox1.DataBindings.Add(a);
где conv.tabInput.Status.CompleateMeasureSte p - свойство с доступом только для чтения типа bool
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.01.2013, 14:43
Ответы с готовыми решениями:

Привязка данных
Добрый День. Суть проблемы в следующем, у меня есть коллекция в нее добавляются новые элементы, но элементы добавляются динамически при...

Привязка данных
Всем привет! Есть моя коллекция : (IList, IBindingList) объектов типа "N". Она используется в виде источника данных для Грида. Проблема в...

Привязка данных
Добрый день. Проблема в следующем, я использую простую привязку к списку объектов (http://rsdn.ru/article/dotnet/Data_Binding_Basics.xml -...

24
 Аватар для Spectral-Owl
608 / 583 / 157
Регистрация: 29.06.2010
Сообщений: 1,620
30.01.2013, 16:04  [ТС]
Студворк — интернет-сервис помощи студентам
ну и плюс ко всему потестил: если вызывать обработчик в другом потоке, то он выдаёт исключение.
а к базовому потоку формы из класса я не вернусь: смысла в класс передавать ссылку на форму нет совсем)
0
0 / 0 / 0
Регистрация: 19.11.2014
Сообщений: 4
26.11.2014, 18:08
Подниму тему, т. к. вопрос у меня похожий.

На форме три текстовых поля: textBox1, textBox2 и textBox3, а также кнопка button1.
Создан класс MyControl.
Пытаюсь привязать экземпляр этого класса к textBox1 (
C#
1
this.MC.DataBindings.Add(new Binding("Text1", this.textBox1, "Text", true, DataSourceUpdateMode.OnPropertyChanged));
) - ничего не получается, ввожу текст в поле textBox1 - экземпляр класса (МС) никак на это не реагирует.
В тоже время textBox3 без проблем привязывается к МС (
C#
1
this.textBox3.DataBindings.Add(new Binding("Text", this.MC, "Text1", true, DataSourceUpdateMode.OnPropertyChanged));
).

В чем проблема?

Код:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
public partial class Form1 : Form
  {
    public MyControl MC;
    public Form1()
    {
 
      InitializeComponent();
    }
 
    private void Form1_Load(object sender, EventArgs e)
    {
      this.MC = new MyControl();
      this.MC.DataBindings.Add(new Binding("Text1", this.textBox1, "Text", true, 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));
    }
    [DefaultBindingProperty("Text1")]
    public class MyControl : UserControl
    {
      public event EventHandler Text1Changed;
      private string _Text = "";
      public string Text1
      {
        get { return _Text; }
        set
        {
          _Text = value;
          if (Text1Changed != null)
            Text1Changed(this, new EventArgs());
        }
      }
    }
 
    private void button1_Click(object sender, EventArgs e)
    {
      this.MC.Text1 = "TEST";
    }
 
  }
Добавлено через 8 часов 59 минут
Разобрался: класс MyControl надо было объявить вне формы.

Добавлено через 30 минут
Поторопился. На самом деле то привязывается, то нет.

Добавлено через 9 часов 42 минуты
Есть класс, который пытаюсь привязать к DataTable. Не получается, Position у BindingSource не меняется.

Код класса:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
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
 
  }

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

C#
1
2
3
4
 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 остается неизменным.
В чем проблема?

Добавлено через 10 минут
Когда кликаю по заголовкам столбцов DataGridView (сортируя его строки - при этом выбирается новая строка), привязанного к RegisteredProcesses, свойство DocK объекта InterRep меняется.
0
0 / 0 / 0
Регистрация: 04.02.2013
Сообщений: 6
17.12.2015, 17:59
Подскажите, пожалуйста. Перехожу с С++ на C# и столкнулся с некоторым не пониманием.
Есть форма (Windows Forms) с элементами управления (например numericUpDown).
Есть свой класс Measure (все именования условные)
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
interface IMeasure
{
    double SomeProperty { get; set; }
}
 
class Measure : IMeasure, INotifyPropertyChanged
{
        public event PropertyChangedEventHandler PropertyChanged;
        private struct MeasureData
        {
                public double MyProperty;
        }
        private MeasureData measureData;
        public double SomeProperty 
        {
            get { return measureData.MyProperty; }
            set 
            { 
                measureData.MyProperty= value + 1; // +1 условно и говорит, что здесь производим некоторые действия с полученным значением
                if (PropertyChanged != null)
                     PropertyChanged(this, new PropertyChangedEventArgs("MyProperty"));
            }
        }
}
 
public partial class FormMain : Form
{
        private IMeasure measure;
        public FormMain()
       {
             InitializeComponent();
             measure = new Measure(this);
             iMeasureBindingSource.DataSource = measure;
         }
         // тут другой код
}
От формы к свойству все работает, а от свойства к форме нет.
Дизайнер генерирует такую строчку
C#
1
this.numericUpDown.DataBindings.Add(new System.Windows.Forms.Binding("Value",this.iMeasureBindingSource, "MyProperty", true));
Если formattingEnabled заменить на false, то начинает работать и от свойства к форме. Но дизайнер всегда генерирует true.
Просветите почему так происходит, и как правильно поступить? Может я выбрал не совсем эффективный подход.
Класс Measure у меня получает данные от формы, преобразует их и изменяет. Эти изменения нужно отразить на форме.
0
 Аватар для Spectral-Owl
608 / 583 / 157
Регистрация: 29.06.2010
Сообщений: 1,620
11.01.2016, 11:24  [ТС]
биндингами нормально пользоваться так и не научился =)
по старинке использую события, хотя код получается достаточно китайский, если у управляемого объекта много свойств
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
using System.Threading;
namespace WinTest
{
    public partial class Form1 : Form
    {
        private IMeasure measure;
 
        public Form1()
        {
            InitializeComponent();
 
             measure = new Measure();
             measure.PropertyChanged += measure_propertyChanged;
 
             label1.Text = ""; //просто чтоб не ставить точки остановы, но смотреть когда было вызвано событие.
        }
 
        //метод обработки изменения свойства объекта
        private void measure_propertyChanged(object sender)
        {
            decimal _value = Convert.ToDecimal(measure.SomeProperty);
            numericUpDown1.Value = _value;
            label1.Text += "c";
        }
 
        //метод на изменение значения свойства объекта
        private void numericUpDown1_ValueChanged(object sender, EventArgs e)
        {
            decimal _value = Convert.ToDecimal(measure.SomeProperty);
            if (_value == numericUpDown1.Value)
                return;
            measure.SomeProperty = Convert.ToDouble(numericUpDown1.Value);
        }
    }
 
    interface IMeasure
    {
        event SomeEvent PropertyChanged;
        double SomeProperty { get; set; }
    }
 
    public delegate void SomeEvent(object sender);
 
    class Measure : IMeasure
    {
        private MeasureData measureData;
        private struct MeasureData
        { 
            public double MyProperty; 
        }
 
        public event SomeEvent PropertyChanged;
 
        public double SomeProperty
        {
            get { return measureData.MyProperty; }
            set
            {
                this.measureData.MyProperty = value; //"MyProperty = value" говорит достаточно о произошедшем изменении.
                if (PropertyChanged != null)
                    PropertyChanged(this);
            }
        }
    }
}
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
11.01.2016, 11:30
Цитата Сообщение от chernenko Посмотреть сообщение
почему так происходит, и как правильно поступить?
У вас свойство класса называется SomeProperty, а привязываетесь вы к свойству MyProperty и уведомляете об изменении свойства MyProperty, которого у класса Measure не существует.

Очевидно, что нужно привязываться и уведомлять о существующем свойстве: SomeProperty.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.01.2016, 11:30

DataGridView и привязка данных
Привет, форумчане. Вопрос такой: есть элемент управления, к которому привязаны данные из dataSet. То есть, в контроле отображается вся...

Привязка данных к list
Добрый день! Подскажите пожалуйста. Я получаю температурные показатели с COM-порта и теперь необходимо использавать их в температурном...

привязка данных к textBox
Мне нужно написать класс Visualisator который принимает экземпляр произвольного класса и выводит в табличном виде все его public свойства,...

Привязка данных к RadioButton
Есть два радиобатона с надписями "один" и "два". Нужно связать с ними числа "1" и "2", чтобы можно было делать как-нибудь так: ...

Привязка данных в TreeView
Здравствуйте! Никогда не использовала TreeView, пользовалась другими компонентами из сторонних библиотек. Столкнулась со стандартным...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
25
Ответ Создать тему
Опции темы

Новые блоги и статьи
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства. Жизнь действительно предъявляет каждому. . .
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
Лето уходит
kumehtar 17.08.2026
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины". За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html Задача: . . .
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru