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

使用AJAX ModalPopupExtender时如何保留GridView行引用?

解决ModalPopupExtender弹窗后丢失GridView行引用的方法

方法1:用隐藏字段存储RowID

在页面添加一个隐藏字段,当DropDownList触发OnSelectedIndexChanged事件时,把获取到的RowID存入该字段,弹窗确认时直接读取即可:

<asp:HiddenField ID="hfRowID" runat="server" />

后台代码修改:

DropDownList ddlid = (DropDownList)sender;
GridViewRow gvrow = (GridViewRow)ddlid.NamingContainer;
int rowID = Int32.Parse(GridView1.DataKeys[gvrow.RowIndex].Values[0].ToString());
// 将RowID存入隐藏字段
hfRowID.Value = rowID.ToString();
// 触发弹窗
ModalPopupExtender1.Show();

弹窗确定按钮的点击事件中读取:

int currentRowID = Int32.Parse(hfRowID.Value);
// 执行后续业务逻辑

方法2:绑定RowID到弹窗按钮的CommandArgument

用一个隐藏按钮作为ModalPopupExtender的TargetControlID,在DropDownList的事件里判断需要弹窗时,把RowID赋值给弹窗确定按钮的CommandArgument:

<asp:Button ID="btnHiddenTrigger" runat="server" Style="display:none;" />
<asp:ModalPopupExtender ID="ModalPopupExtender1" runat="server" 
    TargetControlID="btnHiddenTrigger" 
    PopupControlID="pnlPopup">
</asp:ModalPopupExtender>

<asp:Panel ID="pnlPopup" runat="server" CssClass="modalPopup">
    <asp:Button ID="btnConfirm" runat="server" Text="确定" OnClick="btnConfirm_Click" />
    <asp:Button ID="btnCancel" runat="server" Text="取消" OnClick="btnCancel_Click" />
</asp:Panel>

后台代码:

protected void ddlid_SelectedIndexChanged(object sender, EventArgs e)
{
    DropDownList ddlid = (DropDownList)sender;
    GridViewRow gvrow = (GridViewRow)ddlid.NamingContainer;
    int rowID = Int32.Parse(GridView1.DataKeys[gvrow.RowIndex].Values[0].ToString());
    
    // 判断是否需要弹窗
    if (ddlid.SelectedValue == "需要弹窗的项值")
    {
        // 把RowID绑定到确定按钮的CommandArgument
        btnConfirm.CommandArgument = rowID.ToString();
        ModalPopupExtender1.Show();
    }
    else
    {
        // 不需要弹窗的逻辑处理
    }
}

protected void btnConfirm_Click(object sender, EventArgs e)
{
    Button btn = (Button)sender;
    int currentRowID = Int32.Parse(btn.CommandArgument);
    // 执行确认后的逻辑
    ModalPopupExtender1.Hide();
}

protected void btnCancel_Click(object sender, EventArgs e)
{
    ModalPopupExtender1.Hide();
}

方法3:用ViewState存储RowID

如果是同页面回传场景,可以把RowID存入ViewState,弹窗确认时读取:

protected void ddlid_SelectedIndexChanged(object sender, EventArgs e)
{
    DropDownList ddlid = (DropDownList)sender;
    GridViewRow gvrow = (GridViewRow)ddlid.NamingContainer;
    int rowID = Int32.Parse(GridView1.DataKeys[gvrow.RowIndex].Values[0].ToString());
    
    if (ddlid.SelectedValue == "需要弹窗的项值")
    {
        ViewState["CurrentRowID"] = rowID;
        ModalPopupExtender1.Show();
    }
}

protected void btnConfirm_Click(object sender, EventArgs e)
{
    if (ViewState["CurrentRowID"] != null)
    {
        int currentRowID = (int)ViewState["CurrentRowID"];
        // 处理业务逻辑
        ModalPopupExtender1.Hide();
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 19:50:23