代码之家  ›  专栏  ›  技术社区  ›  Muhammad Ali

对象类型System.Collections.Generic不存在映射。更新复选框列表时列出

  •  1
  • Muhammad Ali  · 技术社区  · 7 年前

    我正在尝试从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>

    以下是GridView行更新的代码

     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();
     }
    

    更新复选框列表

    1 回复  |  直到 7 年前
        1
  •  0
  •   youpilat13 Ty Petrice    7 年前

    不存在映射错误 当您正在更新 List ( studentsubjects 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;
                    }
                }
            }
        }
    

    注: OnRowDataBound GrindView中的事件 <asp:GridView ID="GridView1" runat="server" OnRowDataBound="GridView1_RowDataBound" >