Вызов метода в дочерней форме из родительской формы - PullRequest
0 голосов
/ 19 июля 2010

У меня есть 2 формы ParentForm и дочерняя форма.В моей родительской форме у меня есть слушатель потока, который слушает канал, который обновляет область ParentForm.Теперь у меня есть ChildForm, который также нуждается в данных от слушателя, чтобы поместить его в область ChildForm.слушатель потока использует делегат для обновления моей ParentForm, когда он получает канал.

Мой ParentForm имеет их.

private delegate void UpdateLogCallback(string strFeed);
private Thread thr;

private void InitializeFeed()
{
    ...
    // Get the feed connection
    ...
    thr = new Thread(new ThreadStart(ReceivedFeeds));
    thr.Start();
}

private void ReceivedFeeds()
{
    string strFeed = GetFromStream();

    // invoke my updater while connected
    while(Connected)
    {
        this.Invoke(new UpdateLogCallback(this.UpdateLog), new object[] { strFeed });
    }
}

private void UpdateLog(string strFeed)
{
    txtLog.AppendText(strFeed + "\r\n");
}

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

Edit

Я вызываю ChildForm, чтобы открыть событие OnClick в родительской форме ипокажите.

// onclick event
ChildForm childForm = new ChildForm();
childForm.Name = ((ListBox)sender).SelectedItem.ToString();
childForm.ShowDialog(this);

Вот как я открываю свою ChildForm и как я вызываю методы внутри ChildForm в моем UpdateLogCallback или в моем UpdateLog()

У меня также естьUpdateLog() метод в моей ChildForm.

Ответы [ 4 ]

1 голос
/ 19 июля 2010

Если вы просто удерживаете ссылку на дочернюю форму из своей формы parnet, вы можете вызвать метод UpdateLog из родительской формы

private void UpdateLog(string strFeed)
{
    txtLog.AppendText(strFeed + "\r\n");
    _child.UpdateLog(strFeed);
}

EDIT:

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

0 голосов
/ 19 июля 2010

Либо разделение одного из методов от родителя и вызов его от дочернего элемента, либо разделение одного метода от дочернего элемента и вызов его от родителя может решить это

0 голосов
/ 19 июля 2010

установить форму, невидимую при создании. напишите следующее в ctor (сразу после InitializeComponents()):

Visible = false;

Теперь добавьте метод в дочерней форме, например так:

internal void ShowForm(Form parent)
{
    var p = parent as Form1;
    if (p != null)
    {
        p.DataReady += (s, ev) =>
        {
            //update your data here
        };
    }
    ShowDialog(parent);
}

в родительской форме объявить событие, подобное этому:

internal event EventHandler<EventArgs> DataReady;

В зависимости от необходимости передавать данные в дочернюю форму, вам может потребоваться создать пользовательскую форму обработки класса EventArgs. Покажите дочернюю форму следующим образом:

var f=new ChildForm();
f.ShowForm(this);//this is parent form
0 голосов
/ 19 июля 2010

Либо вызовите два метода вместо одного, либо вызовите метод обновления дочерней формы из метода обновления родительской формы, - на мой взгляд, лучше всего - добавьте событие родительской формы, которое вызывается из UpdateLogCallback родительской формы. Таким образом, любые классы, осведомленные о родительской форме, могут использовать всю систему обновлений.

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