Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.79/43: Рейтинг темы: голосов - 43, средняя оценка - 4.79
 Аватар для Spectral-Owl
608 / 583 / 157
Регистрация: 29.06.2010
Сообщений: 1,620

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

29.01.2013, 14:43. Показов 9190. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
сукцессия 43. Вторая научная статья за месяц- прайминг и гатгил
anaschu 25.07.2026
две стороны одной монеты
Более приземисто - Эстафету хвоста в .cdl (деревья эстафеты в сад).
Hrethgir 24.07.2026
В будущем, после написания блока инверсии обхода дерева (эстафеты хвоста), я планирую вернуться к нашему прошлому разговору о том, обладают ли знания целеполаганием. Тогда я пришел к выводу, что. . .
Вот представьте что вам дали бессмертие.
kumehtar 24.07.2026
Вот представьте что вам дали бессмертие, ничего более не меняя. Вообще ничего, только бессмертие в нынешнем виде. Рады были бы? Что бы вы тут делали всё это время? Никакой пенсии. Никакого нового. . .
сукцессия 41
anaschu 24.07.2026
Численная верификация бифуркации в агентной модели лесной сукцессии: от одного параметра к ансамблю Автор: пользователь @Shumilov_AS | Раздел: Прикладная математика / Численные методы Кратко. . .
сукцессия 40. Ансамблевая кластерная параметризаци, часть 1.
anaschu 24.07.2026
Пр# Сопровождение научной статьи ИИ-ассистентом: подготовка публикации и калибровка агентно-ориентированной модели сукцессии микоризных систем **Полевые заметки о двухнедельной совместной работе**. . .
Теория всего 12. ВГК на планете в стратегической игре "терра"
anaschu 21.07.2026
### Главные семантические изменения и дешифровка новой физики 1. **`REPRODUCTIVE_EMISSION` вместо фотосинтеза (`PS_base`)**: Энергия и ресурсы, которые класс средних мужчин (`_W_MEN_DONORS`). . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru