Использование BindingSource в UserControl

В MySQL существует хорошее решение.

Добавляют ключевое слово SQL_CALC_FOUND_ROWS прямо после ВЫБОРА ключевого слова:

SELECT SQL_CALC_FOUND_ROWS t3.id, a,bunch,of,other,stuff FROM t1, t2, t3 
WHERE (associate t1,t2, and t3 with each other) 
GROUP BY t3.id 
LIMIT 10,20

После этого, выполняет другой запрос с функциональным FOUND_ROWS ():

SELECT FOUND_ROWS();

Это должно возвратить количество строк без ПРЕДЕЛЬНОГО пункта.

Контроль эта страница для получения дополнительной информации: http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_found-rows

10
задан Metro 11 June 2009 в 17:09
поделиться

2 ответа

Что касается вашего вопроса, я с трудом понимаю то, что вы собираетесь делать. Поэтому я сделаю все возможное, чтобы предоставить вам, я надеюсь, интересную информацию по этому поводу.

Во-первых, давайте рассмотрим следующий 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.

Я надеюсь, что это поможет вам обоим немного или, по крайней мере, даст вам несколько треков для дальнейшего поиска.

5
ответ дан 4 December 2019 в 02:26
поделиться

Если вы хотите сделать все это автоматически, вы можете искать источник привязки в родительской форме в событии загрузки вашего пользовательского элемента управления или что-то в этом роде ...

Dim components As Reflection.FieldInfo = typ.GetField("components", Reflection.BindingFlags.DeclaredOnly Or Reflection.BindingFlags.Instance Or Reflection.BindingFlags.NonPublic)

Dim lstBindingSources As New List(Of BindingSource)
For Each obj As Object In components.Components
   Dim bindSource As BindingSource = TryCast(obj, BindingSource)
   If bindSource IsNot Nothing Then
      lstBindingSources.Add(bindSource)
   End If
Next
If lstBindingSources.Count = 1 Then
   MyBindingSource.DataSource = lstBindingSources(0).DataSource
End If
1
ответ дан 4 December 2019 в 02:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: