如何点击按钮获取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
相关产品推荐
相关产品推荐

