超难问题,在线等待

顾君彦 北京紫博蓝网络发展有限公司 技术总监  2003-05-16 11:42:17
如何使TextBox发生Validated事件?
或者Control的Validated事件?

请注意不是调用Validated事件,而是让控制自己引发Validated事件.
两者有区别.因为在向控件赋值时,比如TextBox.Text赋值时,若不引发验证事件,
那么,赋的值将会在某些情况下无效.比如Text绑定的情况下。
请各位老大想想办法
注:
用控制光标跳转的方式来间接引发Validated 不在解答范围

...全文
9 点赞 收藏 12
写回复
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
顾君彦 2003-05-16
想找出一个除光标跳转之外的方法实现这个要求,看样子破产啦.
放分啦~~~~~~~~~~~~~~~~~~~~~~
回复
chsl918 2003-05-16
你是不是想要调用TextBox2的Validated事件?
但是我看到你上面说的思路TextBox2好像没有获得焦点。在MSDN中有这么一段:

焦点事件按下列顺序发生:
Enter
GotFocus
Leave
Validating
Validated
LostFocus

如果TextBox2没有获得过焦点好像就不会产生Validated 事件。
所以我想你是不是可以在要校验之前加一句TextBox2.Focus让TextBox2获得焦点!
然后在TextBox2获得焦点后TextBox2_GotFocus事件和将焦点转移走!!比如让别的控件获得焦点。
不知道我说的对不对,说的不对一笑而过。
回复
顾君彦 2003-05-16
原题目如下:
为解决以下问题
问题这样重现:
=========================================
设计
=========================================
建立一个窗口,一个tabControl
两个tabPage页tabPage1,tabPage2,在其中一个tabPage2页上放两个
TextBox组件.TextBox1,TextBox2.
建立一张表,T ,有两个字段F1,F2
建立一个dataSet1在其中放到表T.
在窗口中,建立一个dataSet1的实例,在TextBox1,TextBox2上分
别绑定 F1字段和F2字段。
在窗口load时,fill数据集中的T表。
在TextBox1的OnKeyDown事件中写入
if(e.keyCode==System.Windows.Form.Keys.Enter)
{
TextBox2.Text = TextBox1.Text;
}
放入一个按钮button1,并在click事件中写入
this.BindingContext[dataSet1,"T"].AddNew();

=======================================================
运行步骤
======================================================
打开窗口,点击button1
在TextBox1中输入一个值,按回车。
点击tabPage1,再点击回tabPage2看看效果,
========================================================
结果
========================================================
TextBox2.Text是不是没有了?

这是什么原因?要完成让TextBox2的值在切换TabPage页时不变,怎
么做?
我们目前分析出是光标跳转时TextBox2没有引发Validated事件。
不知道是不是这样的原因?
微软专家们来指导指导,对于这种业务如何解决?
这种业务常在一些比如说 单价+数量=金额这种情况下经常用。
现在的问题就是在这种业务下,数据经常会出乎意料的丢失。
回复
timmy3310 2003-05-16
Validated事件是在Control的OnValidated方法里面引发的,所以你要引发该事件,只有从内部调用OnValidated方法,或者用别的方法来间接的触发这个方法的调用,比如SetFocus

控件内部需要引发该事件都是通过调用OnValidated来完成的
回复
顾君彦 2003-05-16
对不起,我想我表达得有问题,虽然我在前面注明了
这段话.
"请注意不是调用Validated事件,而是让控制自己引发Validated事件.
两者有区别.因为在向控件赋值时,比如TextBox.Text赋值时,若不引发验证事件,
那么,赋的值将会在某些情况下无效.比如Text绑定的情况下。"
我提供一个我在微软社区里提交的贴子,按上面的步骤可以重现这种情况.我们认真分析了这重情况,正在极力处理这种问题.现在的焦点,我们认为就是这个什么时候触发验证,这个验证事件,我们要求可以用程序控制控件内部启动验证事件.
那个例子我填写到微软件的新闻组上去了,半个小时了,还没有显示出来.真是奇怪.

谢谢大家帮忙.例子出来后,再来请求各位指教
回复
cheng_young 2003-05-16
你好象只是想在给Text赋值时进行校验, 这正是property的set方法的工作啊
override TextBox.Text属性, 在set方法里调用base之前校验
回复
chsl918 2003-05-16
我有笨方法:
写目标程序的时候将主程序写成一个单独的过程。这样想要调用的时候同样调用这个单独的过程就可以启到同样的作用。当然在Validated过程的程序中同样是调用这个单独的过程。
还有就是在VB6中是可以调用目标过程的。就是说一个click事件可以被自己的程序调用。比如双击某个地方可以调用一个按钮事件。因为我是一个C#初学者所以不知道在C#中是否可以实现。
其实以上两种方法思路差不多,都是同样想办法执行同一个程序。但愿对你有点用处。
回复
timmy3310 2003-05-16
更进一步,你可以重载Text属性,在设置Text的时候引发Validating事件,如:

public class MyTextBox : TextBox
{
public MyTextBox() : base()
{}


public void RaiseValidatedEvent()
{
OnValidated( EventArgs.Empty );
}

public override string Text
{
get {
return base.Text;
}
set {
CancelEventArgs e = new CancelEventArgs();
OnValidating(e); //引发Validating事件以检查数据
if( !e.IsCancel )
{
base.Text=value;
OnValidated(EventArgs.Empty);
}
}
}
}
回复
Corny 2003-05-16
事件是由控件内部引发的,想要外部引发,就看它本身的引发条件

既然光标跳转不在引发范围,我也想知道还有什么能引发该事件,因引发该事件的条件就是“光标跳转”。

有一个方法,你可以重写该控件,然后你当然可以改变事件的引发条件(比如你可以在text属性改变时引发该事件),除此外,我就不知道还有其他什么方法了。
回复
timmy3310 2003-05-16
使用:
OnValidated( EventArgs.Empty );
可以引发Validated事件

但是OnValidated是保护方法,只能在控件内部调用,你可以重载TextBox,如:

public class MyTextBox : TextBox
{
public MyTextBox() : base()
{}


public void RaiseValidatedEvent()
{
OnValidated( EventArgs.Empty );
}
}
然后使用MyTextBox代替TextBox,调用它的RaiseValidatedEvent就可以自己引发Validated事件
回复
spring_ok 2003-05-16
you can validate the data to be set to the TextBox.text before use it at server side.
回复
顾君彦 2003-05-16
自己up
回复
发动态
发帖子
C#
创建于2007-09-28

10.4w+

社区成员

.NET技术 C#
申请成为版主
社区公告

全世界最好的语言,没有之一.