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

如何点击按钮获取DataGridView当前行值及窗体间传递属性值

我来帮你解决这两个问题,咱们一步步拆解:

问题1:按钮点击时获取DataGridView当前行数据到ViewModel

你说CurrentRow属性没生效,大概率是没做空值判断或者用户没选中任何行导致的。咱们可以调整代码,先确保当前行是有效选中状态,再获取绑定的数据:

private void btnAuditLog_Click(object sender, EventArgs e)
{
    // 先校验是否存在有效选中行
    if (dgvResults.CurrentRow == null || dgvResults.CurrentRow.Index < 0)
    {
        MessageBox.Show("请先选择一行要操作的数据!");
        return;
    }

    // 安全转换绑定的ViewModel对象(用as比强制转换更稳妥)
    var auditOrder = dgvResults.CurrentRow.DataBoundItem as PurchaseOrdersTrackingViewModel;
    if (auditOrder == null)
    {
        MessageBox.Show("选中行的数据格式异常,无法获取订单信息!");
        return;
    }

    // 组装AuditOrderKey,和之前双击事件的逻辑一致
    this.AuditOrderKey = $"{auditOrder.OrderNo}|{auditOrder.ItemNo}|{auditOrder.WarehouseId}|{auditOrder.ItemSequence}";
}

关键注意点:

  • 必须加CurrentRow的空值判断,避免用户没选行时抛出NullReferenceException
  • 用as转换DataBoundItem后再判空,防止数据绑定格式错误导致的转换失败
问题2:两个窗体间传递public string类型的order属性

这里给你三种常用的实现方式,你可以根据自己的业务场景选择:

方法1:构造函数传递(最适合初始化时传值)

如果是打开窗体B时就需要传递订单号,直接给窗体B加带参数的构造函数:

窗体B的代码

public class FormB : Form
{
    // 定义公共属性存储订单号
    public string Order { get; private set; }

    // 带参数的构造函数,接收订单号
    public FormB(string order)
    {
        InitializeComponent();
        this.Order = order;
        // 初始化时直接用订单号做查询过滤
        LoadFilteredData(this.Order);
    }

    // 你的查询过滤逻辑
    private void LoadFilteredData(string order)
    {
        // 示例:根据order查询数据并绑定到控件
        // yourDataTable = yourDbContext.Orders.Where(o => o.OrderNo == order).ToList();
        // dgvData.DataSource = yourDataTable;
    }
}

窗体A中打开窗体B的代码

// 假设你已经获取到要传递的订单号
string targetOrder = "ORD20240501001";
// 通过构造函数传值并打开窗体
FormB formB = new FormB(targetOrder);
formB.Show();

方法2:公共属性赋值(适合动态修改值的场景)

如果需要在窗体B打开后再更新订单号,直接给窗体B定义可读写的公共属性:

窗体B的代码

public class FormB : Form
{
    // 定义可读写的公共属性
    public string Order { get; set; }

    private void FormB_Load(object sender, EventArgs e)
    {
        // 窗体加载时如果已有订单号,直接执行查询
        if (!string.IsNullOrEmpty(this.Order))
        {
            LoadFilteredData(this.Order);
        }
    }

    private void LoadFilteredData(string order)
    {
        // 查询过滤逻辑
    }

    // 也可以加一个按钮手动触发查询
    private void btnSearch_Click(object sender, EventArgs e)
    {
        if (!string.IsNullOrEmpty(this.Order))
        {
            LoadFilteredData(this.Order);
        }
    }
}

窗体A中赋值的代码

string targetOrder = "ORD20240501001";
FormB formB = new FormB();
// 先赋值再打开窗体
formB.Order = targetOrder;
formB.Show();

// 如果窗体B已经打开,后续也可以直接修改属性并触发查询
// formB.Order = "新的订单号";
// formB.LoadFilteredData(formB.Order);

方法3:事件传递(适合实时动态更新的场景)

如果窗体A需要在运行时实时通知窗体B更新订单号,可以用事件机制:

窗体B的代码

public class FormB : Form
{
    // 定义事件,参数为订单号
    public event Action<string> OrderUpdated;

    public FormB()
    {
        InitializeComponent();
        // 订阅事件,收到更新时执行查询
        OrderUpdated += OnOrderUpdated;
    }

    private void OnOrderUpdated(string order)
    {
        LoadFilteredData(order);
    }

    private void LoadFilteredData(string order)
    {
        // 查询过滤逻辑
    }
}

窗体A中触发事件的代码

// 先创建并打开窗体B
FormB formB = new FormB();
formB.Show();

// 当需要传递新的订单号时,触发事件
string newOrder = "ORD20240501002";
formB.OrderUpdated?.Invoke(newOrder);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:39:39