自定义数据绑定控件

nigthadow 2010-01-05 12:28:03
最近在做一个数据绑定的控件,把自定义属性和数据源绑定(数据源是dataview),一般来说属性值在不改变的时候应该不会调用Databinding的Parse事件把数据写回数据源,比如TextBox的Text属性,但是我的控件每次在CurrencyManager的Position变化的时候都不分青红皂白的给Parse回去了,着实郁闷那- -,哪位大虾给看看那,一下代码

测试用数据绑定控件

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace TestControlLibrary
{
[DefaultBindingProperty("Value")]
public partial class TestTextBox : TextBox
{

private string value = "";

[DefaultValue("")]
[Bindable(true)]
public string Value
{
get { return this.value; }
set { this.value = value; this.Text = this.value.ToString(); }
}

[Bindable(false)]
[Browsable(false)]
public override string Text
{
get { return base.Text; }
set { base.Text = value; }
}

public TestTextBox()
{
InitializeComponent();
}
}
}


主窗体

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using TestControlLibrary;

namespace Test
{
public partial class Form1 : Form
{
private CurrencyManager cm;
private DataView dv;
private DataSet ds = new DataSet();

public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
DataTable dt = new DataTable("m_test");
DataRow dr;
dt.Columns.Add("number", typeof(string));
dt.Columns.Add("name", typeof(string));

for (int i = 0; i < 20; i++)
{
dr = dt.NewRow();
dr[0] = "0" + i.ToString("00");
dr[1] = "1" + i.ToString("00");
dt.Rows.Add(dr);
}

ds.Tables.Add(dt);
ds.AcceptChanges();
dv = new DataView(dt);
textBox3.DataBindings.Add("Value", dv, "number"); //这个textBox3就是上面的控件
dataGridView1.DataSource = dv;
cm = (CurrencyManager)this.BindingContext[dv];
}

private void button1_Click(object sender, EventArgs e)
{
cm.Position--;
}

private void button2_Click(object sender, EventArgs e)
{
cm.Position++;
}


private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (ds.HasChanges())
if (MessageBox.Show("Data changed,Exit?", "Changed", MessageBoxButtons.OKCancel,
MessageBoxIcon.Question) == DialogResult.Cancel)
e.Cancel = true;
}
}
}


每次点击上一条或者下一条按钮(button1和button2)的时候,虽然没有对Value做任何更改,它还是调用Parse把数据写回数据源(dv),然后在关闭窗口的时候,就会认为数据更改过,弹出提示。
我该怎么才能让属性不改变的时候不会自动的把数据写回数据源的(像TextBox一样)? 已经困扰了一个礼拜了,求求各位大虾帮帮忙
...全文
169 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
AppByte 2010-08-22
  • 打赏
  • 举报
回复
我绑定的控件内容也不得。。。
_see_you_again_ 2010-01-05
  • 打赏
  • 举报
回复
cm.Position--;
ds.AcceptChanges();

cm.Position++;
ds.AcceptChanges();
nigthadow 2010-01-05
  • 打赏
  • 举报
回复
Dobzhansky,太感谢了,都不知道咋表达我的感谢之情了~~~~
以后跟你混了O(∩_∩)O哈哈~
Dobzhansky 2010-01-05
  • 打赏
  • 举报
回复
刚回答了一个

控件的属性是否改变由你负责

http://topic.csdn.net/u/20100105/22/2ff0f491-17fa-4b63-8426-eb80786b349d.html
nigthadow 2010-01-05
  • 打赏
  • 举报
回复
UP UP!为啥没人理- -

问题太没有技术含量了么,有想法的朋友,大家一起讨论下呗
nigthadow 2010-01-05
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 herojams 的回复:]
cm.Position--;
ds.AcceptChanges();

cm.Position++;
ds.AcceptChanges();

[/Quote]

谢谢回复,不过这样不能解决根本问题,如果这样弄了,当我真的修改了数据的时候,我该怎么知道我改过了呢?

111,120

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧