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

如何在Flet DataTable中编辑不同行的数据?

Flet DataTable编辑弹窗仅加载第一条记录的问题求助

在Flet的DataTable中录入2条及以上记录后,点击第二或第三条记录的编辑按钮(IconButton)时,编辑弹窗仅会加载第一条记录的数据。

截图说明:编辑弹窗显示的始终是第一条记录的产品名称、分类和重量信息,与点击的目标记录不符。

相关代码

主代码

import flet as ft
from flet import *


def main(page: ft.Page):

    codpro = TextField(label="CÓDIGO PRODUCTO")
    nompro = TextField(label="NOMBRE PRODUCTO")

    # 分类下拉框
    ddcate = ft.Dropdown(label="CATEGORIA",
        width=150,
        options=[
            ft.dropdown.Option("dulce"),
            ft.dropdown.Option("salado"),
        ],
    )

    # 重量单位下拉框
    ddpeso = ft.Dropdown(label="PESO",
        width=100,
        options=[
            ft.dropdown.Option("KG"),
            ft.dropdown.Option("G"),
        ],
    )

    # 创建编辑数据用的控件
    edit_nomprotxt = TextField(label="NOMBRE PRODUCTO")

    edit_ddcate = ft.Dropdown(label="CATEGORIA",
        width=150,
        options=[
            ft.dropdown.Option("dulce"),
            ft.dropdown.Option("salado"),
        ],
    )

    edit_ddpeso = ft.Dropdown(label="PESO",
        width=100,
        options=[
            ft.dropdown.Option("KG"),
            ft.dropdown.Option("G"),
        ],
    )


    # 产品数据表
    tablaproducto = DataTable(
                  # 列标题  
                  columns=[
                      DataColumn(Text("CÓDIGO")),
                      DataColumn(Text("PRODUCTO")),
                      DataColumn(Text("CATEGORÍA")),
                      DataColumn(Text("PESO")),
                      DataColumn(Text("ACCIONES")),
                  ],
                  # 行数据  
                  rows=[]          
    )

编辑弹窗及函数代码

# 创建编辑弹窗
dialog = AlertDialog(
    title=Text("Editar datos"),
    content=Column([
        edit_nomprotxt,
        edit_ddcate,
        edit_ddpeso,
                 
    ]),
    actions=[
        TextButton("Guardar",
                   on_click=guardar
                  )
    ]
)

# 编辑函数(当前存在问题的版本)
def editar(e):
    
    edit_nomprotxt.value = tablaproducto.rows[0].cells[1].content.value
    edit_ddcate.value = tablaproducto.rows[0].cells[2].content.value
    edit_ddpeso.value = tablaproducto.rows[0].cells[3].content.value

    page.dialog = dialog
    dialog.open = True
    page.update()

问题原因

编辑函数editar中硬编码了tablaproducto.rows[0],固定获取第一行(索引0)的数据,无论点击哪条记录的编辑按钮,都会加载第一条记录的内容。

解决方法

  • 修改行的创建逻辑:添加行时,为每个编辑按钮绑定对应行的索引。示例添加行的函数如下:
# 示例添加行的逻辑(需整合到你的代码中)
def agregar_fila(e):
    new_row = DataRow(
        cells=[
            DataCell(Text(codpro.value)),
            DataCell(Text(nompro.value)),
            DataCell(Text(ddcate.value)),
            DataCell(Text(ddpeso.value)),
            DataCell(
                IconButton(
                    icon=ft.icons.EDIT,
                    # 通过默认参数传递当前行索引,避免lambda延迟绑定问题
                    on_click=lambda e, idx=len(tablaproducto.rows): editar(e, idx)
                )
            )
        ]
    )
    tablaproducto.rows.append(new_row)
    page.update()
  • 更新编辑函数:接收行索引参数,根据索引获取目标行的数据:
# 修改后的编辑函数
def editar(e, row_idx):
    target_row = tablaproducto.rows[row_idx]
    edit_nomprotxt.value = target_row.cells[1].content.value
    edit_ddcate.value = target_row.cells[2].content.value
    edit_ddpeso.value = target_row.cells[3].content.value

    page.dialog = dialog
    dialog.open = True
    page.update()
  • 关键注意点:lambda中使用idx=len(tablaproducto.rows)作为默认参数,能确保每个按钮在创建时就绑定了当前的行索引,避免所有按钮都指向最后一行的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 00:55:25