簡體   English   中英

ASP.NET-初始化在轉發器中創建的用戶控件的正確方法?

[英]ASP.NET - Proper way to initialize a user control created in a repeater?

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>

來自DetailsBERS.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();
   }
  }
 }

BERS.ascx.cs文件中的相關代碼:

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的了解不多,以及如何使用其創造性的方式來初始化和創建控件。

如果我使用上面的方法,它會在開始時起作用,直到我進行回發(通過單擊按鈕)並嘗試再次獲取IdBers-txtTest.Text ==“”並得到一個例外。 (如果我使用私有int _idBers作為IdBers的基礎,則結果相同。)

我認為問題在於我的IdBers在游戲后期分配,因此沒有保存在viewstate中。

如果不通過將其分配給DetailsBERS.ascx文件中的IdBers屬性(IdBers ='<%#DataBinder.Eval(Container,“ DataItem.id_bers”)%>')),我應該如何創建/初始化我的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();
}

我最終的解決方案是使用ViewState,但是訣竅是通過在DataSource屬性中設置此公共屬性來進行設置:

public Object DataSource
{
    get { return _datasource; }
    set
    {
        _datasource = value;
        if (_datasource != null)
        {

此數據從父用戶控件傳遞:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM