xenogear

当知道了某样知识之后,就会发现其实什么都不知道

WinForm下TextBox的数据绑定和更新

一直以来在Form上的TextBox要显示数据库内容,通常就是直接赋值。看了http://www.15seconds.com/issue/040908.htm上讲的要做对应类,现在来说,ORM没什么做的特别好的,所以这么做还是有些累。http://tech.ccidnet.com/pub/article/c1138_a9879_p1.html里面介绍也只是单向绑定,而且实现的不是很好。

于是就想直接将TextBox绑定到DataSet上。就做了下面的例子,用的是pubs库中authors表:

private void Form2_Load(object sender, System.EventArgs e)
{
 
this.sqlDataAdapter1.Fill(authorsNameSet);
 
this.dataGrid1.DataSource = authorsNameSet.Tables[0].DefaultView;
 
this.FillUIContent();
}

private void button1_Click(object sender, System.EventArgs e)
{
 index
++;
 
if(index > this.authorsNameSet.Tables[0].Rows.Count - 1)
 
{
  index 
= 0;
 }
 
 
this.FillUIContent();
}

private void FillUIContent()
{
 
if(this.textBox1.DataBindings["Text"!= null)
 
{
  
this.textBox1.DataBindings.Remove(this.textBox1.DataBindings["Text"]);
 }

 
this.textBox1.DataBindings.Add("Text", authorsNameSet.Tables[0].Rows[index]["au_fname"], "");

 
if(this.textBox2.DataBindings["Text"!= null)
 
{
  
this.textBox2.DataBindings.Remove(this.textBox2.DataBindings["Text"]);
 }

 
this.textBox2.DataBindings.Add("Text", authorsNameSet.Tables[0].Rows[index]["au_lname"], "");
}



上面的是单向绑定,就是说,也只能显示,不能更新回来。那要更新回来怎么办?我试了用TextChange事件。在Form_Load中间加上:

this.textBox1.TextChanged +=new EventHandler(textBox1_TextChanged);
this.textBox2.TextChanged +=new EventHandler(textBox2_TextChanged);

然后事件处理里面,加上

private void textBox1_TextChanged(object sender, System.EventArgs e)
{
 
this.authorsNameSet.Tables[0].Rows[index]["au_fname"= this.textBox1.Text;
 CurrencyManager cm 
= (CurrencyManager)this.dataGrid1.BindingContext[this.dataGrid1.DataSource];
 cm.Refresh();
}

private void textBox2_TextChanged(object sender, EventArgs e)
{
 
this.authorsNameSet.Tables[0].Rows[index]["au_lname"= this.textBox2.Text;
 CurrencyManager cm 
= (CurrencyManager)this.dataGrid1.BindingContext[this.dataGrid1.DataSource];
 cm.Refresh();
}

然后好了,就可以同步更新DataSet了。

然后呢,想做的好,干脆派生一个TextBox,加一个DataSource用来放数据集, DataMember属性用来放数据表加字段,封装更新的内容。(代码懒得写了)

posted on 2004-10-10 13:45 什么都不知道 阅读(3214) 评论(2)  编辑 收藏 网摘 所属分类: C#开发

评论

#1楼  2005-03-29 04:03 lm [未注册用户]

this.BindingContext[dataSet,tableName].EndCurrentEdit();
这样就可以了吧?   回复  引用    

#2楼  2006-11-24 09:44 刘早早 [未注册用户]

关于TextBox的数据绑定后更新。
操作:这样更简单操作,在写入数据库之前,要调用,DATAROW.ENDEDIT();
原因:绑定数据后,当前数据行处于编辑状态(绑定的时候,系统会自动对当前的DATAROW,调用BEGINEDIT()),所以你必须结束编辑。
你还可以做这样一个实验,你用代码修改一下DATAROW的值,你会发现TEXTBOX里的值同样不会变,道理是一样的,并不是单向绑定还是双向绑定,只是因为你修改的值,没有通过ENDEDIT推入到DATATABLE里,所以rowstate也谈不上变化。   回复  引用    





标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
Google站内搜索

China-pub 计算机图书网上专卖店!6.5万品种 2-8折!
近千种 9-95 新二手计算图书火热销售中!
开发者征途系统新作:《设计模式——基于C#的工程化实现及扩展》

相关文章:

相关链接:
 

<2008年12月>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

导航

统计

与我联系

搜索

 

常用链接

留言簿(25)

随笔分类

随笔档案

文章档案

最新评论