3

我已经阅读了很多关于视图状态的文章,但我无法理解它。

基本上我想要两个带有添加和删除按钮和一个继续按钮的列表框。

当按下继续按钮时,前一个被隐藏,并且为第一个列表框中的每个项目显示一个文本框,其中有 2 个下拉框来描述它 + 为第二个列表框中的每个项目提供一个文本框(也供用户添加说明)。

然后我想要一个完成按钮来将所有这些信息保存到数据库中。

到目前为止,我有以下代码:

   <script runat="server">   

    void Page_Load(Object sender, EventArgs e)
    {
        CreateDynamicControls();
        Page.MaintainScrollPositionOnPostBack = true;
        Build2.Visible = false;
        Build3.Visible = false;
        Build4.Visible = false;
        Finish.Visible = false;
    }

    void AddC_Click(Object sender, EventArgs e)
    {
                criteria.Items.Add(addnewc.Text.ToString());
                addnewc.Text = null;
    }

    void RemoveCriterion_Click(Object sender, EventArgs e)
    {
        for (int i = 0; i < criteria.Items.Count; i++)
        {
            if (criteria.Items[i].Selected)
            {
                criteria.Items.Remove(criteria.Items[i]);
                i--;
            }
        }
    }

    void AddAlternative_Click(Object sender, EventArgs e)
    {
                alternatives.Items.Add(addnewa.Text.ToString());
                addnewa.Text = null;
    }

    void RemoveAlternative_Click(Object sender, EventArgs e)
    {
        for (int i = 0; i < alternatives.Items.Count; i++)
        {
            if (alternatives.Items[i].Selected)
            {
                alternatives.Items.Remove(alternatives.Items[i]);
                i--;
            }
        }
    }

    void Continue_Click(Object sender, EventArgs e)
    {
            Build1.Visible = false;
            Build2.Visible = true; 
            Build3.Visible = true;

            CreateDynamicControls();

            Finish.Visible = true;
    }

    void CreateDynamicControls()
    {
        Build2.Controls.Clear();
        Build3.Controls.Clear();

        Build2.Controls.Add(new LiteralControl("<h3>Please define each criterion.</h3><p>By describing it and indicating if it is 1/2 and a/b.</p>"));

        for (int i = 0; i < criteria.Items.Count; i++)
        {
            Build2.Controls.Add(new LiteralControl("<strong>" + criteria.Items[i].Text + "</strong>&nbsp;&nbsp;Description:<br />"));
            TextBox criteriondesc = new TextBox();
            Build2.Controls.Add(criteriondesc);
            criteriondesc.ID = "c" + i.ToString();
            criteriondesc.Rows = 3;
            criteriondesc.Width = 850;
            criteriondesc.TextMode = TextBoxMode.MultiLine;
            Build2.Controls.Add(new LiteralControl("<br />"));

            Build2.Controls.Add(new LiteralControl("Desc1: "));
            DropDownList aim = new DropDownList();
            aim.ID = i.ToString();
            aim.Width = 250;
            aim.Items.Add(new ListItem("1"));
            aim.Items.Add(new ListItem("2"));
            Build2.Controls.Add(aim);

            Build2.Controls.Add(new LiteralControl("&nbsp;&nbsp;&nbsp;&nbsp;Desc2: "));
            DropDownList source = new DropDownList();
            source.ID = i.ToString();
            source.Width = 250;
            source.Items.Add(new ListItem("a"));
            source.Items.Add(new ListItem("b"));
            Build2.Controls.Add(source);

            Build2.Controls.Add(new LiteralControl("<br /><br />"));

        }

        Build3.Controls.Add(new LiteralControl("<h3>Please define each alternative.</h3><p>Please describe each alternaitve in detail.</p>"));

        for (int i = 0; i < alternatives.Items.Count; i++)
        {
            Build3.Controls.Add(new LiteralControl("<strong>" + alternatives.Items[i].Text + "</strong>&nbsp;&nbsp;Description:<br />"));
            TextBox altdesc = new TextBox();
            altdesc.ID = "a" + i.ToString();
            altdesc.Rows = 3;
            altdesc.Width = 850;
            altdesc.TextMode = TextBoxMode.MultiLine;
            Build3.Controls.Add(altdesc);
            Build3.Controls.Add(new LiteralControl("<br />"));
        }

        Build3.Controls.Add(new LiteralControl("<br /><h3>Review dates.</h3><p>Please select a date for a meeting.</p>"));
        OboutInc.Calendar2.Calendar selectdates = new OboutInc.Calendar2.Calendar();
        Build3.Controls.Add(selectdates);
    }

    void Finish_Click(Object sender, EventArgs e)
    {

            Build4.Visible = true;

            foreach (var control in Build2.Controls)
            {
                if (control.GetType() == typeof(TextBox))
                {
                    Build4.Controls.Add(new LiteralControl(((TextBox)control).Text + "<br>"));
                }
            }

            foreach (var control in Build3.Controls)
            {
                if (control.GetType() == typeof(TextBox))
                {
                    Build4.Controls.Add(new LiteralControl(((TextBox)control).Text + "<br>"));
                }
            }

    }
</script>

<asp:Content runat="server" ID="MainContent" ContentPlaceHolderID="MainContent">
    <asp:Panel ID="Build1" runat="server">
    <h3>What is your aim?</h3>
    <p>
        <asp:TextBox ID="goal" runat="server" Width="850px"></asp:TextBox>
    </p>

        <h3>What are the criteria of your decision?</h3>
    <p>
        <asp:ListBox ID="criteria" runat="server" Rows="8" Width="850px"></asp:ListBox><br />
        <asp:Button ID="RemoveCriterion" runat="server" Text="Remove" OnClick="RemoveCriterion_Click" />&nbsp;&nbsp;&nbsp;&nbsp;
        <asp:TextBox ID="addnewc" runat="server" Width="650px"></asp:TextBox>
        <asp:Button ID="AddC" runat="server" Text="Add" OnClick="AddC_Click" />
    </p>

        </p>
        <h3>What are the alternatives of your decision?</h3>

    <p>
        <asp:ListBox ID="alternatives" runat="server" Rows="8" Width="850px"></asp:ListBox><br />
        <asp:Button ID="RemoveAlternative" runat="server" Text="Remove" OnClick="RemoveAlternative_Click" />&nbsp;&nbsp;&nbsp;&nbsp;
        <asp:TextBox ID="addnewa" runat="server" Width="650px"></asp:TextBox>
        <asp:Button ID="AddAlternative" runat="server" Text="Add" OnClick="AddAlternative_Click" />
    </p>
    <p align="right"><asp:Button ID="continue" runat="server" Text="Continue" OnClick="Continue_Click" /></p>


    </asp:Panel>

        <asp:Panel ID="Build2" runat="server">
        </asp:Panel>
            <asp:Panel ID="Build3" runat="server">
        </asp:Panel>
                <asp:Panel ID="Build4" runat="server">
        </asp:Panel>

    <p align="right"><asp:Button ID="Finish" runat="server" Text="Finish" OnClick="Finish_Click" /></p>


</asp:Content>

如您所见,此刻我只是试图从动态创建的文本框字段中输出用户的文本。

但是,我收到了错误

无法加载视图状态。正在加载视图状态的控制树必须与在先前请求期间用于保存视图状态的控制树匹配。例如,当动态添加控件时,回发期间添加的控件必须与初始请求期间添加的控件的类型和位置相匹配。

在:第 169 行:Build3.Controls.Add(altdesc);

有谁知道如何用视图状态解决这个问题?

我对 ASP.NET 很陌生,我的背景主要是 WinForms。

感谢您的任何帮助和建议!!

4

2 回答 2

3

您创建控件为时已晚。您应该在页面的 Init 事件期间创建它们,而不是在页面加载期间创建它们。我建议您阅读有关页面生命周期的信息

于 2013-03-26T15:26:36.257 回答
2

我认为最好的方法是:

protected void Page_Load(Object sender, EventArgs e)
{
    if(!IsPostBack)
    {
        CreateDynamicControls();
    }
}
protected override void LoadViewState(object savedState)
{
    base.LoadViewState(savedState);
    CreateDynamicControls();<br/>
}

小样本:

http://class10e.com/Microsoft/which-method-should-you-add-to-the-web-page http://msdn.microsoft.com/en-us/library/ms178472(v=vs.100 ).aspx

于 2013-12-06T19:38:04.310 回答