在一个页面上自定义控件,填充控件问题

本文关键字:自定义控件 填充 问题 控件 一个 | 更新日期: 2023-09-27 18:06:03

这个问题延续了我之前发布的两个问题:

1)如何从。ascx在另一个。ascx得到变量?

2) c# asp.net文本框。文本不设置?

我的第三个问题是,当我创建一个会话,并通过从ParentControl到ChildControl解析信息,然后尝试解析不同的信息到ChildControl的不同实例,它将值从第二个子控件复制到第一个子控件。

更新:显示。ascx页面,我错过了可能相关的

ParentControl.ascx

<asp:PlaceHolder runat="server" id="ShowHideControls" Visible="false">    
    <asp:PlaceHolder runat="server" id="instanceOne" Visible="false">
        <uc1:ChildControl ID="controlOne" runat="server" />
    </asp:PlaceHolder>        
    <asp:PlaceHolder runat="server" id="instanceTwo" Visible="false">
        <uc1:ChildControl ID="controlTwo" runat="server" />
    </asp:PlaceHolder>
</asp:PlaceHolder>

ParentControl.ascx.cs

public void CreateSessionsAddressString(User user)
{
    if (user == user)
        Session["user"] = user;
}

instanceOne ChildControl.ascx.cs

public void SetUserDetails()
{   
    User user = Session["user"] as User;
    string fullAddress = User.fullAddress;
}

现在,如果我有同一个用户控件的第二个实例,则重用以下代码:

instanceTwo ChildControl.ascx

public void SetUserDetails()
{   
    User user = Session["user"] as User;
    string fullAddress = user.fullAddress;
}

在instanceTwo上,当调用set方法来更新信息时,instanceOne似乎用来自instanceTwo的数据填充自己。我怎样才能避免这种情况的发生?


更新:添加更多信息以帮助解决下面的问题。

在我们的解决方案中,我们有一个拥有一个帐户的用户,每个帐户可以有一个额外的用户。我执行一个检查,看看user1和user2是否不为空。

如果user1为真,user2为空,那么我没有问题。当user1 &我在获取信息时遇到了一个问题,因为当我调用获取用户信息的方法时,它似乎覆盖了用户控件中的user1信息。

我需要像一些用户建议的那样包装代码,这样它只影响自己,而不影响同一页面上的其他控件。我今天会浏览一些建议,并尽量尽快回复你们的意见。


更新我引用了之前我问的一个问题

1)如何从。ascx在另一个。ascx得到变量?

我想周五晚上不是我最好的时候,我基本上在子控件中创建了一个公共方法,在父控件中我可以为每个实例调用公共方法所以我可以输入:

  instanceOne.MyMethod();
  instanceTwo.MyMethod();

这似乎是一个很好的工作,并帮助我避免使用会话是很好的。我要请求删除这个问题,因为我的解决方案已经在前面的问题中了。

在一个页面上自定义控件,填充控件问题

我认为你遇到了这个问题,因为你正在从会话中拉动用户对象,而你正在创建的用户实例仍然指向存储在会话中的对象引用。

试试这样写:

string fullAddress = String.Copy(User.FullAddress);

你也可以这样做:

private string fullAddress;
public string FullAddress
{
    get { return fullAddress; }
    set { fullAddress = String.Copy(value); }
}
public void SetUserDetails()    
{           
    User user = Session["user"] as User;        
    this.FullAddress = user.fullAddress;   
    this.FullAddress = "Hello world!"; 
}

在instanceTwo上,当调用set方法更新信息时,instanceOne似乎用来自instanceTwo的数据填充自己。

如果你的set操作更新了Session中的User实例,那么在回发时,如果你的代码调用了 childControl.SetUserDetails(),你会看到两个控件都更新了。尝试将对SetUserDetails()的调用包装在if(!Page.IsPostBack)块中,或者在Session中创建两个可以更新的独立实例。如果您只在初始加载页面时设置子控件上的值,那么您应该在回发时看到不同的值。

另外,请注意,我只是试图回答被问到的问题。这里可能有一个更好的设计,但我真的不明白你想要完成什么。