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

如何一键实现Ag-Grid选中行删除、表格刷新及存入新DataFrame?

解决方案:单次按钮点击完成Ag-Grid选中行删除、刷新及存档

当然可以通过一次按钮点击完成所有你需要的操作!你之前的代码问题在于使用了onRowSelected这个JavaScript事件,导致选中行时就立刻触发删除逻辑,而不是通过按钮来控制时机。下面是完整的实现方案:

核心思路

  1. 用Streamlit的按钮作为操作触发点,替代Ag-Grid的行选中自动触发
  2. 利用Streamlit的st.session_state来持久化存储原表格数据和被删除的行数据(避免页面刷新后数据丢失)
  3. 从Ag-Grid的返回结果中获取选中行,完成「存档-删除-刷新」的流程

完整代码示例

import streamlit as st
import pandas as pd
from st_aggrid import AgGrid, GridOptionsBuilder, JsCode

# 初始化Session State,保存原数据和已删除数据
if 'original_df' not in st.session_state:
    st.session_state.original_df = pd.read_excel('test.xlsx', sheet_name='base_table')
if 'deleted_df' not in st.session_state:
    st.session_state.deleted_df = pd.DataFrame(columns=st.session_state.original_df.columns)

# 构建Ag-Grid配置(移除onRowSelected事件,避免自动删除)
gb_base = GridOptionsBuilder.from_dataframe(
    st.session_state.original_df,
    enableRowGroup=True,
    editable=True,
    groupable=True
)
gb_base.configure_pagination(enabled=True, paginationAutoPageSize=False, paginationPageSize=20)
gb_base.configure_selection('multiple', use_checkbox=True)  # 保留多选复选框
grid_options_base = gb_base.build()

# 渲染Ag-Grid表格
table_base = AgGrid(
    st.session_state.original_df,
    gridOptions=grid_options_base,
    allow_unsafe_jscode=True,
    fit_columns_on_grid_load=True,
    key='base_grid'  # 给表格加key,确保数据更新时能刷新
)

# 添加删除按钮
if st.button("删除选中行并存档"):
    # 获取选中的行数据
    selected_rows = table_base['selected_rows']
    if selected_rows:
        # 将选中行转为DataFrame
        selected_df = pd.DataFrame(selected_rows)
        # 把选中行添加到已删除数据中
        st.session_state.deleted_df = pd.concat([st.session_state.deleted_df, selected_df], ignore_index=True)
        # 从原数据中删除选中行(这里假设原数据的索引是唯一的,或者用唯一列匹配)
        # 如果原数据有唯一ID列,建议用ID匹配更稳妥,比如:
        # st.session_state.original_df = st.session_state.original_df[~st.session_state.original_df['id'].isin(selected_df['id'])]
        # 这里先用索引匹配示例:
        st.session_state.original_df = st.session_state.original_df.drop(selected_df.index)
        # 刷新页面(Streamlit会自动重跑,表格会更新)
        st.experimental_rerun()
    else:
        st.warning("请先选中要删除的行!")

# 可选:展示已删除的行数据
with st.expander("查看已删除的行"):
    AgGrid(st.session_state.deleted_df)

关键细节说明

  • Session State的作用:Streamlit每次交互都会重新运行整个脚本,所以必须用st.session_state来保存original_df和deleted_df,否则每次刷新页面数据都会回到初始状态。
  • 移除onRowSelected事件:你之前的JS代码会在选中行时立即删除,现在我们把删除逻辑移到按钮点击事件里,完全由用户控制时机。
  • 表格刷新:给Ag-Grid加上key='base_grid',当original_df更新时,Streamlit会识别到key对应的组件需要重新渲染,从而实现表格刷新。
  • 行匹配逻辑:示例中用索引来删除行,如果你的表格有重复行或者索引不唯一,建议用表格中的唯一标识列(比如ID)来匹配删除,这样更可靠。

这样就能实现点击一次按钮,完成「选中行存档→原表格删除选中行→表格刷新」的全部操作了!

内容的提问来源于stack exchange,提问作者Jaša Dimič

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 16:30:35