Лучшая практика, когда вам нужно два пользовательских элемента управления (winforms) для общения - PullRequest
5 голосов
/ 30 июня 2009

Расширенная проблема

Я хотел бы добавить новую проблему в дополнение к исходной проблеме, указанной ниже. Один из пользовательских элементов управления в приложении содержит список объектов, к которым мне нужно получить доступ из другого пользовательского элемента управления. Как это может быть сделано? (Я не верю, что деление на элементы управления выполняется очень хорошо, но я бы не стал его менять ..)

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


Исходная задача

У меня есть два пользовательских элемента управления в форме, с которыми я хочу общаться друг с другом. Usercontrol A должен иметь возможность начать операцию на B.

Каков предпочтительный способ решения этой проблемы? Должна ли форма ждать Событие от A, а затем начать операцию на B? Любой шаблон дизайна для этого? Или это еще более простое решение?

Заранее спасибо! :)

Ответы [ 3 ]

3 голосов
/ 06 июля 2009

Два пользовательских элемента управления не должны знать друг друга. Если вы хотите всегда иметь дело с ними как с парой, подумайте о создании третьего пользовательского элемента управления для их размещения.

Должна ли форма ждать Событие от A, а затем начать операцию на B?

Да, это единственный хороший способ справиться с этим.

Расширенная проблема (бонус?) Немного сложнее. Я бы справился с этим, передав форму пользовательскому элементу управления делегату методу другого пользовательского элемента управления для извлечения данных. Пользовательский элемент управления может затем вызвать метод делегата для вызова метода в другом элементе управления, не имея сведений о его реализации.

0 голосов
/ 06 июля 2009

Я бы сделал это так (я использую vb.net)

Class MyUserControlA
'Inherits UserControl '(This line will be in your desinger file)

Delegate Sub SomethingEventHandler (sender as object, e as EventArgs)  '(assumes you are not going to override event args)

Public Event SomethingEvent as SomethingEventHandler

private _someData as String

Public Readonly Property MyDataGrid as DataGridView
    Get
        Return DataGridView1  ' this is in the designer form of the user control
    End Get

Public Property SomeData as string
    Get
        return _someData
    End Get
    Set(value as string)
        _someData as string
    End Set
End Property

Protected Sub OnSomethingEvent()
    RaiseEvent SomethingEvent(Me, EventArgs())
End Sub

'....something happens and you want to raise the event
OnSomethingEvent

End Class

Реализовать основную форму следующим образом

Class MainForm
Implements Form  'designer file

'....other code
Sub MyUserControlA1_SomethingEvent Handles MyUserControlA1.SomethingEvent
    'instead of calling a property you could override eventArgs and return the control that way.
    MyUserControlB1.OtherDataGridView=MyUserControlA1.MyDataGrid
End Sub

End Class

UserControlB выглядит следующим образом:

Class UserControlB 
Inherits UserControl ' designer form

'...other code

private _dataGrid as DataGridView=Nothing


    Public Property DataGrid() As DataGridView
        Get
            Return _dataGrid
        End Get
        Set(ByVal value As DataGridView)
            'only set if null
            if _dataGrid is Nothing then _dataGrid = value
        End Set
    End Property



'do stuff with the control...I would always check for null
function DoSomethingWithDataGrid as integer
    if _dataGrid IsNot Nothing then
        return _dataGrid.Items.Count
    End If
End Sub
End Class

ЭТОТ КОД НЕ ПРОВЕРЕН.

Это довольно слабо связано таким образом. Я думаю, в идеальном мире вы бы обернули то, что вам нужно в UserControlA DataGrid, в методы и свойства и использовали бы их таким образом. Но если в DataGrid много ссылок, на которые вы ссылаетесь, это, безусловно, проще.

Я не утверждаю, что это идеальный дизайн. Я все еще изучаю архитектуру winforms. Что вы, эксперты, думаете?

Сет Б Спирман

0 голосов
/ 06 июля 2009
  1. Выставить данные как свойство.
  2. Создайте свойство в другом пользовательском элементе управления, в котором родительская форма будет заполнена ссылкой на элемент управления с данными.

Псевдокод:

public UserControlA uca { get; set; }
...

var items = uca.Items;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...