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

Tabcontrolについて

  • 題名: Tabcontrolについて
  • 著者: りょう
  • 日時: 2005/10/26 12:15:04
  • ID: 13466
  • この記事の返信元:
    • (なし)
  • この記事への返信:
  • ツリーを表示
環境/言語:[Win2000 VB.Net Framework1.1]
分類:[.NET]

お世話になります。

TabcontrolへのTabpageの追加で質問があります。

下記プログラムでフォームロード時は正常にTabPageが追加されるのですが、
2回目以降(New)を通ってきた場合にTabPageが追加されません。
何かエラーが起きるわけでもなく正常に処理されているように見えるのですが
何が問題なのでしょうか?
フォームロード時はTabPageはありません。

よろしくお願いいたします。

以下プログラム=======================================================
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim mySQL As String
Dim strTabPrint As String
mySQL = "SELECT * FROM HOGEHOGE"
strTabPrint = "Tab1"
Call DataGridView(mySQL, strTabPrint)
End Sub

Private Sub DataGridView(ByVal A As String, ByVal B As String)
Dim myTabPage As New TabPage

'Me.TabControl1.Controls.Add(myTabPage)
Me.TabControl1.TabPages.Add(myTabPage)
myTabPage.Text = B

'以下別処理

End Sub

Public Sub New(ByVal D As String, ByVal E As String)
Me.New()
Call DataGridView(D, E)
End Sub
====================================================================
> 下記プログラムでフォームロード時は正常にTabPageが追加されるのですが、
> 2回目以降(New)を通ってきた場合にTabPageが追加されません。
>
> Public Sub New(ByVal D As String, ByVal E As String)
> Me.New()
> Call DataGridView(D, E)
> End Sub

#MyBase.New()ではないですか?

オリジナル(フォームデザイナで作成された)のNewコンストラクタをよく見てみましょう。
原因が見えてくると思います。
お返事ありがとうございます。

下記、Me.New()をMyBase.Newにすると、「Sub DataGridView」でのtabcontrolが
Nothingとなってしますのですが、これはこういう使い方をすると初回と2回目以降と
で別ルーチンを使用しなければならないということでしょうか?
(見当はずれでしたらすみません)

■No13472に返信(まどかさんの記事)
>>下記プログラムでフォームロード時は正常にTabPageが追加されるのですが、
>>2回目以降(New)を通ってきた場合にTabPageが追加されません。
>>
>> Public Sub New(ByVal D As String, ByVal E As String)
>> Me.New()
>> Call DataGridView(D, E)
>> End Sub
>
> #MyBase.New()ではないですか?
>
> オリジナル(フォームデザイナで作成された)のNewコンストラクタをよく見てみましょう。
> 原因が見えてくると思います。
>>#MyBase.New()ではないですか?

すいません。
てっきりInitializeComponentが実行されてないという思い違いをしてしまいました。
#MyBaseの場合、InitializeComponentの呼び出しを記述する必要がありますね。

本題ですが、こちらでは正常に表示されました。

> Public Sub New(ByVal D As String, ByVal E As String)

もしかして、x = New Form1() としてませんか?
お返事ありがとうございます。

>もしかして、x = New Form1() としてませんか?
いえ、やっていません。

下記が実際のプログラム(少々手を加えています)なのですが、すぐ下のNewの部分が
原因だと思うのですがどうでしょうか?(Newしてみたり、はずしてみたりといろいろ
してはみたのですが・・・)

よろしくお願いいたします。

以下プログラム=======================================================
Private Sub DataGridView(ByVal mySQL As String, ByVal myDataSetName As String)
Dim SqlConn As SqlClient.SqlConnection
Dim myTabPage As TabPage = New TabPage
Dim DataGrid1 As DataGrid = New DataGrid
Dim TabControl1 As TabControl = New TabControl

strSQL = mySQL
    'TabControl1.Controls.Add(myTabPage)
TabControl1.TabPages.Add(myTabPage)
myTabPage.Text = myDataSetName

Try
SqlConn = New SqlClient.SqlConnection
SqlConn.ConnectionString = MasterConnectString
SqlConn.Open()

Dim selectCmd As SqlClient.SqlCommand = New SqlClient.SqlCommand
selectCmd.Connection = SqlConn
selectCmd.CommandText = strSQL

Dim myDataAdapter As SqlClient.SqlDataAdapter
Dim myDataSet As DataSet = New DataSet

'Dim myDataTable As DataTable

myDataAdapter = New SqlClient.SqlDataAdapter
myDataAdapter.SelectCommand = selectCmd
myDataAdapter.Fill(myDataSet, myDataSetName)

Me.DataGrid1.DataSource = myDataSet
Me.DataGrid1.DataMember = myDataSetName

Catch ex As Exception
MsgBox(ex.StackTrace)
Finally
If Not SqlConn Is Nothing Then
SqlConn.Close()
SqlConn.Dispose()
End If
End Try

End Sub

Public Sub New(ByVal strSQL_form As String, ByVal myDataSet As String)
'MyBase.New()
Me.New()

'InitializeComponent()

Call DataGridView(strSQL_form, myDataSet)

End Sub

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

Dim mySQL As String
Dim strTabPrint As String

mySQL = "SELECT * FROM HOGE_TBL"
strTabPrint = "HOGE情報"
Call DataGridView(mySQL, strTabPrint)
DataGrid1.ReadOnly = True
End Sub


========================================================
> Private Sub DataGridView(ByVal mySQL As String, ByVal myDataSetName As String)
> Dim TabControl1 As TabControl = New TabControl

#最初にこれが書いてあれば。。。

コントロールをデザインで貼り付けて表示されるということは、
その変数が定義され、InitializeComponent内でNewされるということです。
で、↑でもNewしてるので。。。

たぶん、New→Add→New→Addで同じ位置にTabControlが重なっているのではないでしょうか。
■No13481に返信(まどかさんの記事)
お返事ありがとうございます。

>> Private Sub DataGridView(ByVal mySQL As String, ByVal myDataSetName As String)
>> Dim TabControl1 As TabControl = New TabControl
>
> #最初にこれが書いてあれば。。。
>
> コントロールをデザインで貼り付けて表示されるということは、
> その変数が定義され、InitializeComponent内でNewされるということです。
> で、↑でもNewしてるので。。。
>
> たぶん、New→Add→New→Addで同じ位置にTabControlが重なっているのではないでしょうか。

ただ、New→Add→New→Addであれば、
>Me.TabControl1.TabPages.Add(myTabPage)
>myTabPage.Text = myDataSetName
でtabの表示は新しいものに変わるということだと思うのですが何も変わらないという
状態なので・・・

Tabcontrol1をフォームデザイン上で作成し、TabPageのみNewする方法でも行ってみ
たのですがやはり結果は同じでした。(DataGridの値も変わらないことから何か根本的
な問題のような気もします)
> でtabの表示は新しいものに変わるということだと思うのですが何も変わらないという
> 状態なので・・・

本題では「追加されない」でしたが、「追加されるがテキストが変わらない」ですか?
どっちでしょうか?

「追加できない」であれば、
新規プロジェクトで次のコードは正しく動作しますか?

・フォームにTabControlを貼り付ける
・作成されたNewコンストラクタに下記を記述
Dim x As New TabPage("ABC")
TabControl1.TabPages.Add(x)
・同様にLoadイベントへも記述(ABCをDEFなどに変える)

「テキストが変わらない」であれば、別の問題かもしれません。
個人的にも、ListViewSubItemのテキストを変更しても描画されない
という経験があり未だ原因がわかっていません。
このときは、ダミーのオブジェクトをAddしてRemoveすることで
確実に描画されるようになりました。
■No13486に返信(まどかさんの記事)
>>でtabの表示は新しいものに変わるということだと思うのですが何も変わらないという
>>状態なので・・・
>
> 本題では「追加されない」でしたが、「追加されるがテキストが変わらない」ですか?
> どっちでしょうか?
正確に言うと追加されないし、テキストも変わらないし、DataGridの値も変わらない
 です。「New→Add→New→Add」ということでしたので
「New→Add(テキスト:AAAAAA)→New→Add(テキスト:BBBBBB)」という意味でテキスト
 が変わらないといいました。
 Me.Showなどを試してみたところ、
> Me.TabControl1.Controls.Add(myTabPage)
> Me.Show()  '試してみたもの
> System.Windows.Forms.Application.DoEvents()  '試してみたもの
Me.Showを読み込んだ後、またMe.TabControl1.Controls.Add(myTabPage)が動き
 フォームが2個立ち上がっていました。(2個目のほうにTabPageが追加されてい
 ました)


> 「追加できない」であれば、
> 新規プロジェクトで次のコードは正しく動作しますか?
>
> ・フォームにTabControlを貼り付ける
> ・作成されたNewコンストラクタに下記を記述
> Dim x As New TabPage("ABC")
> TabControl1.TabPages.Add(x)
> ・同様にLoadイベントへも記述(ABCをDEFなどに変える)

 上記は正常に出来ました。

> 「テキストが変わらない」であれば、別の問題かもしれません。
> 個人的にも、ListViewSubItemのテキストを変更しても描画されない
> という経験があり未だ原因がわかっていません。
> このときは、ダミーのオブジェクトをAddしてRemoveすることで
> 確実に描画されるようになりました。
確認です。

先のコードではNewが2回実行されるのでそれぞれにAddされコントロールが重なっているはずですが
デバッグでMe.Controlsの中を見たらTabControlが2ついませんか?
#コマンドウィンドウで?Me.Controls(n).GetType().Nameで見てください。
  • 題名: Re[10]: Tabcontrolについて
  • 著者: りょう
  • 日時: 2005/10/26 19:28:43
  • ID: 13490
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
■No13489に返信(まどかさんの記事)
> 確認です。
>
> 先のコードではNewが2回実行されるのでそれぞれにAddされコントロールが重なっているはずですが
> デバッグでMe.Controlsの中を見たらTabControlが2ついませんか?
> #コマンドウィンドウで?Me.Controls(n).GetType().Nameで見てください。

確認したところ
n=0 Button
n=1 TabControl
n=2 DataGrid
となっていました。
DataGridViewメソッドで賽の河原の石積みのようなことが行われています。

> 以下プログラム=======================================================
> Private Sub DataGridView(ByVal mySQL As String, ByVal myDataSetName As String)
> Dim SqlConn As SqlClient.SqlConnection
> Dim myTabPage As TabPage = New TabPage
> Dim DataGrid1 As DataGrid = New DataGrid

フォーム上にもDataGrid1が貼り付けてあるのでは?
ローカル変数でDataGrid1を定義するのはおかしいでしょう。
以降のソースではこのDataGrid1ではなく、フォーム上(にあると思われる)の
Me.DataGrid1を操作しているので、この変数は実際には何も使われていません。

> Dim TabControl1 As TabControl = New TabControl

同様にフォーム上にもTabControl1が貼り付けてあるのでは?
ローカル変数でTabControl1を定義して、それを操作しても、
フォーム上のタブコントロールには何も影響しません。

> strSQL = mySQL
>     'TabControl1.Controls.Add(myTabPage)
> TabControl1.TabPages.Add(myTabPage)
> myTabPage.Text = myDataSetName
>
> Try
> SqlConn = New SqlClient.SqlConnection
> SqlConn.ConnectionString = MasterConnectString
> SqlConn.Open()
>
> Dim selectCmd As SqlClient.SqlCommand = New SqlClient.SqlCommand
> selectCmd.Connection = SqlConn
> selectCmd.CommandText = strSQL
>
> Dim myDataAdapter As SqlClient.SqlDataAdapter
> Dim myDataSet As DataSet = New DataSet
>
> 'Dim myDataTable As DataTable
>
> myDataAdapter = New SqlClient.SqlDataAdapter
> myDataAdapter.SelectCommand = selectCmd
> myDataAdapter.Fill(myDataSet, myDataSetName)
>
> Me.DataGrid1.DataSource = myDataSet
> Me.DataGrid1.DataMember = myDataSetName
>
> Catch ex As Exception
> MsgBox(ex.StackTrace)
> Finally
> If Not SqlConn Is Nothing Then
> SqlConn.Close()
> SqlConn.Dispose()
> End If
> End Try
>
> End Sub
>
> Public Sub New(ByVal strSQL_form As String, ByVal myDataSet As String)
> 'MyBase.New()
> Me.New()
>
> 'InitializeComponent()
>
> Call DataGridView(strSQL_form, myDataSet)
>
> End Sub
>
> Private Sub frm_Merchant_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
>
> Dim mySQL As String
> Dim strTabPrint As String
>
> mySQL = "SELECT * FROM HOGE_TBL"
> strTabPrint = "HOGE情報"
> Call DataGridView(mySQL, strTabPrint)
> DataGrid1.ReadOnly = True
> End Sub
>
> ========================================================
> 以降のソースではこのDataGrid1ではなく、フォーム上(にあると思われる)の
> Me.DataGrid1を操作しているので、この変数は実際には何も使われていません。

なるほど、あとから提示のソースではそうですね。
本題のソースではMe.となってますが。。。

#Controls。Addしてないのに「重なってる」なんて、私もとんちんかんなこと言ってましたね。
  • 題名: Re[7]: Tabcontrolについて
  • 著者: りょう
  • 日時: 2005/10/27 10:28:34
  • ID: 13509
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
2005/10/27(Thu) 11:10:19 編集(投稿者)
2005/10/27(Thu) 11:10:16 編集(投稿者)

よねKENさん・まどかさん
お返事ありがとうございます。

> フォーム上にもDataGrid1が貼り付けてあるのでは?
> ローカル変数でDataGrid1を定義するのはおかしいでしょう。
> 以降のソースではこのDataGrid1ではなく、フォーム上(にあると思われる)の
> Me.DataGrid1を操作しているので、この変数は実際には何も使われていません。

>> Dim TabControl1 As TabControl = New TabControl

> 同様にフォーム上にもTabControl1が貼り付けてあるのでは?
> ローカル変数でTabControl1を定義して、それを操作しても、
> フォーム上のタブコントロールには何も影響しません。

■No13497に返信(まどかさんの記事)
>>以降のソースではこのDataGrid1ではなく、フォーム上(にあると思われる)の
>>Me.DataGrid1を操作しているので、この変数は実際には何も使われていません。
>
> なるほど、あとから提示のソースではそうですね。
> 本題のソースではMe.となってますが。。。
>
> #Controls。Addしてないのに「重なってる」なんて、私もとんちんかんなこと言ってましたね。

すみません。TabControl1やDataGridの設定はいろいろ試していたときの名残になりま
す。
調べていたところ、別フォームからの呼び出しのところがおかしいのかなと感じられる
のでもう少し調べてみます。
(MDIを使用し子フォームの検索ボタンを作成しそのボタンを押すと別フォームを開いて、
そこでSQL文を作成して別フォームの実行ボタンを押すと元の子フォームのDataGridに
反映させる(TabPageごとに)という目的です。)

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