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

时间:2014-04-02 11:36:28

标签: c# asp.net webforms autopostback

我的网页表单页面中复选框和下拉列表值的可用性存在问题。我认为有一些显而易见的东西我无法看到。我的想法可能有误,所以我暂时不会发布整个代码。

我想做什么: 在我的页面上有一个调查(文本框,复选框和下拉列表)和一个滚动固定面板(滚动时它在浏览器窗口中保持相同的位置)。根据所做的选择,固定面板应显示信息。每次取消/选中复选框或选择下拉列表时,此信息都应更新。

我做了什么: 调查是在第一个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]

1 个答案:

答案 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);
}

我不知道为什么在回发后仍然会选择所选的值(每次都是新建的!?),但他们确实如此。我知道这是一个非常糟糕的解决方案,所以如果有更好的方法,我会很高兴知道他们!