You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Web Form实现院校偏好优先级选择功能方案咨询

实现方案

1. 前端页面结构调整

把GridView中原下拉框的模板列替换为隐藏域+自定义选择框的结构,代码如下:

<asp:GridView ID="gdvAcadSelec" runat="server" AutoGenerateColumns="False"
            DataKeyNames="acad_Id" DataSourceID="srcAcademy"
            OnRowDataBound="gdvAcadSelec_RowDataBound"
            CssClass="table table-striped table-bordered"
            EnableViewState="False">
            <Columns>
                <asp:BoundField DataField="acad_name"
                    HeaderText="Academy" SortExpression="acad_name" />
                <asp:TemplateField HeaderText="优先级选择">
                    <ItemTemplate>
                        <!-- 存储院校ID和优先级的隐藏域,未选中时优先级值为0 -->
                        <asp:HiddenField ID="hfAcadId" runat="server" Value='<%# Eval("acad_Id") %>' />
                        <asp:HiddenField ID="hfPriority" runat="server" Value="0" />
                        <!-- 模拟复选框的可点击选择框 -->
                        <div class="priority-box" data-acad-id='<%# Eval("acad_Id") %>'></div>
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>
</asp:GridView>
<asp:ObjectDataSource ID="srcAcademy"
    TypeName="dataAccessLayer"
    SelectMethod="getAcademy"
    runat="server" />
<!-- 提交保存按钮 -->
<asp:Button ID="btnSave" runat="server" Text="保存选择" OnClick="btnSave_Click" CssClass="btn btn-primary mt-3" />

补充对应的样式代码,实现选择框的基础样式:

.priority-box {
    width: 24px;
    height: 24px;
    border: 1px solid #999;
    border-radius: 2px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    cursor: pointer;
    background: #fff;
    user-select: none;
    font-size: 14px;
}
.priority-box.selected {
    background: #165DFF;
    color: #fff;
    border-color: #165DFF;
}

2. 交互逻辑实现

引入jQuery后添加以下JS代码,实现自动分配优先级、自动补空缺的逻辑:

$(function(){
    // 维护已选优先级的集合,空缺位置用null占位
    let priorityList = [];

    // 如果有历史已选数据,初始化集合
    $(".priority-box.selected").each(function(){
        const priority = parseInt($(this).text());
        const acadId = $(this).data("acad-id");
        priorityList[priority - 1] = acadId;
    })

    // 绑定选择框点击事件
    $(".priority-box").click(function(){
        const $box = $(this);
        const $hfPriority = $box.siblings("[id$=hfPriority]");
        const currentPriority = parseInt($hfPriority.val());

        // 未选中状态,点击后执行选中逻辑
        if(currentPriority === 0){
            // 查找最小的空缺优先级
            let newPriorityIndex = priorityList.findIndex(val => val === null);
            if(newPriorityIndex === -1){
                // 没有空缺就追加到末尾
                newPriorityIndex = priorityList.length;
                priorityList.push($box.data("acad-id"));
            }else{
                // 有空缺就填充空缺
                priorityList[newPriorityIndex] = $box.data("acad-id");
            }
            const showPriority = newPriorityIndex + 1;
            $box.text(showPriority).addClass("selected");
            $hfPriority.val(showPriority);
        }
        // 已选中状态,点击后执行取消逻辑
        else{
            // 对应优先级位置留空
            const index = currentPriority - 1;
            priorityList[index] = null;
            $box.text("").removeClass("selected");
            $hfPriority.val(0);
        }
    })
})

3. 后端保存逻辑

提交时遍历GridView行获取选中数据,写入tblAcademy_selection表即可:

protected void btnSave_Click(object sender, EventArgs e)
{
    // 替换为当前登录用户的学生ID
    int currentStudentId = 1;
    // 先删除当前学生的原有选择,避免重复数据
    DeleteStudentOldSelection(currentStudentId);

    foreach (GridViewRow row in gdvAcadSelec.Rows)
    {
        HiddenField hfAcadId = row.FindControl("hfAcadId") as HiddenField;
        HiddenField hfPriority = row.FindControl("hfPriority") as HiddenField;
        int priority = Convert.ToInt32(hfPriority.Value);
        if (priority > 0)
        {
            int acadId = Convert.ToInt32(hfAcadId.Value);
            // 执行插入操作,写入stud_id、Acad_id、order_preference三个字段
            InsertAcademySelection(currentStudentId, acadId, priority);
        }
    }
}

// 如果有编辑场景,在RowDataBound事件中初始化历史选择的选中状态即可
protected void gdvAcadSelec_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        // 此处可以查询当前学生的已选数据,给hfPriority赋值、给priority-box加selected类和优先级文本
    }
}

内容的提问来源于stack exchange,提问作者DeathStriker2

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 18:06:02