在CheckBoxList选择中传递两个值的方法

时间:2015-11-18 22:52:43

标签: c# asp.net webforms

我在学生门户网站上有一个注册向导,学生可以在每个学年选择他们的模块。他们有各种模块可供选择,每个模块都有许多分数,学生根据自己的课程要求限制在一定数量的分数。我在下面的asp.net代码中包含该学年所有可用模块的CheckBoxList module_choice

<asp:View ID="semester_1_view" runat="server">

    <p>CATS points Required:</p>
    <asp:DropDownList ID="cat_points_total" runat="server" DataSourceID="semester" 
        DataTextField="cats_points_total" DataValueField="cats_points_total" 
        Visible="true"></asp:DropDownList>

    <asp:CheckBoxList ID="module_choice" runat="server" DataSourceID="semester" 
        DataTextField="module_name" DataValueField="cats_points"></asp:CheckBoxList>
    <asp:Label ID="sem_1_fb" runat="server" Text=""></asp:Label>
    <asp:Button ID="sem_1_cat" runat="server" Text="Test" OnClick="sem_1_cat_Click" />
    <asp:Button CommandName="NextView" ID="btnnext2" runat="server" Text="Next" 
        OnClick="btnnext2_Click" />
    <asp:Button ID="Button1" runat="server" CommandName="PrevView" Text="Previous" 
        CssClass="submitbtn" />
</asp:View>

目前只传递了cats_points我还想要一些方法来传递所选项目的module_id

然后我有以下C#来计算所选择的猫点总数,并提供反馈是否所选总数等于所需总数。

protected void sem_1_cat_Click(object sender, EventArgs e)
    {
        int catselected = 0;

        for (int i = 0; i < module_choice.Items.Count; i++)
        {
            if (module_choice.Items[i].Selected)
            {
                string value = module_choice.Items[i].Value;
                catselected += int.Parse(value);
            }
        }
        int cattotal = int.Parse(cat_points_total.SelectedValue);
        int catcalc = cattotal - catselected;
        int zero = 0;

        if (catcalc != zero)
        {
            sem_1_fb.Visible = true;
            sem_1_fb.Text = "<b> Not Enough Points</b> cattotal =" + cattotal + " catselected =" + catselected + " catcalc =" + catcalc +".";
        }

        else
        {
            sem_1_fb.Visible = true;
            sem_1_fb.Text = "<b>Point Criteria Met</b> cattotal =" + cattotal + " catselected =" + catselected + " catcalc =" + catcalc +".";
        }
    }

我希望能够检查总数是否正确以及是否将每个选择中的选定module_id插入到具有类似内容的数据库中,但显然目前我还没有module_id仅提供cats_points;

的信息
int count = module_choice.Items.Count;

        for (int i = 0; i < count; i++)
        {
            if (moduleselect.Items[i].Selected)
            {
                string value = module_choice.Items[i].Value;

                String query = "INSERT INTO students_vs_modules (user_id, module_id) 
                VALUES (@user_id, @module_id)";

                SqlCommand myCommand = new SqlCommand(query, myConnection);
                myCommand.Parameters.AddWithValue("@user_id", user);
                myCommand.Parameters.AddWithValue("@module_id", value);

                myCommand.ExecuteNonQuery();
            }
        }

我非常感谢任何帮助,因为我对C#还不熟悉

修改

这是我用来填充module_choice CheckBoxList

的数据源
<asp:SqlDataSource ID="semester" runat="server"
ConnectionString="<%$ ConnectionStrings:ConnectionString %>"
SelectCommand="SELECT modules.module_id, modules.module_name, modules.module_tutor, 
    staff_records.f_name, staff_records.l_name, modules.compulsory, modules.year, 
    modules.cats_points, modules.description, courses.course_name, 
    student_records.user_id, courses.cats_points_total 
    FROM modules 
    INNER JOIN courses_vs_modules ON modules.module_id = courses_vs_modules.module_id 
    INNER JOIN staff_records ON modules.module_tutor = staff_records.user_id 
    INNER JOIN courses ON courses_vs_modules.course_id = courses.course_id 
    INNER JOIN student_records ON courses.course_id = student_records.course_id 
    WHERE (student_records.user_id = @user_id)"
InsertCommand="INSERT INTO [students_vs_modules]([user_id], [module_id]) 
    VALUES (@user_id, @module_id)">
<InsertParameters>
    <asp:Parameter Name="user_id" Type="Int32" />
    <asp:Parameter Name="module_id" Type="Int32" />
</InsertParameters>
<SelectParameters>
    <asp:QueryStringParameter QueryStringField="user_id" Name="user_id" Type="Int32"></asp:QueryStringParameter>
</SelectParameters>
</asp:SqlDataSource>

1 个答案:

答案 0 :(得分:0)

如果我正确理解了您的问题,您希望存储module_id&amp; CheckBoxList&amp;中每个列出的cat_points module_name在选择要获取所选module_id&amp;的复选框时cat_points

开箱即用CheckBoxList有一个DataTextFieldDataValueField(代表要显示的文字和相应的值)。您可以扩展CheckBoxList控件以保留其他值。

但最简单的选择是使用数据源中的分隔符返回连接值,并将其用作DataValueField。现在,当您处理时,您可以拆分选定的值并获取单独的值(在sem_1_cat_Click事件下)

在您的情况下cats_points&amp; module_id可以合并到一个名为mod_id_catpoints的字段中(例如23**345,其中**是分隔符)

在这种情况下,mod_id_catpoints将是您的DataValueField

sem_1_cat_Click event下,您会将23**345分为23345 23 module_id245cat_points