По вашему вопросу, я с трудом понимаю, что вы собираетесь делать. Поэтому я постараюсь предоставить вам, я надеюсь, интересную информацию по этому вопросу.
Во-первых, давайте рассмотрим следующий 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, то вам нужно будет написать метод, который мог бы определять тип объекта. объект прошел, затем связал свойства соответственно. Хороший способ, которым вы могли бы пойти, возможно, с помощью Reflection, если вам удобно работать с ним. Любым возможным способом, который вы можете себе представить, работая с такими функциями полиморфизма, вам придется написать себе интерфейс, который должны реализовать все ваши привязываемые объекты. Таким образом, вы избежите неизвестных имен свойств, и когда придет время привязать элементы управления вашего UserControl, вы сможете привязать правильное свойство к правильному элементу управления и т. Д.
Давайте попробуем следующее:
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; }
}
Учитывая приведенный выше код, вы можете использовать свойство DataSource вашего UserControl для привязки к IEntity, так что вашему свойству это может понравиться.
[System.ComponentModel.DesignTimeVisible(true), System.ComponentModel.DesignerCategory("CustomerUserControl"), System.ComponentModel.Description("Sets the CustomerUserControl DataSource property")]
public IList<IEntity> DataSource {
set {
_customerBindingSource.DataSource = value;
}
}
Тем не менее, если вы хотите продвинуться еще дальше, вы можете просто предоставить свои свойства DataBindings элементов управления UserControl, чтобы установить их во время разработки. Учитывая это, вы захотите выставить свой BindingSource как общедоступное свойство, чтобы вы могли установить его и во время разработки, а затем выбрать свой DataMember из этого BindinSource.
Надеюсь, это поможет вам обоим немного или, по крайней мере, даст вам несколько треков для дальнейшего поиска.