powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Почему UserControl по любому вносит изменения в DataSet ??
3 сообщений из 3, страница 1 из 1
Почему UserControl по любому вносит изменения в DataSet ??
    #35757045
karapetyan_a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ситуация стандартная:
Есть форма, отображающая данные с какого-то датасета.
Перед закрытием я вызываю BindingSource.EndEdit() и проверяю свойство DataSet.HasChanges() ... если изменения есть то сохраняем...............
Пользователь открывает форму, просматривает и закрывает ничего не трогая!!!

так вот если данные отображаются в стандартных контролах ( TextBox ) то датасет не обнаруживает изменений
если же данные отображаются в контроле унаследованном от UserControl то датасет замечает изменения, хотя их нет..............
в чем секрет?

вот набрал простое приложение, для иллюстрации проблемы:
Код: plaintext
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.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using System.ComponentModel;
using System.Data;
using System.Drawing;

namespace DataSetHasChanges
{
	public class frmTest : Form
	{
		private DataSet _dataSet;
		private BindingSource _bs;
		private MyControl _myControl;
		private TextBox _textBox;
		

		public frmTest()
		{
			this.InitializeComponent();
			this.FillDataSet();
			this._dataSet.AcceptChanges();

			// если включить привязку к usercontrol-у то датасет начнет фиксировать изменения
			// ПОЧЕМУ???????????			
			// this._myControl.DataBindings.Add(new Binding("Value", this._bs, "col1", true, DataSourceUpdateMode.OnValidation, "(null)"));
			this._textBox.DataBindings.Add(new Binding("Text", this._bs, "col1", true, DataSourceUpdateMode.OnValidation, "(null)"));
		}

		void frmTest_FormClosing(object sender, FormClosingEventArgs e)
		{
			this._bs.EndEdit();
			if (this._dataSet.HasChanges())
			{
				MessageBox.Show("Data set has changes... (do you want to save changes?)");
			}
		}

		private void FillDataSet()
		{
			for (int i = 1; i < 5; i++)
			{
				DataRow r = this._dataSet.Tables[0].NewRow();
				r["col1"] = "Item " + i.ToString();
				this._dataSet.Tables[0].Rows.Add(r);
			}
		}
		private void InitializeComponent()
		{
			// dataset
			this._dataSet = new DataSet();
			DataTable t1 = new DataTable("t1");
			t1.Columns.Add("col1", typeof(string));
			this._dataSet.Tables.Add(t1);

			// bindingsource
			this._bs = new BindingSource();
			this._bs.DataSource = this._dataSet;
			this._bs.DataMember = this._dataSet.Tables[0].TableName;
			
			// usercontrol
			_myControl = new MyControl();
			this.Controls.Add(_myControl);

			// textbox
			_textBox = new TextBox();
			_textBox.Location = new Point(100, 0);
			this.Controls.Add(_textBox);
			// form
			this.FormClosing += new FormClosingEventHandler(frmTest_FormClosing);
		}
	}

	[DefaultBindingProperty("Value")]
	[DefaultProperty("Value")]
	public class MyControl : UserControl
	{
		private TextBox _textBox;

		public MyControl()
		{
			this.InitializeComponent();
		}

		private void InitializeComponent()
		{
			this._textBox = new TextBox();
			this._textBox.BackColor = Color.LightGray;
			this.Controls.Add(this._textBox);
			this.Size = new Size(100, 30);
		}

		public string Value
		{
			get { return this._textBox.Text; }
			set
			{
				if (this._textBox.Text != value)
					this._textBox.Text = value;
			}
		}
	}

	static class Program
	{
		[STAThread]
		static void Main()
		{
			Application.EnableVisualStyles();
			Application.SetCompatibleTextRenderingDefault(false);
			Application.Run(new frmTest());
		}
	}


}

...
Рейтинг: 0 / 0
Почему UserControl по любому вносит изменения в DataSet ??
    #35757168
karapetyan_a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кому интересно, сам нашел ответ:
Надо в UserControl-е обьявить событие: ValueChanged и вызывать его:

Код: plaintext
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.
	[DefaultBindingProperty("Value")]
	[DefaultProperty("Value")]
	public class MyControl : UserControl
	{
		// вот это событие надо обьявить
		public event EventHandler ValueChanged;

		private TextBox _textBox;

		public MyControl()
		{
			this.InitializeComponent();
		}

		private void InitializeComponent()
		{
			this._textBox = new TextBox();
			this._textBox.BackColor = Color.LightGray;
			// вот здесь подписаться на изменение текста
			this._textBox.TextChanged += new EventHandler(_textBox_TextChanged);
			this.Controls.Add(this._textBox);
			this.Size = new Size(100, 30);
		}

		// и вот здесь вызывать ValueChanged
		void _textBox_TextChanged(object sender, EventArgs e)
		{
			if (this.ValueChanged != null)
				this.ValueChanged(this, e);
		}

		public string Value
		{
			get { return this._textBox.Text; }
			set
			{
				if (this._textBox.Text != value)
					this._textBox.Text = value;
			}
		}
	}

правда почему это так происходит не очень понял, подсмотрел это на англоязычном сайте, а мой енглиш не гут:(

english_site
Most likely because there is no similar named Changed event, so the property
value always get's persisted at Control.Validating. And a DataRow doesn't
care if it's the same value, if a field is set then it's marked as changed.

Add a changed event to your UserControl, eg:

public event EventHandler FirstNameChanged;

public string FirstName
{
get{return textBox1.Text;}set{textBox1.Text=value;}
}

// attach an eventhandler to textBox1.TextChanged
private textBox1_OnTextChanged( object sender, EventArgs e )
{
if ( FirstNameChanged!=null )
FirstNameChanged(this, EventArgs.Empty);
}

With a Changed event, it will persist the value at Control.Validating but
only if the Changed event has fired before the Validating event.
...
Рейтинг: 0 / 0
Почему UserControl по любому вносит изменения в DataSet ??
    #35762709
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
karapetyan_aправда почему это так происходит не очень понялПотому что в этом случае датабиндинг не может определить было ли изменено свойство и пишет его "всегда" в источник данных "на всякий случай".
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Почему UserControl по любому вносит изменения в DataSet ??
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]