我的网页表单页面中复选框和下拉列表值的可用性存在问题。我认为有一些显而易见的东西我无法看到。我的想法可能有误,所以我暂时不会发布整个代码。
我想做什么: 在我的页面上有一个调查(文本框,复选框和下拉列表)和一个滚动固定面板(滚动时它在浏览器窗口中保持相同的位置)。根据所做的选择,固定面板应显示信息。每次取消/选中复选框或选择下拉列表时,此信息都应更新。
我做了什么: 调查是在第一个page_load上以编程方式创建的,并添加到面板(= Panel1)。有两种语言,所以我创建调查的每个项目两次并将其面板存储在浏览器会话中(不知道这是否是实现此目的的正确方法,但它似乎有效)。这意味着我从" langPanels [" EN"]获得了整个英语调查。
Default.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
}
}
Default.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>
[EDIT1:] 创建复选框(this.panel随后被添加到langPanels。方法被称为whithin createLanguagePanels): [/编辑]
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个复选框。单击第一个,固定面板中没有任何反应。单击第二个,面板显示第一个复选框的信息。单击第三个,面板显示第一个和第二个复选框的信息。 [EDIT2:]虽然他们检查的状态仍然存在autoPostBack。[/ EDIT]
答案 0 :(得分:0)
好的我发现了我的错误:
问题是我通过浏览器会话选择绕行。这样,调查的价值仅在第二次回发后才知道。我每次执行回发时都会通过创建调查来解决它:
if (IsPostBack) {
Panel p = createLanguagePanels();
Panel1.Controls.Clear();
Panel1.Controls.Add(p);
}
else {
createLanguageSelectionList();
Panel p = createLanguagePanels();
Panel1.Controls.Clear();
Panel1.Controls.Add(p);
}
我不知道为什么在回发后仍然会选择所选的值(每次都是新建的!?),但他们确实如此。我知道这是一个非常糟糕的解决方案,所以如果有更好的方法,我会很高兴知道他们!