很郁闷的怪问题,真的不知道怎么办了?关于验证控件~

i169net1 2006-09-20 09:16:14
VS.NET 2003

做了个用户控件,用来新增或编辑提货单,参数IsNew为true时为新增,为false时为编辑。
输入提货数量时,有一个验证控件RangeValidator1,TYPE为Double,最小值为0,最大值先空着(不确定,准备在后台写入此值)~

在后台是这么写的:
private bool isnew;
public bool IsNew
{
get
{
return(this.isnew);
}
set
{
this.isnew = value;
chushi();
}
}
private void chushi(string meid) //初始化用户控件
{
RangeValidator rangesl=(RangeValidator)this.FindControl("RangeValidator1");
if (isnew)
{
//...获得最大值...
double myMax_new=Math.Max(myck.Sl,0);
rangesl.MaximumValue=myMax_new.ToString();
rangesl.ErrorMessage="* 数量必须大于0,且小于库存总量:"+rangesl.MaximumValue+" "+myck.Dw;
}
else
{
//...获得最大值...
double myMax=Math.Max(Maxsl,0);
rangesl.MaximumValue=myMax.ToString();
rangesl.ErrorMessage="* 数量必须大于0,且小于库存总量:"+rangesl.MaximumValue+" "+myck.Dw;
}
}

在 if{}else{} 中两种给验证控件设定参数的写法都是一样的,但结果却if{}中的验证控件工作不正常,而else{}中的完全正常!?
我查看了获取的最大值是正确的,也的确将值赋给了.MaximumValue参数。
但只有0可以通过验证,或不改变文本框的默认值...
另外,提示信息也没有出现,是个空文本...


急!望各位不吝赐教,谢谢!
...全文
331 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
i169net1 2006-10-09
  • 打赏
  • 举报
回复
谢谢,blackant2(乔峰) 。

这几天比较忙,结贴迟了,抱歉...
blackant2 2006-09-26
  • 打赏
  • 举报
回复
第一次运行的时候:
UserControl_Init
Page Page_Init
Page Page_Load
UserControl_Load
Page PreRender
UserControl chusi False
UserControl PreRender
Page SaveViewState
UserControl SaveViewState

回传以后的事件发生先后顺序如下
UserControl_Init
Page Page_Init
UserControl LoadViewState
Page Page_Load
UserControl_Load
Page CheckedChanged
Page PreRender
UserControl chusi True
UserControl PreRender
Page SaveViewState
UserControl SaveViewState

那么很明显发生了page checkedchanged之后
我们要再通行usercontrol变更它的属性或行为还有最后一次机会
在render之前有个preRender事件
更改usercontrol的
protected void Page_PreRender(object sender, EventArgs e)
{
chushi();//可以在这儿chushi
Response.Write("UserControl PreRender<br>");
}
然后将我们的aspx页面checkbox的CausesValidation属性改为真,就可以看到效果了
blackant2 2006-09-26
  • 打赏
  • 举报
回复
哎,真是辛苦你了,为什么不自己做个测试呢
首先建立一个ascx文件,里面当然放了一个文本框,一个验证控件
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="WebUserControl1.ascx.cs" Inherits="Test_WebUserControl1" %>
<asp:TextBox runat="server" Text="10" ID="tb1"></asp:TextBox>
<asp:RangeValidator runat="server" ID="rangesl" ControlToValidate="tb1" Type="Integer"></asp:RangeValidator>

然后我们并不注意逻辑,只看重事件发生的先后顺序
以下是ascx.cs
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class Test_WebUserControl1 : System.Web.UI.UserControl
{
public bool IsNew{
get
{
if (ViewState["IsNew"] == null)
return false;
else
return (bool)ViewState["IsNew"];
}
set {
ViewState["IsNew"] = value;
}
}

protected override void LoadViewState(object savedState)
{
Response.Write("UserControl LoadViewState<br>");
base.LoadViewState(savedState);
}
protected override object SaveViewState()
{
Response.Write("UserControl SaveViewState<br>");
return base.SaveViewState();
}
private void chushi(){
if (IsNew)
{
rangesl.MaximumValue = "1000";
}
else {
rangesl.MaximumValue = "100";
}
rangesl.MinimumValue = "0";
rangesl.ErrorMessage = "Must lower than" + rangesl.MaximumValue;
Response.Write("UserControl chusi "+IsNew.ToString()+"<br>");
}
protected void Page_Init(object sender, EventArgs e) {
Response.Write("UserControl_Init<br>");
}

protected void Page_Load(object sender, EventArgs e)
{
Response.Write("UserControl_Load<br>");
}

protected void Page_PreRender(object sender, EventArgs e)
{
//chushi();--只看事件的先后顺序
Response.Write("UserControl PreRender<br>");
}
}
然后简单的用一个aspx页面做测试
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="Test_Default" %>

<%@ Register Src="WebUserControl1.ascx" TagName="WebUserControl1" TagPrefix="uc1" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<uc1:WebUserControl1 id="WebUserControl1_1" runat="server" IsNew="false">
</uc1:WebUserControl1></div>
<asp:CheckBox ID="CBIsNew" runat="server" AutoPostBack="True" OnCheckedChanged="CBIsNew_CheckedChanged" />
</form>
</body>
</html>

其对象的cs文件我们同样只注重事件的先后顺序
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class Test_Default : System.Web.UI.Page
{
protected override void LoadViewState(object savedState)
{
Response.Write("Page LoadViewState<br>");
base.LoadViewState(savedState);
}
protected override object SaveViewState()
{
Response.Write("Page SaveViewState<br>");
return base.SaveViewState();
}
protected void Page_Init(object sender, EventArgs e) {
Response.Write("Page Page_Init<br>");
}
protected void Page_Load(object sender, EventArgs e)
{
Response.Write("Page Page_Load<br>");

}
protected void Page_PreRender(object sender, EventArgs e)
{
Response.Write("Page PreRender<br>");
}
protected void CBIsNew_CheckedChanged(object sender, EventArgs e)
{
Response.Write("Page CheckedChanged<br>");
this.WebUserControl1_1.IsNew = ((CheckBox)sender).Checked;
}
}


i169net1 2006-09-26
  • 打赏
  • 举报
回复
.............
i169net1 2006-09-26
  • 打赏
  • 举报
回复
up
i169net1 2006-09-25
  • 打赏
  • 举报
回复
现在的执行顺序不象我预料的那样:
控件Page_Load()--->控件chushi()
而是:
控件chushi()--->控件Page_Load()

就这个问题...
zj36com 2006-09-23
  • 打赏
  • 举报
回复
帮你顶一下
i169net1 2006-09-23
  • 打赏
  • 举报
回复
再次UP
i169net1 2006-09-22
  • 打赏
  • 举报
回复
再UP...
i169net1 2006-09-22
  • 打赏
  • 举报
回复
谢谢:blackant2(乔峰)

这样写只是存储了这个属性值,但我的主要问题是激发一个对用户控件进行初始化的函数chushi(),当给IsNew属性符值时,即调用此函数。

现在的执行顺序不象我预料的那样:
控件Page_Load()--->控件chushi()
而是:
控件chushi()--->控件Page_Load()

就这个问题...

myminimouse 2006-09-22
  • 打赏
  • 举报
回复
public bool IsNew
{
get
{
return(this.isnew);
}
set
{
this.isnew = value;
chushi();
}
}

这样写是什么意思啊
blackant2 2006-09-22
  • 打赏
  • 举报
回复
public bool IsNew{
get{
if(ViewState["IsNew"]==null)
return false;
return ViewState["IsNew"];
}
set{
ViewState["IsNew"]=Value;
}
}

private void chushi(string meid) {
if(IsNew){}
else{}
}
luck0235 2006-09-22
  • 打赏
  • 举报
回复
一般用Javascript,从没用过.net的验证控件......
i169net1 2006-09-22
  • 打赏
  • 举报
回复
顶!!!
i169net1 2006-09-21
  • 打赏
  • 举报
回复
分不够再加,谢谢!
i169net1 2006-09-21
  • 打赏
  • 举报
回复
谢谢!
我现在的问题就出在您谈到的第二点,执行chushi()后,又执行了控件的Page_Load(),在chushi()中将验证控件设置的一些属性又被Page_Load()复原了,所以才发生这样的错误...

但我一般是将用户控件放在一个Panle容器中,起初是隐藏的。通过点击页面的某按钮,呈现出Panle,并给其中的用户控件set属性IsNew,这样就没任何问题了,因为控件的Page_load已经执行过,现在只执行chushi()函数...所做的操作,不会被复原。

而我这次将用户控件的属性赋予直接放在了某页面的Page_load中,所以执行的顺序就成了:
页面Page_load()--->为用户控件赋予属性--->控件chushi()--->控件Page_Load()

这样,chushi()中做的一些操作,全被控件的Page_Load()复原了...
我应该怎么做才好?

enjoy330 2006-09-21
  • 打赏
  • 举报
回复
private bool isnew;
public bool IsNew
{
get
{
return(this.isnew);
}
set
{
this.isnew = value;
chushi();
}
}
---------------------------------
沒有看懂你的意思,但是恐怕這麽寫沒有什麽作用吧?
1。首先IsNew是一個沒法保存的值,也就是,每次PostBack以後IsNew必定重新刷新為false,除非你給他賦值。
2。在set以後pageLoad等還是會執行的,那麽你的set中的chushi();會不會被PageLoad或是其它的事件處理函數給復原了而不會有什麽效果呢?
i169net1 2006-09-21
  • 打赏
  • 举报
回复
放了一天了,还是没人理睬啊...555~
顶一个
i169net1 2006-09-20
  • 打赏
  • 举报
回复
补充:
chushi(myid); //这里是有参数的
}
}
private void chushi(string meid) //初始化用户控件

62,242

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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