1

C# で GIS アプリケーションを作成しています。アプリケーションの一部で、ユーザーは KML ファイルを選択でき、プログラムはそのファイルを処理します。を使用してOpenFileDialogいますが、問題は、ダイアログが閉じられる前に (およびユーザーがファイルを OK した後に) すべてのコードが実行されることです。プログラムはズームや他のことをしなければならないので、かなり時間がかかります。コードが実行される前にプログラムでダイアログを閉じる方法はありますか?

編集:尋ねる人のためのいくつかのコード。

private void OnKMLFileSet(object sender, CancelEventArgs e)
{
    Polygon polygon = KmlToPolygon(openFileDialog2.FileName);
    // After this, I no longer need the file, but the dialog stays open until the end of the method
    Graphic graphic = new Graphic();
    graphic.Geometry = polygon;
    textBox1.Text = string.Format("{0:n}", CalculateAreaInSqKilometers(polygon)).Split('.')[0];
    textBox2.Text = string.Format("{0:n}", CalculateAreaInSqMiles(polygon)).Split('.')[0];
    textBox3.Text = string.Format("{0:n}", CalculateAreaInSqKnots(polygon)).Split('.')[0];
    Note polyInfo = new Note("Polygon with nautical area: " + textBox3.Text, polygon);
    map.Map.ChildItems.Add(polyInfo);
    map.ZoomTo(polygon.GetEnvelope());
}
4

1 に答える 1

5

ダイアログは実際には閉じているように聞こえますが、メインウィンドウがビジーで、まだ再描画されていないため、まだ「表示」されています。

いくつかのアイデア:

  • 簡単な方法:ダイアログがまだ表示されているメインフォームでRefresh()メソッドを呼び出します。ShowDialogが戻ったら、必ずすぐに呼び出してください。
  • 読み込みにかなりの時間がかかる場合は、おそらくキャンセルボタンを使用して、ポップアップの「読み込み中」ダイアログを作成することが望ましい場合があります。BackgroundWorkerクラスを使用して、ファイルをバックグラウンドスレッドにロードします。ワーカーが完了すると、ファイルが読み込まれ、ポップアップウィンドウを閉じることができます。適切な同期を行わずに、ユーザーインターフェイスの何もバックグラウンドスレッドから変更しないように注意してください。

編集:コードを見た後、私はあなたの問題を見たと思います。FileOkイベントを処理しています。これはあなたが避けようとしている効果をもたらします。次のようなダイアログを使用します。

if (openFileDialog1.ShowDialog() == DialogResult.OK) {
    // open file
}

FileOkイベントを使用しないでください。私はこれまでそれを使用する理由がありませんでした...また、私がすでに与えたアドバイスに従うことは役に立つかもしれません。

于 2011-08-12T14:09:45.420 に答える