日期:2014-05-18  浏览次数:20416 次

一个ASP.net 2.0中用户控件的问题


我在一个网站上需要使用用户控件,现在已经可以把用户控件通过程序动态加载到网页上了,但是网页上其他的控件事件却没办法得到这些用户控件中的值。请问怎么才能访问到这些用户控件中的值?


值分两种,一种是在用户控件中声明为public的变量,另一种是来自用户控件里面的一些控件的值。


要和这些控件和变量通讯,也有两种情况,一种是在控件加载时就给一些public变量赋值,当用户控件显示以后根据这个公用变量而改变一些显示参数。另一种是用户控件加载后,需要通过其他控件的事件处理过程获取用户控件中的值。


请问要怎样和用户控件中的变量和控件通讯?


------解决方案--------------------
听不太懂楼主的意思
是不是在页面里可以调用用户控件的变量?
如果是的话,在包含该用户控件的页面里protected UserContro UserControl;

------解决方案--------------------
在用户控件定义一个属性
string type=string.Empty;
public string Type
{
get{return type;}
set{type=value;}
}
在引用用户控件的页面
定义用户用户控件 Right1;
Right1.Type=;

刷新后页面重新绑定了 你的代码不在page_load里面所以就没有了
------解决方案--------------------
还有,为什么我用这样的语句动态加载的用户控件一回发页面就没了?

========

当然是没有了!!!

动态添加的控件,你要保证那段代码每次请求页面都能执行,状态才能保持!
------解决方案--------------------
1.访问控件中的值与控件里面的子控件的值
  值的话,只要public都可以访问,private 或者 protected的,要用公共属性来访问
子控件的值: 每个控件都有一个FindControl方法,如,你的用户控件里有一个TextBox,其ID 为 'TestBox1 ',那么可以这样获取该TextBox的引用
TextBox box = UserControl.FindControl( "TextBox) as TextBox;

2. 与用户控件通信
与用户控件中的public字段或者属性通信,你必须要将用户控件显示转换成用户控件的类型,如:你有一个用户控件:
   用户控件类定义代码如下:
public partial class userControl : System.Web.UI.UserControl
{ ... }
有aspx页面中如下引用属性与public字段
userControl uc = (userControl)Page.LoadControl( "abc.ascx ");
//uc.Property = 访问用户控件的属性或字段

如果与用户控件中的子控件通信的话,没这么麻烦,直接使用用户控件的FindControl来获取子控件的引用即可

------解决方案--------------------
1. 动态装载的控件每次需要在Page的Load或更前阶段重新装载

2. 你的控件应该提供接口,然后由页面代码把这些控件连接起来,譬如有这样一个情形,

控件一采集用户输入的数据,有一个保存按钮,点击按钮后,应该触发第二个控件里某个方法来显示这个数据。

public interface IUserData
{
string UserName { get;}
string Password { get;}
}

public delegate void MyEventHandler(IUserData data)

public interface IInputTrigger
{
event MyEventHandler DataAvailable;
}

控件一大概这么实现

public class YourUserControl1 : UserControl, IUserData, IInputTrigger
{
public string UserName { get { return txtUserName.Text;}}
public string Password { get { return txtPasword.Text;}}

public event MyEventHandler DataAvailable;

//......

private void Button_Clicked(Object sender, EventArgs e)
{
//......
if (DataAvailable != null)
DataAvailable(this);
}
}

显示方法的接口

public interface IDisplayData
{
void Display(IUserData data);
}

控件二大概这么实现


public class YourUserControl2 : UserControl, IDisplayData
{
public void Display(IUserData data)
{
lblName.Text = data.UserName;
}
}

页面这么做

YourUserControl1 ctrl1;
YourUserControl2 ctrl2;

....

void Page_Load(Object sender, EventArgs e)
{
ctrl1.DataAvailable += ctrl2.Display;
}

这样,每个控件还是独立的