我要将自定义控件杀无赦! 各位高手有没有兴趣?? 来帮我捅几刀!

monkey_zeng 2002-09-05 11:55:19
using System;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.ComponentModel;

namespace testcontrol
{
public class WebCustomControl1 : WebControl
{
TextBox txtTemp=new TextBox();

public WebCustomControl1()
{
txtTemp.Width=Unit.Parse("100");
txtTemp.Height=Unit.Parse("30");
txtTemp.EnableViewState=true;
}

protected override void CreateChildControls()
{
this.Controls.Add(txtTemp);
}

public override bool Enabled
{
get
{
return txtTemp.Enabled;
}
set
{
txtTemp.Enabled=value;
}
}

public string Text
{
get
{
return txtTemp.Text;
}
set
{
txtTemp.Text=value;
}
}
}
}
自定义控件代码如上;

在使用该控件的页面上有两个按钮:Button1,Button2,和自定义控件myControl.
1.在Button1_Click中myControl.Enabled=false;myControl.Text="false";现在myControl不可用,也不可写
2.然后点击Button2(不做任何操作),myControl的Text不见了,并且变成可写.

为什么??为什么?? 我真的想捅死自定义控件!
...全文
166 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
芹菜大哥 2002-09-14
  • 打赏
  • 举报
回复
不错。
monkey_zeng 2002-09-05
  • 打赏
  • 举报
回复
sheyanfen(星宇)
你越说越复杂了.
evonne_feng 2002-09-05
  • 打赏
  • 举报
回复
你在自定义控件中没有作postback数据处理,看看这个,对你应该有所帮助:

若要使控件能够检查客户端发回的窗体数据,控件必须实现 System.Web.UI.IPostBackDataHandler 接口。此接口的协定允许控件确定是否在回发后改变其状态以及引发相应的事件。IPostBackDataHandler 接口包含两个方法。

[C#]
public interface IPostBackDataHandler{
public bool LoadPostData(string postDataKey,
NameValueCollection postCollection);
public void RaisePostDataChangedEvent();
}
回发后,页框架在发送的内容中搜索与实现 IPostBackDataHandler 的服务器控件的 UniqueID 匹配的值。然后,页框架按顺序在每个实现该接口的控件上调用 LoadPostData。LoadPostData 的两个参数是:标识控件的关键字以及包含发送数据的集合 NameValueCollection。通常实现 LoadPostData,以便在回发后更新控件的状态。以下示例说明用于自定义文本框 (TextBox) 控件的 LoadPostData 实现。

[C#]
public virtual bool LoadPostData(string postDataKey, NameValueCollection postCollection) {
string presentValue = Text;
string postedValue = postCollection[postDataKey];

if (!presentValue.Equals(postedValue)){
Text = postedValue;
return true;
}
return false;
}
如果控件状态因回发而更改,则 LoadPostData 返回 true;否则返回 false。页框架跟踪所有返回 true 的控件并在这些控件上调用 RaisePostDataChangedEvent。更改事件(如果有)就是从该方法引发的。因此,回发数据处理分两个阶段进行——更新状态和引发更改通知。这可防止在加载回发数据过程中引发更改通知,在该过程中,更改通知可能在各控件加载回发数据之前错误地修改状态。以下代码片段显示了用于自定义文本框 (TextBox) 控件的 RaisePostDataChanged 实现。

[C#]
public virtual void RaisePostDataChangedEvent() {
OnTextChanged(EventArgs.Empty);
}
sheyanfen 2002-09-05
  • 打赏
  • 举报
回复
呵呵,可以了,参考一下

using System;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.ComponentModel;

namespace testcontrol
{
public class WebCustomControl1 : WebControl, INamingContainer
{

public WebCustomControl1()
{
this.Width=Unit.Parse("100");
this.Height=Unit.Parse("30");
//txtTemp.EnableViewState=true;
}

protected override void CreateChildControls()
{
TextBox txtTemp=new TextBox();
txtTemp.ID="txtTemp";
this.Controls.Add(txtTemp);
}

public override bool Enabled
{
get
{
return ((TextBox)FindControl("txtTemp")).Enabled;
}
set
{
((TextBox)FindControl("txtTemp")).Enabled=value;
}
}

public string Text
{
get
{
return ((TextBox)FindControl("txtTemp")).Text;
}
set
{
((TextBox)FindControl("txtTemp")).Text=value;
}
}
}
}
sheyanfen 2002-09-05
  • 打赏
  • 举报
回复
不过有点奇怪,两个按钮,Button1让它可编辑,Button2让它不可编辑
点击Button1,再点击Button2,正常
但是只要让它不可编辑了,再点其他的就不起作用了?
monkey_zeng 2002-09-05
  • 打赏
  • 举报
回复
icyer():
行得通吗?我试过这样做,但好像行不通.
如果你有空,麻烦在我的代码里面添几句.
icyer 2002-09-05
  • 打赏
  • 举报
回复
把Enabled保存到ViewState里面。
monkey_zeng 2002-09-05
  • 打赏
  • 举报
回复
sheyanfen(星宇)
你copy我自定义控件吗?
sheyanfen 2002-09-05
  • 打赏
  • 举报
回复
奇怪了,我按你说的做了,不会啊,点击Button1,TextBox变成不可编辑的,而且值为false,点击Button2,它没有改变啊!
monkey_zeng 2002-09-05
  • 打赏
  • 举报
回复
sheyanfen(星宇)
按钮2当然可以对它操作,只是我这里说的是:自定义在页面被刷新了过后,属性值被变化了.
sheyanfen 2002-09-05
  • 打赏
  • 举报
回复
还是不大明白你的问题是什么?按钮1可以对自定义控件操作,按钮2不可以吗?
monkey_zeng 2002-09-05
  • 打赏
  • 举报
回复
sheyanfen(星宇)
这个我早就做过了.

不解决问题,誓不结贴!
望各位兄台成全.
monkey_zeng 2002-09-05
  • 打赏
  • 举报
回复
to sheyanfen(星宇)
其实我的控件已经写成这个样子了.

不解决这个问题
誓不结贴!
lwk 2002-09-05
  • 打赏
  • 举报
回复
up
sheyanfen 2002-09-05
  • 打赏
  • 举报
回复
呵呵,试试这样:
public class WebCustomControl1 : WebControl, INamingContainer
bluefish922 2002-09-05
  • 打赏
  • 举报
回复
这么残忍呀,我帮你煽风点火
monkey_zeng 2002-09-05
  • 打赏
  • 举报
回复
sheyanfen(星宇)的FindControls行得通.得分.

icyer()用ViewState维护状态的方法还值得考究.不过将this.Controls.Add(txtTemp);放到构造函数中的方法也是很好的.行得通.得分了.

evonne_feng(evonne)也很感谢!虽然没有直接解决我的问题,也让我得到另外的东西.谢谢!

也谢谢其他捧场的兄弟们!!(双手抱拳,高高举起)"多谢!多谢......"


***结贴啦,另外一个问题我还要开贴,到时请大家赏光呀!


哼歌.......
俺们那嘎都是东北人!

俺们那嘎特产高丽参!

俺们那嘎猪肉炖粉条!

俺们那嘎都是活雷锋!

.........
monkey_zeng 2002-09-05
  • 打赏
  • 举报
回复
顺便问一下,在自定义控件中定义的ViewState,如果我在一个页面上使用多个这个自定义控件,不知道ViewState的值会不会只是同一个呢?
比如:
control1,control2都是我的自定义控件.
control1中的ViewState["gg"]被赋成"1",
control2中的ViewState["gg"]被赋成"2",
现在ViewState["gg"]是什么值?还是有两个ViewState["gg"]??
monkey_zeng 2002-09-05
  • 打赏
  • 举报
回复
顺便问一下,在自定义控件中定义的ViewState,如果我在一个页面上使用多个这个自定义控件,不知道ViewState的值会不会只是同一个呢?
比如:
control1,control2都是我的自定义控件.
control1中的ViewState["gg"]被赋成"1",
control2中的ViewState["gg"]被赋成"2",
现在ViewState["gg"]是什么值?还是有两个ViewState["gg"]??
angel_lee 2002-09-05
  • 打赏
  • 举报
回复
gz:)
加载更多回复(7)

62,046

社区成员

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

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

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

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