2013-03-26 5 views
3

Я прочитал много статей о viewstate, но я не могу обойти его.Не удалось загрузить viewstate - динамические элементы управления в ASP.NET

В принципе, я хочу иметь два списка с кнопками добавления и удаления и кнопку «Продолжить».

При нажатии кнопки «Приступить» предыдущее скрыто и для каждого элемента в первом списке отображается текстовое поле с двумя раскрывающимися списками, чтобы описать его + текстовое поле для каждого элемента во втором списке (также для пользователю добавить описание).

Затем я хочу кнопку Finalize, чтобы сохранить всю эту информацию в базе данных.

До сих пор у меня есть следующий код:

<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> 

Как вы можете видеть, на минуту я просто пытаюсь вывести текст пользователя из динамически создаваемых полей TextBox.

Однако я получаю ошибку

Не удалось загрузить ViewState. Дерево управления, в которое загружается файл вида , должно совпадать с деревом управления, которое использовалось для сохранения окна просмотра во время предыдущего запроса. Например, при добавлении управление динамически, элементы управления, добавленные во время обратной связи, должны соответствовать типу и положению элементов управления, добавленных во время начального запроса .

по адресу: Линия 169: Build3.Controls.Add (altdesc);

Кто-нибудь знает, как исправить эту проблему с помощью viewstate?

Я очень новичок в ASP.NET, мой фон в основном в WinForms.

Благодарим за помощь и совет !!

+0

Разберитесь с [** управления веб ** с привязкой к данным] (http://msdn.microsoft.com/en-us/library/ms228214. ASPX). –

+0

Поможет ли это с потерями управления? – Richie

+0

Да, потому что это предотвратит вас от таких проблем. Эти элементы управления (re) автоматически создадут динамические элементы управления. Вы можете использовать шаблонные поля, тогда вы можете использовать любой элемент управления. –

ответ

3

Вы слишком поздно создаете свои элементы управления. Вы должны создать их во время событий Init на странице, а не на странице Load. Я предлагаю Вам прочитать ABIT о page life cycle

+0

Я пробовал это, и ошибок не было, но текст из текстовых полей не выводился. Я предположил, что контроль не был создан тогда? – Richie

+0

, если вы видите текстовые поля на странице, они создаются. какой текст вы имеете в виду? что пользователь вводит? потому что я не вижу, чтобы вы что-то связывали с ним – YavgenyP

+0

Да, извините, тестируйте его. Я ввожу некоторые данные в текстовые поля, и это не отображается на третьем экране (как и должно быть из Finish_Click). – Richie

2

Я думаю, что лучший способ сделать это, было бы
охраняемую недействительным Page_Load (отправитель объекта, EventArgs е)
{
      если (! IsPostBack)
      {
            CreateDynamicControls();
     }
}
защищен переопределение недействительными LoadViewState (объект savedState)
{
      базы.LoadViewState (savedState);
      CreateDynamicControls();
}

маленький образец:
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

Смежные вопросы