2017-07-14 57 views
1

我试图从GridView更新CheckBoxList。但是我有上面提到的错误。更新CheckBoxList时不存在映射对象类型System.Collections.Generic.List

我也有其他的领域,如姓名,性别,年龄,部门在这个形式的代码,但我已经消除了无关的代码,为你们轻松。

以下为GridView的

代码

<div> 
 
      <asp:GridView ID="GridView1" class="table table-striped table-bordered" runat="server" Width="603px" DataKeyNames="Student_ID" OnRowEditing="GridView1_RowEditing" OnRowDeleting="GridView1_RowDeleting" OnRowCancelingEdit="GridView1_RowCancelingEdit" OnRowUpdating="GridView1_RowUpdating" AutoGenerateColumns="False" HorizontalAlign="Center" > <%--OnRowDataBound="GridView1_RowDataBound"--%> 
 
       <Columns> 
 
        <asp:TemplateField HeaderText="Student ID"> 
 
         <EditItemTemplate> 
 
          <asp:Label ID="Label7" runat="server" Text='<%# Eval("Student_ID") %>'></asp:Label> 
 
         </EditItemTemplate> 
 
         <ItemTemplate> 
 
          <asp:Label ID="Label1" runat="server" Text='<%# Eval("Student_ID") %>'></asp:Label> 
 
         </ItemTemplate> 
 
        </asp:TemplateField> 
 
        <asp:TemplateField HeaderText="Subjects"> 
 
         <EditItemTemplate> 
 
         <asp:CheckBoxList ID="CheckBoxList1" runat="server" RepeatDirection="Horizontal" SelectedValue='<%# Eval("SUbjects") %>' > <%--OnSelectedIndexChanged="CheckBoxList1_SelectedIndexChanged--%> 
 
          <asp:ListItem Value="Physics">Physics</asp:ListItem> 
 
          <asp:ListItem Value="Chemistry">Chemistry</asp:ListItem> 
 
          <asp:ListItem Value="Biology">Biology</asp:ListItem> 
 
         </asp:CheckBoxList > 
 
       
 
          
 
        
 
         </EditItemTemplate> 
 
         <ItemTemplate> 
 
          <asp:CheckBoxList ID="CheckBoxList2" runat="server" RepeatDirection="Horizontal" SelectedValue='<%# Eval("SUbjects") %>' > <%--OnSelectedIndexChanged="CheckBoxList1_SelectedIndexChanged--%> 
 
          <asp:ListItem Value="Physics">Physics</asp:ListItem> 
 
          <asp:ListItem Value="Chemistry">Chemistry</asp:ListItem> 
 
          <asp:ListItem Value="Biology">Biology</asp:ListItem> 
 
         </asp:CheckBoxList > 
 
       
 
         </ItemTemplate> 
 
        </asp:TemplateField> 
 
        <asp:CommandField HeaderText="Delete" ShowDeleteButton="True"/> 
 
        <asp:CommandField HeaderText="Edit" ShowEditButton="True" ValidationGroup="update" /> 
 
       </Columns> 
 
      </asp:GridView> 
 
      <asp:SqlDataSource ID="SqlDataSource1" runat="server"></asp:SqlDataSource>

下面是更新

protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e) 
{ 

    int studentid = Convert.ToInt32(GridView1.DataKeys[e.RowIndex].Value.ToString()); 
    CheckBoxList subjects = ((CheckBoxList)GridView1.Rows[e.RowIndex].FindControl("CheckBoxList1")) as CheckBoxList; 

List <string> studentsubjects = new List <string>(); 
foreach (ListItem item in subjects.Items) 
{ 
    if (item.Selected) 
    { 
     studentsubjects.Add(item.Text); 
    } 
} 



    SqlConnection conn = new SqlConnection("Data Source=WINCTRL-0938L38; Database=dbUni; Integrated Security=true"); 
    conn.Open(); 
    SqlCommand cmd = new SqlCommand("StudentUpdate", conn); 
    cmd.CommandType = CommandType.StoredProcedure; 
    cmd.Parameters.AddWithValue("@student_id ", studentid); 
    cmd.Parameters.AddWithValue("@subjects ", studentsubjects); 
    cmd.ExecuteNonQuery(); 
    GridView1.EditIndex = -1; 
    FillGrid(); 
    conn.Close(); 
} 

为GridView的行代码更新复选框列表

回答

0

无马pping存在,你正在更新Liststudentsubjects)发生错误,你必须把它转换成字符串或使用sublist这已经是下面一串代码:

protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e) 
    { 
     int studentid = Convert.ToInt32(GridView1.DataKeys[e.RowIndex].Value.ToString()); 
     CheckBoxList subjects = (CheckBoxList)GridView1.Rows[e.RowIndex].FindControl("CheckBoxList1"); 

     List<string> studentsubjects = new List<string>(); 

     string sublist = ""; 

     foreach (ListItem item in subjects.Items) 
     { 
      if (item.Selected) 
      { 
       studentsubjects.Add(item.Text); 
      } 
     } 

     sublist = string.Join(",", studentsubjects); // add , inside subjects names 

     SqlConnection conn = new SqlConnection("Data Source=WINCTRL-0938L38; Database=dbUni; Integrated Security=true"); 
     conn.Open(); 
     SqlCommand cmd = new SqlCommand("StudentUpdate", conn); 
     cmd.CommandType = CommandType.StoredProcedure; 
     cmd.Parameters.AddWithValue("@student_id ", studentid); 
     cmd.Parameters.AddWithValue("@subjects ", sublist); 
     cmd.ExecuteNonQuery(); 
     GridView1.EditIndex = -1; 
     FillGrid(); 
     conn.Close(); 
    } 

编辑2:删除此属性SelectedValue='<%# Eval("SUbjects") %>'checkboxlist并添加一个Label像:

<EditItemTemplate> 
    <asp:Label ID="lblSubjects" Visible="false" runat="server" Text='<%# Eval("Subjects") %>'></asp:Label> 
    <asp:CheckBoxList ID="CheckBoxList1" runat="server" RepeatDirection="Horizontal"> 
     <%--OnSelectedIndexChanged="CheckBoxList1_SelectedIndexChanged--%> 
     <asp:ListItem Value="Physics">Physics</asp:ListItem> 
     <asp:ListItem Value="Chemistry">Chemistry</asp:ListItem> 
     <asp:ListItem Value="Biology">Biology</asp:ListItem> 
    </asp:CheckBoxList> 
</EditItemTemplate> 

RowDataBound事件:结合您checkboslist从数据库:

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) 
    { 
     if (e.Row.RowType == DataControlRowType.DataRow) 
     { 
      if ((e.Row.RowState & DataControlRowState.Edit) > 0) 
      { 
       CheckBoxList chklist = ((CheckBoxList)e.Row.FindControl("CheckBoxList1")); 
       string subjects = ((Label)e.Row.FindControl("lblSubjects")).Text; 

       List<string> studentsubjects = subjects.Split(',').ToList(); 

       foreach (string item in studentsubjects) 
       { 
        if (item == "Physics") 
         chklist.Items.FindByText("Physics").Selected = true; 
        else if (item == "Chemistry") 
         chklist.Items.FindByText("Chemistry").Selected = true; 
        else 
         chklist.Items.FindByText("Biology").Selected = true; 
       } 
      } 
     } 
    } 

注:不要忘了在GrindView <asp:GridView ID="GridView1" runat="server" OnRowDataBound="GridView1_RowDataBound" >

添加 OnRowDataBound事件
相关问题