ASP.NET 复选框值仅在第二次回发后可用
本文关键字:第二次 NET 复选框 ASP | 更新日期: 2023-09-27 17:56:03
我的网络表单页面中复选框和下拉列表的值的可用性有问题。我认为有一些明显的东西是我看不到的。我的想法可能有错误,所以我暂时不会发布整个代码。
我想做什么:在我的页面上,有一个调查(文本框,复选框和下拉列表)和一个滚动固定面板(滚动时它保持在浏览器窗口中的相同位置)。根据所做的选择,固定面板应显示信息。每次取消/选中复选框或选中下拉列表时,此信息都应更新。
我做了什么:调查在第一个page_load以编程方式创建,并添加到面板 (=Panel1)。有两种语言,所以我创建了调查的每个项目两次,并将其面板存储在浏览器会话中(不知道这是否是实现这一目标的正确方法,但它似乎有效)。这意味着我从"langPanel["EN"]获得整个英语调查。
默认值.aspx.cs:
protected void Page_Load(object sender, EventArgs e) {
if (IsPostBack) {
langPanels = (Dictionary<String,Panel>) HttpContext.Current.Session["panels"];
Panel1.Controls.Clear();
Panel1.Controls.Add(langPanels[SelectLanguage.SelectedValue]);
updateQuestions(); //Survey is evaluated and information is stored in weigthDictionary and blockedResults
ranking.Text = PrintKeysAndValues(weigthDictionary, blockedResults);
}
else {
createLanguageSelectionList(); //Here the dropdown for the different languages is created
createLanguagePanels(); //Here all language surveys are created and stored to the current session
}
}
默认值.aspx:
<%@ Page Title="Welcome" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="class._Default" %>
<asp:Content ID="BodyContent" ContentPlaceHolderID="BodyContent" runat="server">
<asp:DropDownList ID="SelectLanguage" runat="server" AutoPostBack="true" OnSelectedIndexChanged="SelectLanguage_Change"/><br />
<asp:Panel ID="Panel1" runat="server"/>
</asp:Content>
[编辑1:]创建复选框(this.panel随后被添加到langPanel中。方法称为whithin createLanguagePanel):[/编辑]
private void asp_createCheckboxQuestion(String question, String questionID, String[] checkboxes, String[] answerIDs) {
Label questionLabel = new Label();
questionLabel.Text = question;
this.panel.Controls.Add(questionLabel);
this.panel.Controls.Add(new LiteralControl("<br />"));
CheckBoxList checkBoxList = new CheckBoxList();
checkBoxList.ID = questionID;
checkBoxList.AutoPostBack = true;
checkBoxList.CellPadding = 5;
checkBoxList.CellSpacing = 5;
checkBoxList.RepeatColumns = 1;
checkBoxList.RepeatDirection = RepeatDirection.Vertical;
checkBoxList.RepeatLayout = RepeatLayout.Table;
checkBoxList.TextAlign = TextAlign.Right;
checkBoxList.EnableViewState = true;
for (int i = 0; i < checkboxes.Length; i++) {
ListItem item = new ListItem();
item.Text = checkboxes[i];
item.Value = answerIDs[i];
checkBoxList.Items.Add(item);
}
this.panel.Controls.Add(checkBoxList);
this.panel.Controls.Add(new LiteralControl("<br />"));
}
一切都很好,除了固定面板中的信息仅在我单击第二个复选框后可用。例如,有 3 个复选框。单击第一个,固定面板中没有任何反应。单击第二个复选框,面板将显示第一个复选框的信息。单击第三个复选框,面板将显示第一个和第二个复选框的信息。[编辑2:]尽管它们的检查状态通过自动回发持续存在。[/编辑]
我发现了我的错误:
问题是我选择了通过浏览器会话绕道而行。这样,只有在第二次回发后才能知道调查的值。我通过在每次执行回发时创建调查来解决它:
if (IsPostBack) {
Panel p = createLanguagePanels();
Panel1.Controls.Clear();
Panel1.Controls.Add(p);
}
else {
createLanguageSelectionList();
Panel p = createLanguagePanels();
Panel1.Controls.Clear();
Panel1.Controls.Add(p);
}
我不知道为什么回发后仍然选择选定的值(它们每次都是新创建的!?),但它们确实如此。我知道这是一个糟糕的解决方案,所以如果有更好的方法,我将不胜感激!