2017-07-14 35 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事件
相關問題