do you mean?? (anyway, your naming convention is very confusing) public bool Enabled { get { return ViewState["Enabled"] != null; } set { if(value) ViewState["Enabled"] = 1; else ViewState.Remove("Enabled"); } }or you should be doingpublic bool Enabled { get { if (ViewState["Enabled"] == null) return false; return (bool)ViewState["Enabled"]; } set { ViewState["Enabled"] = value; } }
to:saucer(思归, MS .NET MVP) 不是类型的原因。 实际上语法没有问题,我以前写的东西都用这个。也没有什么问题。 开始的时候我觉得这样会很省ViewState。 但是就昨天我才发现它的一个bug..另我的控件发生不同的行为(555,以后都不这样写了)所以才发个帖上来。考考大家。。你帖的第二段代码是正确的。但我发帖是想大家都能找出我原来写法的bug而已。
还有 ( your naming convention is very confusing ) 是什么意思啊? 我英文很差的~~~~~
lostinetdotcom(思考=储存+选择+变异) 究竟是什么bug你就快说吧,别吊大家胃口了
controls derived from WebControl have a property named Enabledpublic bool Enabled <----属性是 return ViewState["Enabled"]==null; <---其实是不Enabled固然是小聪明,但让人糊涂/迷惑,不是好编码
原来你说这个啊。。 这个没有问题的。 我只是举个例子而已。想不到你想到那个去了。 那些控件的Enabled是它们自己的实现嘛,和我这个没有关系的~~~ 我平时是这样的:public class MyControl : Control { class vs { public const string ShowPager="sp"; } public bool ShowPager { get { return ViewState[vs.ShowPager]==null; } set { if(value) ViewState.Remove(vs.ShowPager); else ViewState[vs.ShowPager]=0; } } }这也是我个人自己的写法而已。 问题是出在ViewState.Remove上的。其实也就几行代码而已嘛。不过其中的确有bug 原以为用ViewState.Remove(vs.ShowPager);把该项去掉,那么就能另ShowPager恢复为true , 但是实际上PostBack后,ShowPager的值和预期的不同。我不是故意弄上来为难别人。其实这也算个思考题,可以研究一下,那样会对ViewState的使用增加经验的。
cannot reproduce what you are saying, <script language="C#" runat="server"> public bool Enabled { get { return ViewState["Enabled"]==null; } set { if(value) ViewState.Remove("Enabled"); else ViewState["Enabled"]=1; } }void SetView(Object o, EventArgs e) { Button b = (Button)o; Response.Write(b.Text + " is clicked<BR>"); Response.Write("Before:" + Enabled.ToString() + "<BR>"); Enabled = b == btnTrue; Response.Write("After:" + Enabled.ToString()); }void Check(Object o, EventArgs e) { Button b = (Button)o; Response.Write(b.Text + " is clicked<BR>"); Response.Write("Current:" + Enabled.ToString() + "<BR>");
public bool Enabled
{
get
{
return ViewState["Enabled"] != null;
}
set
{
if(value)
ViewState["Enabled"] = 1;
else
ViewState.Remove("Enabled");
}
}or you should be doingpublic bool Enabled
{
get
{
if (ViewState["Enabled"] == null)
return false; return (bool)ViewState["Enabled"];
}
set
{
ViewState["Enabled"] = value;
}
}
不是类型的原因。
实际上语法没有问题,我以前写的东西都用这个。也没有什么问题。
开始的时候我觉得这样会很省ViewState。
但是就昨天我才发现它的一个bug..另我的控件发生不同的行为(555,以后都不这样写了)所以才发个帖上来。考考大家。。你帖的第二段代码是正确的。但我发帖是想大家都能找出我原来写法的bug而已。
(不过这个和bug没有关系)
( your naming convention is very confusing )
是什么意思啊?
我英文很差的~~~~~
return ViewState["Enabled"]==null; <---其实是不Enabled固然是小聪明,但让人糊涂/迷惑,不是好编码
这个没有问题的。
我只是举个例子而已。想不到你想到那个去了。
那些控件的Enabled是它们自己的实现嘛,和我这个没有关系的~~~
我平时是这样的:public class MyControl : Control
{
class vs
{
public const string ShowPager="sp";
}
public bool ShowPager
{
get
{
return ViewState[vs.ShowPager]==null;
}
set
{
if(value)
ViewState.Remove(vs.ShowPager);
else
ViewState[vs.ShowPager]=0;
}
}
}这也是我个人自己的写法而已。
问题是出在ViewState.Remove上的。其实也就几行代码而已嘛。不过其中的确有bug
原以为用ViewState.Remove(vs.ShowPager);把该项去掉,那么就能另ShowPager恢复为true ,
但是实际上PostBack后,ShowPager的值和预期的不同。我不是故意弄上来为难别人。其实这也算个思考题,可以研究一下,那样会对ViewState的使用增加经验的。
public bool Enabled
{
get
{
return ViewState["Enabled"]==null;
}
set
{
if(value)
ViewState.Remove("Enabled");
else
ViewState["Enabled"]=1;
}
}void SetView(Object o, EventArgs e)
{
Button b = (Button)o;
Response.Write(b.Text + " is clicked<BR>");
Response.Write("Before:" + Enabled.ToString() + "<BR>");
Enabled = b == btnTrue;
Response.Write("After:" + Enabled.ToString());
}void Check(Object o, EventArgs e)
{
Button b = (Button)o;
Response.Write(b.Text + " is clicked<BR>");
Response.Write("Current:" + Enabled.ToString() + "<BR>");
}</script>
<form runat="Server">
<asp:Button id="btnTrue" runat="Server" Text="True" Onclick="SetView"/>
<asp:Button id="btnFalse" runat="Server" Text="False" onclick="SetView"/>
<asp:Button id="btnCheck" runat="Server" Text="Check" onclick="Check"/>
</form>