如何一键实现Ag-Grid选中行删除、表格刷新及存入新DataFrame?
解决方案:单次按钮点击完成Ag-Grid选中行删除、刷新及存档
当然可以通过一次按钮点击完成所有你需要的操作!你之前的代码问题在于使用了onRowSelected这个JavaScript事件,导致选中行时就立刻触发删除逻辑,而不是通过按钮来控制时机。下面是完整的实现方案:
核心思路
- 用Streamlit的按钮作为操作触发点,替代Ag-Grid的行选中自动触发
- 利用Streamlit的
st.session_state来持久化存储原表格数据和被删除的行数据(避免页面刷新后数据丢失) - 从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č
相关产品推荐
相关产品推荐

