質問

UIを使用して作成されたスレッドからUIのコントロールを更新する際に問題が発生しました

ThreadPool.QueueUserWorkItem

このスレッド内で呼び出しています

addControlToPanel(li);

ここに示すとおり

private delegate void addControlToPanelDelegate(ListItem li);
private void addControlToPanel(ListItem li)
{
    if (panel1.InvokeRequired)
    {
        addControlToPanelDelegate d = new addControlToPanelDelegate(addControlToPanel);
        panel1.Invoke(d, new object[] { li });
    }
    else
    {
        panel1.Controls.Add(li);
    }
}

addControlToPanel()への最初のエントリpanel1.InvokeRequired == trueであるため、デリゲートがインスタンス化されてから呼び出されます。addControlToPanel()へのこのエントリで、panel1.InvokeRequired == falseであるため、コントロールをパネルに追加します。 / p>

私の問題は、コントロールとpanel1.InvokeRequiredに対してfalseを呼び出した後でも、エラーが表示されることです

panel1.Controls.Add(li); 

通常の内容を示す行

Control.Invokeは、別のスレッドで作成されたコントロールと対話するために使用する必要があります。

誰でも問題を見つけることができますか?呼び出しを使用して別のスレッドのコントロールにアクセスすることは、以前に何度も行ったことですが、これには困惑しています!

TIA

ワンショット

役に立ちましたか?

解決

問題は、invokeでコントロールを渡すことであったようです(ListItemは私が作成したフォームコントロールです)。

addControlToPanel()

method、iを呼び出した後、メソッド内にコントロールを作成するために必要なすべての情報を渡します

private delegate void addControlToPanelDelegate(string picname, string thumburl, PicasaEntry entry, Int32 top, EventHandler clickevent);
private void addControlToPanel(string picname, string thumburl, PicasaEntry entry, Int32 Ordinal,EventHandler clickevent)
{
    if (panel1.InvokeRequired)
    {
        addControlToPanelDelegate d = new addControlToPanelDelegate(addControlToPanel);
        this.Invoke(d, new object[] { picname, thumburl, entry, Ordinal, clickevent });
        //panel1.Invoke(d, new object[] { li });
    }
    else
    {
        ListItem li = new ListItem(picname, thumburl, entry);
        li.Top = Ordinal * li.Height;
        li.Click += clickevent;
        panel1.Controls.Add( li);
    }
}

乾杯

ワンショット

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top