C# ASP.NET-初始化在中继器中创建的用户控件的正确方法?

C# ASP.NET-初始化在中继器中创建的用户控件的正确方法?,c#,asp.net,C#,Asp.net,DetailsBERS.ascx文件中的相关代码: <%@ Register Src="BERS.ascx" TagName="BERS" TagPrefix="ucBERS" %> <asp:Repeater ID="repeatBERS" runat="server"><ItemTemplate> <tr> <td id="Td1" runat="server"> <asp:TextBox runat="serve

DetailsBERS.ascx文件中的相关代码:

<%@ Register Src="BERS.ascx" TagName="BERS" TagPrefix="ucBERS" %>


<asp:Repeater ID="repeatBERS" runat="server"><ItemTemplate>
 <tr>
 <td id="Td1" runat="server">
  <asp:TextBox runat="server" ID="txtTest" Text='<%#DataBinder.Eval(Container, "DataItem.id_bers")%>' MaxLength='<%#DataBinder.Eval(Container, "DataItem.id_bers")%>' />
  <ucBERS:BERS ID="ucBERS" runat="server" IdBers='<%#DataBinder.Eval(Container, "DataItem.id_bers")%>' />
 </td>
 </tr>
</ItemTemplate></asp:Repeater>
BERS.ascx.cs文件中的相关代码:

 protected void ddlPartie_SelectedIndexChanged(object sender, EventArgs e)
 {
  IdPartieStage = Convert.ToInt32(ddlPartie.SelectedValue);
  DisplayBers();
  upDetailsBERS.Update();
 }

 private void DisplayBers()
 {
  using (SqlCommand cmd = new SqlCommand(Resources.Select.GetBersList,
   new SqlConnection(ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString)))
  {
   try
   {
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.Parameters.AddWithValue("@idPartieStage", IdPartieStage);
    cmd.Connection.Open();
    SqlDataReader read = cmd.ExecuteReader();

    repeatBERS.DataSource = read;
    repeatBERS.DataBind();
   }
   catch (Exception ex)
   {
    throw new Exception("Could not DisplayBers().", ex);
   }
   finally
   {
    if (cmd != null)
     cmd.Connection.Close();
   }
  }
 }
protected override void OnPreRender(EventArgs e)
 {
  base.OnPreRender(e);

  PopulateControls();
  PopulateBasicBersInfo();
 }

 private int _idBers;
 public int IdBers
 {
  //set { _idBers = value; }
  set { txtTest.Text = value.ToString(); }
  //get { return _idBers; }
  get { return Convert.ToInt32(txtTest.Text); }
 }
好的,现在我的问题源于我对ASP.net的理解薄弱,以及如何使用其初始化和创建控件的创造性方法

如果我使用上面的方法,它会在一开始工作,直到我执行回发(从单击按钮)并再次尝试获取IDBER-txtest.Text==“”时,我会得到一个异常。(如果我使用私有int_IDBER作为IDBER的基础,则结果相同。)

我相信问题在于,我的IDBER在游戏中被分配得很晚,因此没有保存在viewstate中

如果不是通过在DetailsBERS.ascx文件(IdBers='')中指定其IdBers属性,我应该如何创建/初始化我的BERS控件?(此后,我按照jdt199的建议实现了Viewstate,因此这一部分得到了解决——感谢jdt199。)


更重要的是,我需要在OnInit阶段中使用此值,以便在控件中显示正确的数据-这可能吗?(我的标题中提出了一个问题,但我忘了将其包含在文章的正文中。)

如果您使用IdBers属性而不是文本框本身设置viewstate,则可以避免您看到的页面生命周期问题,因为该值是从viewstate读取的

 public int IdBers
 {
     set { VeiwState["IdBers"] = value; }    
     get { 
             int idBerVal = 0;
             if(VeiwState["IdBers"] != null)
             {
                 int.TryParse(VeiwState["IdBers"].ToString(), out idBerVal);
             }
             return idBerVal; 
         }
 }


protected void Page_Load(object sender, EventArgs e)
{
    txtTest.Text = IdBers.ToString();
}

如果使用IdBers属性而不是文本框本身设置viewstate,则可以避免从viewstate读取值时出现的页面生命周期问题

 public int IdBers
 {
     set { VeiwState["IdBers"] = value; }    
     get { 
             int idBerVal = 0;
             if(VeiwState["IdBers"] != null)
             {
                 int.TryParse(VeiwState["IdBers"].ToString(), out idBerVal);
             }
             return idBerVal; 
         }
 }


protected void Page_Load(object sender, EventArgs e)
{
    txtTest.Text = IdBers.ToString();
}

我的最终解决方案是使用ViewState,但诀窍是通过在数据源属性中设置此公共属性:

public Object DataSource
{
    get { return _datasource; }
    set
    {
        _datasource = value;
        if (_datasource != null)
        {
此数据从父用户控件传递:

<ucBERS:BERS ID="ucBERS" runat="server"
    DataSource="<%# Container.DataItem %>"

我的最终解决方案是使用ViewState,但诀窍是通过在数据源属性中设置此公共属性:

public Object DataSource
{
    get { return _datasource; }
    set
    {
        _datasource = value;
        if (_datasource != null)
        {
此数据从父用户控件传递:

<ucBERS:BERS ID="ucBERS" runat="server"
    DataSource="<%# Container.DataItem %>"

当控件尝试基于IDBER填充其字段时,使用Viewstate不会改变事情的顺序。例如,OnInit()激发并尝试使用IDBER(尚未初始化)-引发异常。如果我注释掉有问题的方法,我会发现IDBER将在Page_Load()之后和OnPreRender()之前设置。用户控件在创建时是否有任何方法可以访问传递给它的值?Reframed:Basket.ascx希望创建并填充一组Sandwich.ascx对象。Basket.ascx.cs方法为特定篮子查找两个IdSandwich。如何将每个IdSandwich传递给Sandwich,以便Sandwich.OnInit()在查找IdSandwich==0(数据库中不存在)的成分时不会引发异常?当控件尝试基于IDBER填充其字段时,使用Viewstate不会改变事情的顺序。例如,OnInit()激发并尝试使用IDBER(尚未初始化)-引发异常。如果我注释掉有问题的方法,我会发现IDBER将在Page_Load()之后和OnPreRender()之前设置。用户控件在创建时是否有任何方法可以访问传递给它的值?Reframed:Basket.ascx希望创建并填充一组Sandwich.ascx对象。Basket.ascx.cs方法为特定篮子查找两个IdSandwich。如何将每个IdSandwich传递给Sandwich,以便Sandwich.OnInit()在查找IdSandwich==0(数据库中不存在)的成分时不会引发异常?