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

ダイアログボックスの表示

分類:[.NET]

VB:.net WINDOWS:XP

OPEN系初心者です。
exeファイルを実行したら、『ファイルを開くダイアログボックス』を直接開かせる事は可能なのでしょうか?
簡単な事なのかもしれませんが、いきなり行き詰ってしまいました。
■No1362に返信(お初さんの記事)
> VB:.net WINDOWS:XP
>
> OPEN系初心者です。
> exeファイルを実行したら、『ファイルを開くダイアログボックス』を直接開かせる事は可能なのでしょうか?
> 簡単な事なのかもしれませんが、いきなり行き詰ってしまいました。

上記の質問は解決できたのですが、『ファイルを開くダイアログボックス』からファイルを指定して、1レコードずつDBにアップさせる処理を行っております。

そこで、次の問題が発生しました。

『ファイルを開くダイアログボックス』からファイルを指定したら、その次にForm1にプログレスバー等で状況を表示させてます。

しかし、Form1は画面が固まったような感じで表示されて、DBにレコードが全件上がった後にやっとアクティブになっている、という状況です。
『ファイルを開くダイアログボックス』を実行した後にすぐにForm1がアクティブな画面になるにはどうしたらいいのでしょうか?

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load


If OpenFileDialog.ShowDialog = DialogResult.OK Then
'テキストファイルが選択されている場合はファイルを開く
If System.IO.Path.GetExtension(OpenFileDialog.FileName) = ".txt" Then

Me.Show()
'ファイルの読込開始
Call Read_File()
Else
MessageBox.Show("テキストファイルを指定してください", "エラー")
Exit Sub
End If
End If

End Sub

'指定されたファイルの読込
Private Sub Read_File()

On Error Resume Next

Dim sr As New System.IO.StreamReader(OpenFileDialog.FileName, System.Text.Encoding.Default)
Dim olecmd As OleDb.OleDbCommand
Dim F_data As String
Dim F_datas() As String
Dim UPID As Integer
Dim Pgb_Cnt As Integer
Dim cnt As Integer

'プログレスバー設定
ProgressBar1.Visible = True

'読込開始
Do While sr.Peek() >= 0
F_data = sr.ReadLine()
F_datas = F_data.Split(",")

olecnP1.Open()

olecmd = New OleDb.OleDbCommand("INSERT INTO TestLib.TestFile(aaa)" & "values('" & aaa & "',)", olecn1)

olecmd.ExecuteNonQuery()
olecnP1.Close()

cnt = cnt + 1
Loop
sr.Close()

ProgressBar1.Visible = False
Me.Close()

End Sub
> Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
>
>
> If OpenFileDialog.ShowDialog = DialogResult.OK Then
> 'テキストファイルが選択されている場合はファイルを開く
> If System.IO.Path.GetExtension(OpenFileDialog.FileName) = ".txt" Then
>
> Me.Show()

Me.Refresh
でどうですか?

> 'ファイルの読込開始
> Call Read_File()
> Else
> MessageBox.Show("テキストファイルを指定してください", "エラー")
> Exit Sub
> End If
> End If
>
> End Sub
■No1368に返信(よねKENさんの記事)
>> Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
>>
>>
>> If OpenFileDialog.ShowDialog = DialogResult.OK Then
>> 'テキストファイルが選択されている場合はファイルを開く
>> If System.IO.Path.GetExtension(OpenFileDialog.FileName) = ".txt" Then
>>
>> Me.Show()
>
> Me.Refresh
> でどうですか?
>
>> 'ファイルの読込開始
>> Call Read_File()
>> Else
>> MessageBox.Show("テキストファイルを指定してください", "エラー")
>> Exit Sub
>> End If
>> End If
>>
>> End Sub
>
お返事ありがとうございます。
ご指摘の通り追加してみた所、FORM1はスムーズに表示されるようになったのですが、アクティブな画面にはなりませんでした。
直接マウスでクリックしてもアクティブな状態になりませんでした。

なにぶん初心者なので、教えて頂いた通り『Me。refresh』を追加してここまできたのですが、何故これによってかわったのか理解ができていません。。。
> ご指摘の通り追加してみた所、FORM1はスムーズに表示されるようになったのですが、アクティブな画面にはなりませんでした。

Read_Fileメソッド内のDo 〜 LoopでApplication.DoEventsを入れてみるとか。
これをすればForm1を操作できるようになりますが、
例えば、Form1を閉じようとすることもできますので注意が必要です。

きちんとやるなら、Read_Fileメソッドを非同期で呼び出すとか、
マルチスレッドを使うとかすることになると思います。


> なにぶん初心者なので、教えて頂いた通り『Me。refresh』を
> 追加してここまできたのですが、何故これによってかわったのか理解ができていません。。。

Loadイベント時にはまだフォームは表示されていませんが、
表示するのにShowメソッドで先に表示しようとしたとしても、
このイベント内で引き続き重い処理をしていると、
それが終わるまできちんとは表示されません。
そこでRefreshメソッドにより強制表示しています。

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