WinForms中如何通过接口统一访问不同表单的Venue属性
统一访问WinForms场馆表单属性的实现方案
问题背景
已有定义好的Venue接口:
internal interface Venue { int VenueID { get; set; } string VenueName { get; set; } string VenueAddress1 { get; set; } string VenueAddress2 { get; set; } string City { get; set; } string County { get; set; } string Eircode { get; set; } int Capacity { get; set; } string PhoneNo { get; set; } int Fee { get; set; } string Status { get; set; } }
同时有两个WinForms表单frmAddVenue(新增场馆)和frmUpdateVenue(修改场馆),二者都作为TabPage子控件,且都有从控件获取数据的逻辑。当前只能通过具体表单类型访问属性,无法用统一的类型进行操作,希望实现跨表单的属性统一访问。
实现方案
1. 让表单类直接实现Venue接口
无需额外创建继承自VenueModel的类,直接让两个表单类实现Venue接口,在接口属性的get/set方法中直接操作表单控件。这样表单自身就是接口的实现者,能直接访问内部控件实例。
以frmAddVenue为例:
public partial class frmAddVenue : Form, Venue { public frmAddVenue() { InitializeComponent(); } public int VenueID { get => int.TryParse(txtVenueID.Text, out var id) ? id : 0; set => txtVenueID.Text = value.ToString(); } public string VenueName { get => txtVenueName.Text; set => txtVenueName.Text = value; } public string VenueAddress1 { get => txtAddress1.Text; set => txtAddress1.Text = value; } // 按相同逻辑实现剩余的Venue接口属性 // VenueAddress2、City、County、Eircode、Capacity、PhoneNo、Fee、Status }
frmUpdateVenue的实现方式完全一致,只需对应自身的控件完成属性绑定。
2. 通过Venue接口统一访问属性
不再用Form类型声明变量,改用Venue接口类型,这样不管是新增还是修改表单,都能通过接口统一访问所有属性:
// 新增场景 Venue venueDetails = new frmAddVenue(); // 读取属性 string venueName = venueDetails.VenueName; // 设置属性 venueDetails.Capacity = 1000; // 修改场景,直接替换实例即可 venueDetails = new frmUpdateVenue(); venueDetails.VenueID = 456; string city = venueDetails.City;
3. 解决之前的控件访问问题
之前尝试继承VenueModel无法访问控件,是因为单独的VenueModel子类和表单控件属于不同实例,无法直接访问表单控件。而让表单类自身实现Venue接口,属性的get/set逻辑就在表单类内部,自然能直接访问到自身的控件实例,不存在跨实例访问的问题。
内容的提问来源于stack exchange,提问作者Keelan McCarthy
相关产品推荐
相关产品推荐

