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:]尽管它们的检查状态通过自动回发持续存在。[/编辑]

ASP.NET 复选框值仅在第二次回发后可用

好的,

我发现了我的错误:

问题是我选择了通过浏览器会话绕道而行。这样,只有在第二次回发后才能知道调查的值。我通过在每次执行回发时创建调查来解决它:

if (IsPostBack) {
  Panel p = createLanguagePanels();
  Panel1.Controls.Clear();
  Panel1.Controls.Add(p);
}
else {
  createLanguageSelectionList();
  Panel p = createLanguagePanels();
  Panel1.Controls.Clear();
  Panel1.Controls.Add(p);
}

我不知道为什么回发后仍然选择选定的值(它们每次都是新创建的!?),但它们确实如此。我知道这是一个糟糕的解决方案,所以如果有更好的方法,我将不胜感激!