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

DataGridの列の幅が変わらない

環境/言語:[Windows2000 VB.NET]
分類:[.NET]

いつもお世話になっております。
下記の様にDataGridの設定をしているのですが、
DataSetと連結すると幅が元に戻ってしまいます。(グリッドデータ表示処理)
どうする事も出来ないのでしょうか。
よろしくお願い致します。




Dim ds As New DataSet1()

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

Dim tblStyle = New DataGridTableStyle()
tblStyle.MappingName = "履歴"
DataGrid1.TableStyles.Add(tblStyle)

Dim clmStyle1 = New DataGridTextBoxColumn()
clmStyle1.MappingName = "No"
clmStyle1.HeaderText = "No"
clmStyle1.Width = 75
tblStyle.GridColumnStyles.Add(clmStyle1)

Dim clmStyle2 = New DataGridTextBoxColumn()
clmStyle2.MappingName = "日付"
clmStyle2.HeaderText = "日付"
clmStyle2.Width = 75
tblStyle.GridColumnStyles.Add(clmStyle2)

Dim clmStyle3 = New DataGridTextBoxColumn()
clmStyle3.MappingName = "時刻"
clmStyle3.HeaderText = "時刻"
clmStyle3.Width = 50
tblStyle.GridColumnStyles.Add(clmStyle3)

Dim clmStyle4 = New DataGridTextBoxColumn()
clmStyle4.MappingName = "場所"
clmStyle4.HeaderText = "場所"
clmStyle4.Width = 100
tblStyle.GridColumnStyles.Add(clmStyle4)

Dim clmStyle5 = New DataGridTextBoxColumn()
clmStyle5.MappingName = "種別"
clmStyle5.HeaderText = "種別"
clmStyle5.Width = 100
tblStyle.GridColumnStyles.Add(clmStyle5)

Dim clmStyle6 = New DataGridTextBoxColumn()
clmStyle6.MappingName = "項目"
clmStyle6.HeaderText = "項目"
clmStyle6.Width = 400
tblStyle.GridColumnStyles.Add(clmStyle6)

Me.DataGrid1.TableStyles.Add(tblStyle)

Exit Sub

Call グリッドデータ表示処理()

End Sub

Private Sub グリッドデータ表示処理()


'データ取得
ds.Clear()
Me.SqlDataAdapter1.SelectCommand.CommandText = "SELECT * FROM 履歴"
Me.SqlDataAdapter1.Fill(ds, "DataSet1")

'グリットにデータを代入
DataGrid1.Refresh()

DataGrid1.DataSource = ds
DataGrid1.DataMember = "DataSet1"

'編集禁止に設定
DataGrid1.ReadOnly = True
DataGrid1.AllowSorting = False
DataGrid1.AllowNavigation = False

End Sub
すみませんソースで間違いがありました。

Exit Sub ← これいらないです(Testとして入れていただけなので)

Call グリッドデータ表示処理()

End Sub
はじめましてよろしくお願いします。
コードを拝見して思ったのは何故項目設定をした後に、
ds.Clear()
Me.SqlDataAdapter1.SelectCommand.CommandText = "SELECT * FROM 履歴"
Me.SqlDataAdapter1.Fill(ds, "DataSet1")
としたり
DataGrid1.Refresh()
DataGrid1.DataSource = ds
DataGrid1.DataMember = "DataSet1"
とするのか疑問に思いました。
自宅で試していないので、間違っているのかも知れませんが、
処理の順番が逆なだけではないでしょうか?
お返事ありがとうございます。
初心者の為、マニュアルやネットで探しまくって記述しているので
変な書き方になってしまっているかもしれません。

> コードを拝見して思ったのは何故項目設定をした後に、
> ds.Clear()
> Me.SqlDataAdapter1.SelectCommand.CommandText = "SELECT * FROM 履歴"
> Me.SqlDataAdapter1.Fill(ds, "DataSet1")
> としたり

グリットの項目設定は、Loadの部分でやりたいのと、
実際の動きでは、この画面を表示したまま、
履歴表示の範囲指定の画面に移動したりして、
"SELECT * FROM 履歴"では無くて、
実際は、(g_CommandText = SQL文)
Me.SqlDataAdapter1.SelectCommand.CommandText = g_CommandText
と、その都度かわります。
履歴表示画面(frmRireki)で範囲指定ボタンが押されたら→範囲指定画面
範囲指定画面(frmRirekiSel)で範囲完了で、履歴画面に戻る
と行ったり来たりすので
グリットでのデータ表示処理は関数化しています。

また何度もグリット項目設定をするとエラーになりますよね。


> DataGrid1.Refresh()
> DataGrid1.DataSource = ds
> DataGrid1.DataMember = "DataSet1"
> とするのか疑問に思いました。

ここでRefreshしているのは、上記にも書いたように、一度履歴が表示されている場合
次に表示しようとすると追加されてしまうので、Refreshしています。

DataSetを使うのも、DataGridを使うのも初めてなので
どの順番で記述したらいいのか、良く分かりません。
Refreshしないで、表示されている行を1行ずつ消してから、
新しいデータセットをFillすればいいんでしょうか。

私が記述したような、DataSetにデータを入れたり、データをグリットに入れる方法は
間違っているのでしょうか。
色々探してみて、これが一番いいのではと思っていました。
よろしければ、教えていただけないでしょうか。
よろしくお願い致します。
きいぼーです。

満さんへ、
りきさんもかかれていますが、
Load時にGridの設定をやった後に、

> DataGrid1.Refresh()
> DataGrid1.DataSource = ds
> DataGrid1.DataMember = "DataSet1"
とデータソースを変更されている為にGridの設定がクリアされていると思います。
データソースの設定後に再度Gridの設定を行う必要があります。
きいぼーさんありがとうごさいます。

>>DataGrid1.Refresh()
>>DataGrid1.DataSource = ds
>>DataGrid1.DataMember = "DataSet1"
> とデータソースを変更されている為にGridの設定がクリアされていると思います。
> データソースの設定後に再度Gridの設定を行う必要があります。

これをふまえて、以下の様にソースを変更しましたが
やはり幅は変わりませんでした。
やはりSetDataBindingの場合も、再度Gird設定しないといけないのでしょうか。
もしそうだとすれば、設定部分を関数にしないといけないし
設定を全てクリアしてからではないとエラーが出てしまいますよね。
すみません、よろしくお願いします。

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

'グリッドのスタイル設定
Dim tblStyle = New DataGridTableStyle()
tblStyle.MappingName = "履歴"
DataGrid1.TableStyles.Add(tblStyle)

Dim clmStyle1 = New DataGridTextBoxColumn()
clmStyle1.MappingName = "No"
clmStyle1.HeaderText = "No"
clmStyle1.Width = 75
tblStyle.GridColumnStyles.Add(clmStyle1)
    (以下省略)

Call グリッドデータ表示処理()

End Sub

Private Sub グリッドデータ表示処理()

'データ取得
Me.SqlDataAdapter1.SelectCommand.CommandText = g_CommanText
Me.SqlDataAdapter1.Fill(ds, "DataSet1")

DataGrid1.SetDataBinding(ds, "DataSet1")

End Sub
何度もすみません。

Call グリッドデータ表示処理() を

Form_Loadの中の一番したにあるのを削除して
Gird設定の前に入れてみましたが、やはりダメなようです。

一体何が悪いんでしょうか・・・><
私自身興味のあったネタなので、実際に検証してみました。
以下のコードで大丈夫でしょう。
IDEが.net2002なのと原文のソースとは名称が違う部分があることに注意してください。

Dim ds As New DataSet1()
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim tblStyle = New DataGridTableStyle()
tblStyle.MappingName = "履歴"
DataGrid1.TableStyles.Add(tblStyle)
Dim clmStyle1 = New DataGridTextBoxColumn()
clmStyle1.MappingName = "No"
clmStyle1.HeaderText = "No"
clmStyle1.Width = 75
tblStyle.GridColumnStyles.Add(clmStyle1)
Dim clmStyle2 = New DataGridTextBoxColumn()
clmStyle2.MappingName = "日付"
clmStyle2.HeaderText = "日付"
clmStyle2.Width = 75
tblStyle.GridColumnStyles.Add(clmStyle2)
Dim clmStyle3 = New DataGridTextBoxColumn()
clmStyle3.MappingName = "時刻"
clmStyle3.HeaderText = "時刻"
clmStyle3.Width = 50
tblStyle.GridColumnStyles.Add(clmStyle3)
Dim clmStyle4 = New DataGridTextBoxColumn()
clmStyle4.MappingName = "場所"
clmStyle4.HeaderText = "場所"
clmStyle4.Width = 100
tblStyle.GridColumnStyles.Add(clmStyle4)
Dim clmStyle5 = New DataGridTextBoxColumn()
clmStyle5.MappingName = "種別"
clmStyle5.HeaderText = "種別"
clmStyle5.Width = 100
tblStyle.GridColumnStyles.Add(clmStyle5)
Dim clmStyle6 = New DataGridTextBoxColumn()
clmStyle6.MappingName = "項目"
clmStyle6.HeaderText = "項目"
clmStyle6.Width = 400
tblStyle.GridColumnStyles.Add(clmStyle6)
Me.DataGrid1.TableStyles.Add(tblStyle)
Call グリッドデータ表示処理()
End Sub
Private Sub グリッドデータ表示処理()
'データ取得
ds.Clear()
Me.OleDbDataAdapter1.SelectCommand.CommandText = "SELECT * FROM 履歴"
Me.OleDbDataAdapter1.Fill(ds, "履歴") '訂正
'グリットにデータを代入
DataGrid1.Refresh() '不要だがこのソースではエラーにならない
DataGrid1.DataSource = ds
DataGrid1.DataMember = "履歴" '訂正
'編集禁止に設定
DataGrid1.ReadOnly = True
DataGrid1.AllowSorting = False
DataGrid1.AllowNavigation = False
End Sub
りきさん 本当にありがとうございました。
検証までしていただけたのですね。
このソースの様に変更したらバッチリでした。
本当に最後までおつきあい頂き感謝しております。
今後も頑張って勉強して行きたいと思います。
解決済み!

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