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 ==“”并且我得到一个例外。 (如果我使用private int _idBers作为IdBers的基础,结果相同。)
我认为问题在于我的IdBers在游戏后期被分配,因此未保存在视图状态中......
如果不是通过在DetailsBERS.ascx文件中分配其IdBers属性,我应该如何创建/初始化我的BERS控件(IdBers ='&lt;%#DataBinder.Eval(Container,“DataItem.id_bers”)%&gt ;')? (我已经按照jdt199的建议实现了Viewstate,所以这部分已经解决 - 感谢jdt199。)
更重要的是,我在OnInit阶段需要这个值,所以我可以在控件中显示正确的数据 - 这可能吗? (我的标题中提出了问题,但我忘了将其纳入帖子的正文中。)
答案 0 :(得分:1)
如果使用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();
}
答案 1 :(得分:0)
我的最终解决方案是使用ViewState,但诀窍是通过在DataSource属性中设置它来设置此公共属性:
public Object DataSource
{
get { return _datasource; }
set
{
_datasource = value;
if (_datasource != null)
{
此数据从父用户控件传递:
<ucBERS:BERS ID="ucBERS" runat="server"
DataSource="<%# Container.DataItem %>"