singlepost

C# доступ к кнопкам << На главную или назад  

создаю ФУНКЦИЮ, в которой надо изменить :
StopButton.Enabled = true;

пишет ошибку:
Недопустимая операция в нескольких потоках: попытка доступа к элементу управления "StopButton" не из того потока, в котором он был создан.

что не так??? не правильно дал доступ???
ставлю на кнопке Modifiers = Public такая же ситуация…
подскажите что не так?

П.С. заранее спасибо.

21 ответов в теме “C# доступ к кнопкам”

  1. 9
    Николай Митропольский ответил:

    Ну вот меняю чекед у чекбокса например.

    namespace WindowsFormsApplication1
    {
    public partial class Form1 : Form
    {

    private Thread t;
    public Form1()
    {
    InitializeComponent();

    t = new Thread(() => {
    while (true)
    {
    if (InvokeRequired)
    {
    Invoke(new MethodInvoker(this.toggleCB));
    }
    else
    {
    toggleCB();
    }

    Thread.Sleep(500);
    }
    });

    t.Start();
    }

    void toggleCB()
    {
    this.checkBox1.Checked = !this.checkBox1.Checked;
    }

    private void Form1_FormClosed(object sender, FormClosedEventArgs e)
    {
    t.Abort();
    }
    }
    }

  2. 8
    Максим Печерский ответил:

    Николай Митропольский

    а можешь написать пример с Invoke, как например в кнопке button1 изменить значение Enabled в какой-нибудь функции?

  3. 7
    Илья Моисеенко ответил:

    Да ладно тебе! Кривокод рулит! :) ))

  4. 6
    Николай Митропольский ответил:

    Invoke – более правильный метод. Ибо ГУИ должны обрабатываться одним потоком.

  5. 5
    Максим Печерский ответил:

    ооо) пасиб))) заработало всё… без Invoke

  6. 4
    Bogdan Микушев ответил:

    >> тоесть? лазить в настройках самой кнопки?

    Попробуй в конструкторе сразу же после InitializeComponent(); добавить строчку CheckForIllegalCrossThreadCalls = false;

  7. 3
    Максим Печерский ответил:

    Bogdan ♪♪♪ Микушев
    тоесть? лазить в настройках самой кнопки?

  8. 2
    Bogdan Микушев ответил:

    >> что не так??? не правильно дал доступ???

    Всё правильно, в Visual Studio 2003 данный пример будет работать нормально, а в Visual Studio 2005 не будет из-за некоторых нововведений. Раньше сталкивался с этой проблемой, как её решил – не помню, чтение msdn мне помогло.

  9. 1
    Николай Митропольский ответил:

    Ну фишка в том, что нефига изменять UI из не UI-шного потока.
    А вообще гуглите или MSDN-те на тему:
    InvokeRequired
    и
    Invoke

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.