gpt4 book ai didi

winforms - 在 UserControl 中使用 BindingSource

转载 作者:行者123 更新时间:2023-12-02 05:46:07 26 4
gpt4 key购买 nike

我有一个包含多个字段的 UserControl,我希望将其绑定(bind)到 BindingSource。我还希望 UserControl 公开一些 BindingSource 属性,以便可以将其放在表单上并绑定(bind)到表单上的 BindingSource。是否有捷径可寻?我意识到我可以在其 BindSource setter 中重新绑定(bind) UserControl 的所有控件。但这似乎是错误的。是否有一些 BindingSource 代理可以让我将用户控件中的 BindingSource 链接到表单中的 BindingSource?

最佳答案

根据你的问题,我很难理解你想要做什么。因此,我希望我会尽力为您提供有关此事的有趣信息。

首先,让我们考虑客户管理软件项目中的以下 UserControl。

public partial class CustomerManagementUserControl : UserControl {
public CustomerManagementUserControl() {
InitializeComponent();
_customerBindingSource = new BindingSource();
}
public IList<ICustomer> DataSource {
set {
_customerBindingSource.DataSource = value;
}
}
private BindingSource _customerBindingSource;
}

其次,让我们考虑以下表单,它应该是您的客户管理表单。

public partial class CustomerManagementForm : Form {
public CustomerManagementForm() {
InitializeComponent();
_customerUserControl = new CustomerManagementUserControl();
_customerUserControl.Name = @"customerUserControl";
}
private void CustomerManagementForm_Load(object sender, EventArgs e) {
// CustomersFacade is simply a static class providing customer management features and requirements.
// Indeed, the GetCustomers() method shall return an IList<ICustomer>.
// The IList type and typed IList<T> are both intended to be bindable as a DataSource for DataBinding.
_customerUserControl.DataSource = CustomersFacade.GetCustomers();
this.Controls.Add(_customerUserControl);
}
private CustomerManagementUserControl _customerUserControl;
}

如果您希望在“属性”窗口中使用 CustomerManagementUserControl.DataSource 属性,请考虑在属性定义顶部添加以下内容。

[System.ComponentModel.DesignTimeVisible(true), System.ComponentModel.DesignerCategory("CustomerUserControl"), System.ComponentModel.Description("Sets the CustomerUserControl DataSource property")]

这是做我猜你可能想做的事情的一种方式。另一方面,如果您希望通过将不同类型的对象设置为 UserControl.BindingSource.DataSource 属性来获得尽可能最抽象的内容,那么您将必须编写一个可以检测类型的方法传递对象,然后相应地绑定(bind)属性。如果您愿意使用反射,也许您可​​以采用的一个好方法是使用它。您可以想象以任何可能的方式使用此类多态性功能,您将必须自己编写一个所有可绑定(bind)对象都必须实现的接口(interface)。这样,您将避免未知的属性名称,并且当需要绑定(bind) UserControl 的控件时,您将能够将正确的属性绑定(bind)到正确的控件,等等。

让我们尝试以下操作:

public interface IEntity {
double Id { get; set; }
string Number { get; set; }
string Firstname { get; set; }
string Surname { get; set; }
long PhoneNumber { get; set; }
}
public interface ICustomer : IEntity {
}
public interface ISupplier : IEntity {
string Term { get; set; }
}
public sealed Customer : ICustomer {
public Customer() {
}
public double Id { get; set; }
public string Number { get; set; }
public string Firstname { get; set; }
public string Surname { get; set; }
public long PhoneNumber { get; set; }
}
public sealed Supplier : ISupplier {
public Supplier() {
}
public double Id { get; set; }
public string Number { get; set; }
public string Firstname { get; set; }
public string Surname { get; set; }
public long PhoneNumber { get; set; }
public string Term { get; set; }
}

考虑到上面的代码,您可以使用 UserControl 的 DataSource 属性与 IEntity 绑定(bind),因此您的属性可能像这样。

[System.ComponentModel.DesignTimeVisible(true), System.ComponentModel.DesignerCategory("CustomerUserControl"), System.ComponentModel.Description("Sets the CustomerUserControl DataSource property")]
public IList<IEntity> DataSource {
set {
_customerBindingSource.DataSource = value;
}
}

也就是说,如果您希望更进一步,您可以公开 UserControl 的控件 DataBindings 属性,以便在设计时设置它们。考虑到这一点,您将希望将 BindingSource 公开为公共(public)属性,以便您也可以在设计时设置它,然后从此 BindinSource 选择您的 DataMember。

我希望这对您有一点帮助,或者至少为您提供一些进一步搜索的线索。

关于winforms - 在 UserControl 中使用 BindingSource,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/982376/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com