我有一个包含多个动态生成的DropDownLists的页面。 DD加载并在页面加载时显示正确的值。但是,当我尝试在回发后检索值时,DD似乎都在维护页面加载时的值。
所有都是在Page_Load中创建的; 没有测试IsPostBack; 处理在下面的代码中处理:
void btnSubmit_Click(object sender, EventArgs e)
{
System.IO.StreamWriter sw = new System.IO.StreamWriter(Server.MapPath("\\") + "\\Logs\\Permissions.log",false);
string szMask = hMask.Value.ToString();
sw.WriteLine("\t\t\t\t\t\t\t" + szMask);
foreach (Control c in Page.Controls)
LoopControls(c, szMask, sw);
sw.Close();
}
private void LoopControls(Control Page, string szMask, System.IO.StreamWriter sw)
{
foreach (Control c in Page.Controls)
{
if (c is DropDownList)
{
string szId = c.ID;
if (szId.StartsWith("ddlPerm"))
{
string[] szSplit = szId.Split(':');
int iMaskPosition = Convert.ToInt32(szSplit[1].ToString());
int iSecurityPermissionID = Convert.ToInt32(szSplit[2].ToString());
DropDownList dd = (DropDownList)c;
string szPermission = dd.SelectedValue.ToString();
if (szMask.Substring(iMaskPosition, 1) != szPermission)
{
sw.WriteLine("NE");
if (iMaskPosition == 0)
szMask = szPermission + szMask.Substring(1);
else
szMask = szMask.Substring(0, iMaskPosition) + szPermission + szMask.Substring(iMaskPosition);
}
sw.WriteLine(szId + "\t\t" + iMaskPosition.ToString() + "\t" + iSecurityPermissionID.ToString() + "\t" + szPermission + "\t\t" + szMask);
}
}
else
{
if (c.Controls.Count > 0)
{
LoopControls(c, szMask, sw);
}
}
}
}
这真让我烦恼。任何帮助将不胜感激。
谢谢, JB
答案 0 :(得分:4)
通常,这个问题可以通过
来解决if (!IsPostback){
// bind all your dropdownlist here
}
否则重新绑定后选定的值将丢失。
答案 1 :(得分:2)
问题可能在于,正如您所说No test for IsPostBack
。您可能每次都会覆盖值和状态。
相反,测试IsPostback并且如果它是真的则不要写出它们。
答案 2 :(得分:2)
在Init和Load事件之间维护ViewState。通过在Load期间创建和填充控件,您基本上在ViewState已经处理完毕后进入。在Init期间创建控件,你应该注意到你的回发值不变。
有关生命周期的每个特定阶段之间和之间发生的事情的更多信息,请参阅以下链接中的信息:http://msdn.microsoft.com/en-us/library/ms178472.aspx
答案 3 :(得分:0)
所有都是在Page_Load中创建的;没有考试 for IsPostBack;处理处理 在代码中
如果您没有测试IsPostBack,那么在每个页面加载时都会重新创建下拉列表。
您需要测试IsPostBack并仅在不是PostBack时创建下拉列表。 AKA - 第一次加载。