Как обновить элементы управления из статического метода? - PullRequest
6 голосов
/ 31 октября 2010

Hello Почему у меня нет доступа к моему личному элементу управления в форме (например, ListBox) из статического метода? Как обновить управление в этом случае?

РЕДАКТИРОВАТЬ 1.

мой код:

ThreadStart thrSt = new ThreadStart(GetConnected);
        Thread thr = new Thread(thrSt);
        thr.Start();

и

static void GetConnected()
    {
        //update my ListBox
    }

То есть он должен быть пустым, без параметров и быть статичным, верно?

РЕДАКТИРОВАТЬ 2.

Если кому-то нужно решение в WPF, попробуйте следующее:

private void GetConnected()
    {
        myListBox.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal,
                    new Action(() =>
                    {
                        myListBox.Items.Add("something");
                    }
                               )
                 );
    }

Ответы [ 5 ]

12 голосов
/ 22 апреля 2015

я нашел другой ответ в Интернете

напишите это в классе формы:

static Form1 frm;

и в конструкторе формы:

frm = this;

теперь мы можемиспользуйте переменную "frm" для доступа ко всем элементам управления в форме.

где-нибудь в статическом методе:

frm.myListBox.Items.Add("something");
3 голосов
/ 12 марта 2015

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

foreach (Form tmp in Application.OpenForms)
    foreach (System.Windows.Forms.Control temp in tmp.Controls)
        if (temp.Name == "textBox1")
            temp.Text = "it works :)";
2 голосов
/ 31 октября 2010

Статические методы не могут получить доступ к состоянию экземпляра (например, нестатический элемент управления).Удалите static из объявления метода или передайте ссылку на элемент управления в качестве аргумента метода:

private static void SomeMethod(ListBox listBox)
{
    listBox.Items.Add("Some element");
}

... и вызовите его так:

SomeMethod(MyListBox);

Обновление
Существуют разные способы выполнения асинхронных операций в пользовательском интерфейсе (теперь предполагается использование winforms).Я бы порекомендовал вам изучить использование BackgroundWorker (поиск здесь на SO; множество примеров).Если вы действительно хотите сделать это, создавая потоки самостоятельно, вот один из способов сделать это:

private void SomeMethod()
{
    string newElement = FetchNextElementToAdd():
    SafeUpdate(() => yourListBox.Items.Add(newElement));
}

private void SafeUpdate(Action action)
{
    if (this.InvokeRequired)
    {
        this.BeginInvoke(action);
    }
    else
    {
        action();
    }
}

... и назвать его:

Thread thread = new Thread(SomeMethod);
thread.Start();

Вы можететакже используйте пул потоков (предпочтительнее, чем создание собственных потоков, учитывая, что вы не ожидаете, что они будут работать очень долго):

ThreadPool.QueueUserWorkItem(state => SomeMethod());
1 голос
/ 31 октября 2010

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

0 голосов
/ 28 ноября 2017

Вы не можете получить доступ к "this", "ui" или любой функции в MainWindow из статической функции.

Чтобы решить эту проблему, сделайте публичный указатель Mainwindow

Mainwindow *THIS;

перед вызовом функции обратного вызова (статическая функция), назначьте его указателю THIS

THIS=this;

Теперь вы можете использовать ЭТО вместо этого.

например:

THIS->listBox->Items->Add("Some element");
...