Пользовательский элемент управления C # - Как определить, что объект содержит данные, которые нужны элементу управления - PullRequest
4 голосов
/ 16 декабря 2010

Я создаю пользовательский элемент управления C # WinForms.Будут времена, когда пользовательскому элементу управления понадобятся данные из формы, в которой он содержится. Как мне заставить пользовательский элемент управления сообщать форме, содержащей его, что ему нужны некоторые данные?

Спасибо!

Ответы [ 5 ]

4 голосов
/ 16 декабря 2010

Вы можете подписать форму на событие, инициированное в UserControl.

Ваша архитектура диктует, где и когда вам нужно подписаться на событие данных.Мы не можем ответить на это, не зная немного больше о том, как вы добавляете элемент управления во время выполнения или во время разработки.Каждый случай потребует небольшой деривации.С точки зрения добавления вашего элемента управления во время выполнения вы можете сделать что-то похожее на следующее:

// Your sample control
public class MyUserControl : Control
{
    public event EventHandler<EventArgs> INeedData;
    public Data Data {get; set;}

    private class DoSomething()
    {
        if(INeedData!=null) INeedData(this,null);
    }
}

...

// Your Form, in the case that the control isn't already added.
var _myUserControl = new MyUserControl();
private void Form1_Load(object sender, EventArgs e)
{
    _myUserControl.INeedData += new EventHandler<EventArgs>(MyUserControl_INeedData);
    this.Controls.Add(myUserControl);
}

void MyUserControl_INeedData(object sender, EventArgs e)
{
    _myUserControl.Data = SomeData;
}
1 голос
/ 16 декабря 2010

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

В пользовательском управлении:

//Define your Custom Event argument
public class MyEventArgs : EventArgs
{
    //Define some fields of your custom event argument
    private int m_SomeValue = 0;

    //Define some properties of your custom event argument
    public int SomeValue
    {
        get { return m_SomeValue; }
        set { m_SomeValue = value; }
    }
}

//Define the event handler data type
public delegate void MyEventHandler(object sender, MyEventArgs e);

//Define the object which holds the outside event handlers
public event MyEventHandler SomeEvent;

//Define the function which will generate the event
public virtual void OnSomeEvent(MyEventArgs e)
{
    if (SomeEvent != null)
        SomeEvent(this, e);
}

.
. //Then later in the control
.
{
    //We need new data

    //Create the event arguments
    MyEventArgs newEvent = new MyEventArgs();

    //Set the values
    newEvent.SomeValue = 17;

    //Call the event generating function
    OnSomeEvent(newEvent);
}

В вашей форме просто используйте что-то вроде:

myControl.SomeEvent += new MyEventHandler(handlerName);

Так какВаше мероприятие является публичным, вы также должны увидеть его в окне «Свойства» вашего элемента управления.

Вы можете придумать событие, используя атрибуты метаданных, но я оставляю это на ваше усмотрение, чтобы обнаружить их.

1 голос
/ 16 декабря 2010

Создайте событие в пользовательском элементе управления, где аргументы события доступны для редактирования.Пусть форма прикрепляет обработчик к этому событию, который обновляет эти поля.Используйте эти поля в методе OnEvent.

[не проверено] например.

public delegate void NeedsUserDataEventHandler(object sender, NeedsUserDataEventArgs args);

public class NeedsUserDataEventArgs : EventArgs
{
    public UserData UserData { get; set; }
}

// In Control
public event NeedsUserDataEventHandler NeedsUserData;

public void OnNeedsUserData(NeedsUserDataEventArgs args)
{
    NeedsUserDataEventHandler handler = NeedsUserData;
    if (handler != null) handler(this, args);
    // store your data somewhere here
}

// In Form
public override void OnLoad(object sender, EventArgs args)
{
    control.NeedsUserData += ControlNeedsUserData;
}

public override void OnClosed(object sender, EventArgs args)
{
    control.NeedsUserData -= ControlNeedsUserData;
}

public void ControlNeedsUserData (object sender, NeedsUserDataEventArgs args)
{
    args.UserData = // set whatever here
}
0 голосов
/ 16 декабря 2010

Это зависит от того, когда эти данные должны быть переданы в UserControl.Есть ли в Форме события, которые приводят к необходимости перемещения данных в UserControl?Если это так ... просто захватите ваш экземпляр в этот момент и отправьте данные в UserControl через открытое свойство.

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

public event DataHandler ReceivedData;

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

0 голосов
/ 16 декабря 2010

Мне кажется немного расплывчатым, но:

Создайте событие в содержащей WinForm, чтобы каждый раз, когда некоторые данные были готовы, все подписчики могли получать уведомления в модели «один ко многим»;или сделать это событием в подписанном элементе управления, в модели «один к одному», в которой он вызывает метод контейнера, который извлекает такие данные?

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