DOBON.NET DOBON.NETプログラミング掲示板過去ログ

PictureBoxのimage表示する問題

環境/言語:[WindowsXP C# NET Frameworkのバージョン2.0]
分類:[.NET]

ListBox中の内容によって、相応のImageがPictureBoxに表示します。
PictureBoxのImageプロパティを設置して、
this.PictureBox.Image = Properties.Resources.Image(Imageリソース)

もう一つはまず Graphics gp = Graphics.FromImage(image)のような形でなんにかものを書いた、後は
this.PictureBox.Image = Properties.Resources.Image(Imageリソース)

この二つの画面を変えるとき、ListBoxのものが早く変えたら、表示したい画面が前の画面になってしまいました。

> this.PictureBox.Image = Properties.Resources.Image(Imageリソース)

の後に

this.PictureBox.Invalidate();

としてみるか、

this.PictureBox.Refresh();

でどうでしょうか。
<参考>
http://dobon.net/vb/dotnet/control/refreshupdateinvalidate.html

> そうなんですか。試しました。解決しました。有難うございます。
実は画面を表示するとき、ループの時Application.DoEvents()を使った、BindingSourceのPositionChangedイベントも処理されてしまいました。
やはり、Application.DoEvents()を使うときは、うまくコントロールことが難しいみたいですね。

以下はリモートパソコンのPing状態を取得するのコード、Application.DoEvents()の代わりになんにかほかのいい方法がありますか。教えていただきます。

/// <summary>
/// PING終わったとき、相当の値を戻す
/// </summary>
private void PingCompleted(object sender, PingCompletedEventArgs e)
{
bool blRes = false;
//pingのときエラーが発生
if (e.Error != null)
{
m_pngRes[e.UserState] = false;
throw new DoctorSysInfoException(e.Error, 1);
}
else if (e.Reply == null)
{
return;
}
if (e.Reply.Status == IPStatus.Success)
{
blRes = true;
}
if (string.IsNullOrEmpty(e.UserState.ToString())) return;
m_pngRes[e.UserState] = blRes;
}


/// <summary>
/// PINGを進行してるとき、スレッドをコントロール
/// </summary>
public Hashtable WaitForPingRes()
{
m_pngWait = true;
try
{
if (m_pngRes.Count == 0)
{
m_pngRes.Add("STATUS", "ERROR");
return m_pngRes;
}
}
catch (ArgumentException ee)
{
throw new DoctorSysInfoException(ee, 12);
}
while (m_pngWait)
{
int cnt = 0;
foreach (object obj in m_pngRes)
{
if (((DictionaryEntry)(obj)).Value != null) cnt++;
}
if (cnt == m_pngRes.Count && m_pngRes.Count != 0) m_pngWait = false;
Application.DoEvents();
Thread.Sleep(10);
}
return m_pngRes;
}

/// <summary>
/// IPを非同期にPING
/// </summary>
public void ThreadPing(PingTarget pt)
{
m_png1 = new Ping();
m_png2 = new Ping();
m_png1.PingCompleted += new PingCompletedEventHandler(this.PingCompleted);
m_png2.PingCompleted += new PingCompletedEventHandler(this.PingCompleted);

m_pngRes.Clear();
if (!string.IsNullOrEmpty(pt.PcipAddress) && !string.IsNullOrEmpty(pt.RouterIPAddress))
{
if (pt.PcipAddress.CompareTo(pt.RouterIPAddress) != 0)
{
m_png1.SendAsync(pt.PcipAddress, 100, "PC");
m_png2.SendAsync(pt.RouterIPAddress, 100, "ROUTER");
m_pngRes.Add("PC", null);
m_pngRes.Add("ROUTER", null);
}
}
else if (!string.IsNullOrEmpty(pt.PcipAddress) && string.IsNullOrEmpty(pt.RouterIPAddress))
{
m_png1.SendAsync(pt.PcipAddress, 100, "SOFTVPN");
m_pngRes.Add("SOFTVPN", null);
}
}
WaitForPingRes()メッソドの中にApplication.DoEvents();
Thread.Sleep(10);
というコードが書いたのですが、Application.DoEvents()のことは危険性がちょっと高いので、ほかの方法が教えていただけないでしょうか。
■No22411に返信(黒田小小さんの記事)
> WaitForPingRes()メッソドの中にApplication.DoEvents();
> Thread.Sleep(10);
> というコードが書いたのですが、Application.DoEvents()のことは危険性がちょっと高いので、ほかの方法が教えていただけないでしょうか。

WaitForPingResメソッドをバックグラウンドで実装してみてください。
■No22412に返信(アッシさんの記事)

> WaitForPingResメソッドをバックグラウンドで実装してみてください。

アッシさん 
返事して有難うございます。
バックグラウンドで実装するのはWaitForPingResスレッドとして書きますか?でも、Application.DoEvents()はいったいどんなことをしたのですか。それを模擬できれば、同じ機能が実現できると思います。具体的なコードどうやって書けばいいでしょうか。教えていただけないでしょうか。
■No22415に返信(黒田小小さんの記事)
> ■No22412に返信(アッシさんの記事)
>
>>WaitForPingResメソッドをバックグラウンドで実装してみてください。
>
> アッシさん 
> 返事して有難うございます。
> バックグラウンドで実装するのはWaitForPingResスレッドとして書きますか?でも、Application.DoEvents()はいったいどんなことをしたのですか。それを模擬できれば、同じ機能が実現できると思います。具体的なコードどうやって書けばいいでしょうか。教えていただけないでしょうか。
>

Application.DoEventsは、溜まったイベントを処理します。
処理をするタイミングは、Application.DoEventsメソッドが呼ばれた時です。
ですので、発生するイベントを全て把握し、制御しなければなりません。

マルチメソッドでは、その名の通り、別々に処理が進みますので、
画面の描画と処理の単位を別々に分けることができます。

マルチメソッドについては、方法はいろいろとありますが、
BackGroundWorkerを使用するのが簡単ではないかと思います。
http://www.atmarkit.co.jp/fdotnet/dotnettips/436bgworker/bgworker.html

と思いつつ、やろうとしていることの全体が見えないので、
WaitForPingResメソッドだけをバックグラウンドにするのか、
他のメソッドは必要ないのか、想像できません。

他にやろうとしていることの情報は提供できますか?
> BackGroundWorkerを使用するのが簡単ではないかと思います。
> http://www.atmarkit.co.jp/fdotnet/dotnettips/436bgworker/bgworker.html

ご回答有難うございます。大変助かりました。
これは確かに簡単な解決方法です。
本当にありがとうございました。
■No22418に返信(黒田小小さんの記事)
>>BackGroundWorkerを使用するのが簡単ではないかと思います。
>>http://www.atmarkit.co.jp/fdotnet/dotnettips/436bgworker/bgworker.html
>
> ご回答有難うございます。大変助かりました。
> これは確かに簡単な解決方法です。
> 本当にありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板