C#中如何将Dialog窗体的选中数据传递到另一个主窗体
C# WinForm 窗体传值最优实现方案
该方案基于模式对话框返回值+实体类封装实现,完全符合WinForm官方设计规范,耦合度最低,易维护。
1. 第一步:封装车辆信息实体类
先把所有车辆关联字段封装为统一实体,避免零散传值,后续扩展字段仅需要修改实体即可:
public class Vehicle { // 牌照 public string LicensePlate { get; set; } // 车型 public string CarModel { get; set; } // 生产年份 public int ProductionYear { get; set; } // 其余车辆字段按需扩展即可 }
2. 第二步:改造待售车辆列表Dialog窗体
不需要暴露弹窗内部控件,仅对外暴露只读的选中车辆属性即可:
// 待售车辆列表弹窗窗体,假设类名为VehicleListDialog public partial class VehicleListDialog : Form { // 对外暴露的选中车辆属性,主窗体仅需要读取该属性即可拿到选中数据 public Vehicle SelectedVehicle { get; private set; } public VehicleListDialog() { InitializeComponent(); // 初始化时绑定待售车辆列表到DataGridView/ListView等列表控件 dgvVehicleList.DataSource = 你的待售车辆列表数据源; } // 弹窗内确认选择按钮的点击事件 private void btnConfirmSelect_Click(object sender, EventArgs e) { if(dgvVehicleList.SelectedRows.Count == 0) { MessageBox.Show("请先选择一台车辆"); return; } // 从选中行拿到绑定的车辆实体赋值 SelectedVehicle = dgvVehicleList.SelectedRows[0].DataBoundItem as Vehicle; // 设置DialogResult后窗体会自动关闭,不需要手动调用Close() this.DialogResult = DialogResult.OK; } }
注意:弹窗的取消按钮不需要额外写逻辑,直接在控件属性面板将
DialogResult属性设置为Cancel即可。
3. 第三步:主窗体调用弹窗并回填数据
主窗体按钮点击事件中实例化弹窗,判断返回值后直接读取属性回填即可:
// 主窗体(车辆销售页面)的弹出列表按钮点击事件 private void btnOpenVehicleList_Click(object sender, EventArgs e) { // using块会自动释放弹窗资源,避免内存泄漏 using(VehicleListDialog dialog = new VehicleListDialog()) { // 以模式对话框形式打开弹窗 if(dialog.ShowDialog() == DialogResult.OK) { // 直接读取弹窗返回的选中车辆实体,回填对应字段 Vehicle selected = dialog.SelectedVehicle; txtLicensePlate.Text = selected.LicensePlate; txtCarModel.Text = selected.CarModel; txtProductionYear.Text = selected.ProductionYear.ToString(); // 其余字段按需回填即可 } } }
方案优势
- 完全解耦:弹窗不需要持有主窗体引用,也不需要定义委托/事件,两个窗体互不依赖内部实现
- 符合官方设计规范,资源自动释放,无内存泄漏风险
- 扩展性强,后续新增车辆字段仅需要修改Vehicle实体即可,不需要调整传值逻辑
内容的提问来源于stack exchange,提问作者tbag
相关产品推荐
相关产品推荐

