列出<student>的DataBind Repeater无法更新数据 - PostBack </student>

时间:2012-09-30 18:19:53

标签: asp.net list data-binding postback repeater

我正在尝试创建一个非常简单的ASP.NET页面,允许用户输入学生数据。提交表单时,将更新学生对象列表,并且Repeater(数据绑定到列表)将反映新数据。用户应该能够继续添加新学生。

我的执行失败。我不知道为什么。我尝试多次更改回发和数据绑定方法。

   /*
     * Student class representing a real-life student.
     */
    public class Student
    {

        /* Override default constructor */
        public Student(string first, string last, string studentid, string program, string option)
        {
            FName = first;
            LName = last;
            STID = studentid;
            Program = program;
            Option = option;
        }

        /* Property for the student's first name */
        public string FName
        {
            set; get;
        }

        /* Property for the student's last name */
        public string LName 
        {
            set; get;         
        }

        /* Property for the student ID */
        public string STID
        {
            set; get;
        }

        /* Property for the program of study */
        public string Program
        {
            set; get;
        }

        /* Property for the option within the program of study */
        public string Option
        {
            set; get;
        }

    }

    /* Class for the web form UI */
    public partial class _Default : System.Web.UI.Page
    {

        /* List of students to be displayed in the repeater control */
        private List<Student> myStudents;

        protected void Page_Load(object sender, EventArgs e)
        {

            myStudents = new List<Student>();



            /* Check postback value when the page loads - this is the first time */
            if (IsPostBack == false)
            {
                /* Bind the Collection to the Repeater control */
                Label1.Text = "" + myStudents.Count;
                Repeater1.DataSource = myStudents;
                Repeater1.DataBind();
            }


        }

        /* 
         * Submit button clicked to submit the form.
         */
        protected void Button2_Click(object sender, EventArgs e)
        {

            /* The forum has passed all of the validation rules for this case and we can add a new student to the list */
             if(Page.IsValid) {

                /*if its valid then create a new student object to put into the list of students
                  get the data from POST*/
                 myStudents.Add(new Student(FNameTextBox.Text, LNameTextBox.Text, SIDTextBox.Text, POSDropDownList.SelectedItem.Text, POListBox.SelectedItem.Text));

                 Label1.Text = "" + myStudents.Count;


              }

        }
    }

以下是Repeater的代码:

<asp:Repeater ID="Repeater1" runat="server">
  <HeaderTemplate>
         <table border="1">
            <tr>
               <td><b>First Name</b></td>
               <td><b>Last Name</b></td>
               <td><b>Student ID</b></td>
               <td><b>Program</b></td>
               <td><b>Option</b></td>
            </tr>
      </HeaderTemplate>

      <ItemTemplate>
         <tr>
            <td> <%# DataBinder.Eval(Container.DataItem, "FName")%> </td>
            <td> <%# DataBinder.Eval(Container.DataItem, "LName") %> </td>
            <td> <%# DataBinder.Eval(Container.DataItem, "STID")%> </td>
            <td> <%# DataBinder.Eval(Container.DataItem, "Program") %> </td>
            <td> <%# DataBinder.Eval(Container.DataItem, "Option") %> </td>
         </tr>
      </ItemTemplate>

      <AlternatingItemTemplate>
        <tr bgcolor="#e8e8e8">
          <td> <%# DataBinder.Eval(Container.DataItem, "FName")%> </td>
            <td> <%# DataBinder.Eval(Container.DataItem, "LName") %> </td>
            <td> <%# DataBinder.Eval(Container.DataItem, "STID")%> </td>
            <td> <%# DataBinder.Eval(Container.DataItem, "Program") %> </td>
            <td> <%# DataBinder.Eval(Container.DataItem, "Option") %> </td>
        </tr>
       </AlternatingItemTemplate>

      <SeparatorTemplate>
        <tr>
        <td colspan="5"><hr /></td>
        </tr>
      </SeparatorTemplate>

      <FooterTemplate>
         </table>
      </FooterTemplate>
</asp:Repeater>

3 个答案:

答案 0 :(得分:2)

在将新学生添加到数据源之前完成DataBind。

添加

Repeater1.DataBind();

在Click事件中。

答案 1 :(得分:0)

我已经重构了你的代码,现在它应该可以工作了

/* Class for the web form UI */
public partial class _Default : System.Web.UI.Page
{

    /* List of students to be displayed in the repeater control */
    private List<Student> myStudents = new List<Student>();

    protected void Page_Load(object sender, EventArgs e){

        /* Check postback value when the page loads - this is the first time */
        if (IsPostBack == false){
          this.bindRepeater();
        }
    }

 private void bindRepeater(){
  /* Bind the Collection to the Repeater control */
            Repeater1.DataSource = myStudents;
            Repeater1.DataBind();
            Label1.Text = "" + myStudents.Count;
            }

    /* 
     * Submit button clicked to submit the form.
     */
    protected void Button2_Click(object sender, EventArgs e)
    {

        /* The forum has passed all of the validation rules for this case and we can add a new student to the list */
         if(Page.IsValid) {

            /*if its valid then create a new student object to put into the list of students
              get the data from POST*/
             myStudents.Add(new Student(FNameTextBox.Text, LNameTextBox.Text, SIDTextBox.Text, POSDropDownList.SelectedItem.Text, POListBox.SelectedItem.Text));
             this.bindRepeater();


          }

    }
}

答案 2 :(得分:0)

我弄清楚为什么我们不能保留这些价值观。我们需要利用会话。在进行任何数据绑定之前,需要声明会话。