- 題名: ListViewで列順の変更を保持する方法
- 日時: 2003/12/18 22:19:53
- ID: 1894
- この記事の返信元:
- (なし)
- この記事への返信:
- [1895] Re[1]: ListViewで列順の変更を保持する方法2003/12/18 22:27:37
- ツリーを表示
こんばんは、こうさん。ピラルクです。 ヘッダはSysHeader32という別Windowのようで、 そいつに問い合わせる感じになります。 Sourceのコメントにあるとおり未完成なので、(^^;;; 完成させてやってください。 Public Class Form1 Inherits System.Windows.Forms.Form Const LVM_GETHEADER As Integer = &H1000 + 31 'LVM_FIRST + 31 Const HDM_HITTEST As Integer = &H1200 + 6 'HDM_FIRST + 6 Structure HD_HITTESTINFO Dim pt As Point Dim flags As Integer Dim iItem As Integer End Structure Declare Function SendMessage Lib "user32" Alias "SendMessageA" ( _ ByVal hwnd As IntPtr, ByVal wMsg As Integer, _ ByVal wParam As IntPtr, ByRef lParam As HD_HITTESTINFO) As IntPtr '" Windows フォーム デザイナで生成されたコード " '↑↑↑ ListView と Button を1つずつ貼る Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'このSub内は単なるテスト環境構築用 With ListView1 .AllowColumnReorder = True .View = View.Details .Columns.Add("ユーザID", 80, HorizontalAlignment.Left) .Columns.Add("ユーザ名", 120, HorizontalAlignment.Left) .Columns.Add("年齢", 60, HorizontalAlignment.Left) .Columns.Add("所属", 70, HorizontalAlignment.Left) .Columns.Add("備考", 200, HorizontalAlignment.Left) .Items.Add(New ListViewItem(New String() {"123", "scott", "25", "DEPT1", "OraUser"})) .Items.Add(New ListViewItem(New String() {"246", "sa", "28", "DEPT2", "SQLUser"})) End With End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim i As Integer Dim p As Point Dim udtHTI As HD_HITTESTINFO Dim hSysHeader As IntPtr = SendMessage(ListView1.Handle, LVM_GETHEADER, IntPtr.Zero, Nothing) udtHTI.pt.X = 10 'なぜか10位でないと上手くいかない。なぜ0ではダメなのか? For i = 0 To ListView1.Columns.Count - 1 SendMessage(hSysHeader, HDM_HITTEST, IntPtr.Zero, udtHTI) udtHTI.pt.X += ListView1.Columns(udtHTI.iItem).Width Console.Write(ListView1.Columns(udtHTI.iItem).Text & ", ") Next Console.WriteLine() '列幅を狭めているとudtHTI.iItemは-1を返す。対策が必要だ。。。 End Sub End Class
分類:[.NET]
WIN2000 or WINXP
VB.NET2003
こうといいます
VB.NET2003で開発しています。
さて表題の方法ですが
ListViewを使用して一覧表を表示する画面を開発しているのですが
ユーザから
「実行時にマウスのドラック&ドロップで変更した列順を
保持して次回のAP起動時に保持している列順で表示したい」
との要望があり
色々調査&検討しているのですが
実行時に変更した列順を抽出する方法が見つからなく
皆さまから情報をいただきたく書きこませていただきました
以下例を示します。
@初期表示
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
ユーザID | ユーザ名 | 年齢 | 所属 | 備考 |
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
と表示されているのを
実行時にマウスのドラックで
A列を移動
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
ユーザID|ユーザ名| 備考 | 所属 | 年齢 |
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
のように年齢を後ろにもっていき、備考を前に持ってきたとします。
この状態でAPを終了させ再度起動すると
Aの状態で表示されるようにしたいのです。
ちなみに列幅の変更はコードで取得することができたので幅情報は保持することが
できました。
※お客様がこの機能を望む理由
実は、列は10カラムほどあり横スクロールしないと全列を見ることはできません
そこでお客様が、好きなように重要な列を左に持ってきてスクロールしなくても
重要な情報が見れるようになればとても使い勝手があがる
と言う理由からです。
長々と書いてしまいましたが
列順を何とか抽出して(ファイル等に保持)再起動時に列順を設定することは可能なのでしょうか
ファイルエクスプローラやタスクマネージャの「プロセス」タグを見る限り列順を覚えておけると思うのですが
(ListViewを使用しているのか分かりませんが)
どうか、皆様からの情報を待っております。
宜しくお願いいたします。