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

Listviewのスクロール

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

お世話になります。

ListviewのViewプロパティをDetailsにし、一覧表風にSQLからのテーブル内容を表示していますが、項目が多いためスクロールバーを動かして、右の方の項目は見ることになります。
左の方には名前などがありますが、右にスクロールした場合は、誰の行を見ているかわかりません。
ある列(SubItem)までは固定で、それ以外がスクロールって可能なのでしょうか?
(エクセルのウインドウ枠固定みたいな感じです)

AllowColumnReorder=Trueではちょっと辛いし・・・。

よろしくお願い致します。
Shinoさん こんにちわ。

上記の無いようですが、無理なんじゃないかと思います。
でですね、代替案?とコメントです。。


・代替案
必ず表示させたい項目のみを、別の一覧で用意する。
[主要データ]と[詳細データ]みたいな感じですね。


・コメント
一覧上にそれだけ多くの情報をのせる必要があるのかちょっと疑問です。
一覧で表示する項目は、お客さんと相談して、
画面に納まる範囲に削ったほうがいいような気がします。

一覧では、そのデータを一意に認識できる情報だけに留め、
詳細の表示or編集はそれ専用の画面を用意したほうがすっきりすると思いますよ。
こんばんは、SHさん。いつもありがとございます。

> 必ず表示させたい項目のみを、別の一覧で用意する。
> [主要データ]と[詳細データ]みたいな感じですね。

ListViewを2つ作るってことですよね。となると、縦にスクロールした時に、2つのListViewが一緒にスクロールしなければならないと思いますが、
左のListviewを1、右を2とすると、スクロールバー2動かした時、スクロールバー1も動かすのは、Listview1.スクローロバー.?? = Listview2.スクローロバー.??
みたいなコードだと思うのですが分かりません・・・。

また、スクロールバー1が見えるのはまずいので、ListView1.Scrollable = False
で消すとすると、上記のことが出来なくなるのでは・・・?


> ・コメント
> 一覧上にそれだけ多くの情報をのせる必要があるのかちょっと疑問です。
> 一覧で表示する項目は、お客さんと相談して、
> 画面に納まる範囲に削ったほうがいいような気がします。
>
> 一覧では、そのデータを一意に認識できる情報だけに留め、
> 詳細の表示or編集はそれ専用の画面を用意したほうがすっきりすると思いますよ。
>
うーん、さらに画面展開するのは、ちょっと無理ですね。実際、こんな項目いらないでしょ?とかは言ってはいるのですが・・・。

よろしくお願い致します。
■No5568に返信(Shinoさんの記事)
> こんばんは、SHさん。いつもありがとございます。
>
>>必ず表示させたい項目のみを、別の一覧で用意する。
>>[主要データ]と[詳細データ]みたいな感じですね。
>
> ListViewを2つ作るってことですよね。となると、縦にスクロールした時に、2つのListViewが一緒にスクロールしなければならないと思いますが、
> 左のListviewを1、右を2とすると、スクロールバー2動かした時、スクロールバー1も動かすのは、Listview1.スクローロバー.?? = Listview2.スクローロバー.??
> みたいなコードだと思うのですが分かりません・・・。
>
> また、スクロールバー1が見えるのはまずいので、ListView1.Scrollable = False
> で消すとすると、上記のことが出来なくなるのでは・・・?
>
>
>>・コメント
>>一覧上にそれだけ多くの情報をのせる必要があるのかちょっと疑問です。
>>一覧で表示する項目は、お客さんと相談して、
>>画面に納まる範囲に削ったほうがいいような気がします。
>>
>>一覧では、そのデータを一意に認識できる情報だけに留め、
>>詳細の表示or編集はそれ専用の画面を用意したほうがすっきりすると思いますよ。
>>
> うーん、さらに画面展開するのは、ちょっと無理ですね。実際、こんな項目いらないでしょ?とかは言ってはいるのですが・・・。
>
> よろしくお願い致します。

Shinoさん、こんばんは。
1のスクロールを隠す方法として、2を前面配置し、2を1のスクロールバーのが隠れるように配置します。
そうする事で1のスクロールイベントは無視できるので、2のスクロールイベントに、1,2のスクロール処理を書けばいいわけです。
結果的に、ListView1.Scrollable = Falseを無視することができます。
これって、昔からされている、裏テクニックです。
ぺがらぼさん、こんばんは。

> 1のスクロールを隠す方法として、2を前面配置し、2を1のスクロールバーの
>が隠れるように配置します。
> そうする事で1のスクロールイベントは無視できるので、2のスクロールイベン
>トに、1,2のスクロール処理を書けばいいわけです。
> 結果的に、ListView1.Scrollable = Falseを無視することができます。
> これって、昔からされている、裏テクニックです。

私が作っているのは、Listview_Clickイベントの中で、
XXX = ListView1.SelectedItems(0).SubItems(2).Text・・・
で選んだ行の内容からテーブルのKEYを取得して・・・という感じです。
(これだと絶対KEY内容を表示しなければならなくなってしまうので、
本当は作りが悪いとは思いますが)スクロールバーのイベントって意識もありませんでした。

Listview.〜に続くのをいろいろ見ているのですが、スクロールイベントって
どういうコードになりますか?見つかりません・・・。
申し訳ありません。
お願い致します。
■No5576に返信(Shinoさんの記事)
> ぺがらぼさん、こんばんは。
>
>>1のスクロールを隠す方法として、2を前面配置し、2を1のスクロールバーの
> >が隠れるように配置します。
>>そうする事で1のスクロールイベントは無視できるので、2のスクロールイベン
> >トに、1,2のスクロール処理を書けばいいわけです。
>>結果的に、ListView1.Scrollable = Falseを無視することができます。
>>これって、昔からされている、裏テクニックです。
>
> 私が作っているのは、Listview_Clickイベントの中で、
> XXX = ListView1.SelectedItems(0).SubItems(2).Text・・・
> で選んだ行の内容からテーブルのKEYを取得して・・・という感じです。
> (これだと絶対KEY内容を表示しなければならなくなってしまうので、
> 本当は作りが悪いとは思いますが)スクロールバーのイベントって意識もありませんでした。
>
> Listview.〜に続くのをいろいろ見ているのですが、スクロールイベントって
> どういうコードになりますか?見つかりません・・・。
> 申し訳ありません。
> お願い致します。

SelectedIndexChangedイベントでできませんか?

もう少し、難しい技術として、ListViewの派生クラスを作成しWndProc()をオーバーライドしてWindowsMessageを拾ってタイミングを見る(下記サイトから引用)
ttp://groups.yahoo.co.jp/group/dotnet-csharp/message/1862
■No5554に返信(Shinoさんの記事)

今日は いつも参考にさせていただいています。
初心者の平ちゃんです。

単純に  ListView1.Columns(1).Width = 0
で必要のない列を非表示にするのはどうでしょうか?

スクロールバーの変わりにボタンを押して非表示/表示を制御します。
エクセルの列固定のイメージになります。
見栄え良くボタンが配置できるかどうかですが。
SHさん、ぺがらぼさん、平さん、レスありがとうございます。

やはりListView2つ作って、右のListViewの縦のスクロールバーで、2つのListView
を制御したいのですが、試しにListView2のSelectedIndexChangedイベントにMsgBox入れて、スクロールさせても何も出てこないし・・・。

申し訳ありません、もう少し詳しく教えて頂けませんか?
■No5717に返信(Shinoさんの記事)
> SHさん、ぺがらぼさん、平さん、レスありがとうございます。
>
> やはりListView2つ作って、右のListViewの縦のスクロールバーで、2つのListView
> を制御したいのですが、試しにListView2のSelectedIndexChangedイベントにMsgBox入れて、スクロールさせても何も出てこないし・・・。

スクロールでは、SelectedIndexChanged()イベントは発生しません。
ListViewを継承したカスタムコントロールで、WndProc()をオーバーライドして、
条件に合致したら RaiseEvent すると大変楽です。

# 親たる、Formもスクロール時にわけがわからないメッセージを拾ってるようですが。
java.lang.Nullpoさん、レスありがとうございます。

> スクロールでは、SelectedIndexChanged()イベントは発生しません。
では、どのイベントが発生するのでしょうか?
実際、ListViewにつづくイベントをしらみつぶしに書いてみてはいるのですが・・・?

> ListViewを継承したカスタムコントロールで、WndProc()をオーバーライドして、
> 条件に合致したら RaiseEvent すると大変楽です。
すいません、??です。

ぺがらぼさんに教えて頂いたリンク先を見ても、まだ理解出来るレベルではありません・・・。
  • 題名: Re[4]: Listviewのスクロール
  • 著者: java.lang.Nullpo
  • 日時: 2004/08/23 11:11:36
  • ID: 5741
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
2004/09/07(Tue) 09:26:47 編集(投稿者)

■No5721に返信(Shinoさんの記事)
> java.lang.Nullpoさん、レスありがとうございます。

> > スクロールでは、SelectedIndexChanged()イベントは発生しません。

> では、どのイベントが発生するのでしょうか?
> 実際、ListViewにつづくイベントをしらみつぶしに書いてみてはいるのですが・・・?

該当イベントがあったら紹介してます。
スクロールされたことをキャッチできるイベントがないので、

> > ListViewを継承したカスタムコントロールで、WndProc()をオーバーライドして、
> > 条件に合致したら RaiseEvent すると大変楽です。

で、イベントを自作することを薦めています。

> すいません、??です。
>
> ぺがらぼさんに教えて頂いたリンク先を見ても、まだ理解出来るレベルではありません・・・。

カスタムコントロールを作っても良いなら、そのイベントを実装できるということです。
新たに、カスタムコントロールかユーザコントロールでも追加してやる必要はあります。

下記をコピペすることはお勧めしませんが、一応ソースをはっておきます。

’外部に公開されたListViewコントロールクラス
Public Class ExListView
  ’ListViewコントロールを継承
  Inherits System.Windows.Forms.ListView

  ’外部に公開されたイベントを定義します(引数はプログラマの自由です)
  Public Event VerticalScrolled(ByVal sender As Object, ByVal e As EventArgs)

  ’this::WndProc
  Protected Overrides Sub WndProc(ByRef m As Message)
    Const WM_VSCROLL As Integer = &H115

    If m.Msg = WM_VSCROLL Then
      RaiseEvent VerticalScrolled(Me, New EventArgs)
    End If

    MyBase.WndProc(m)
  End Sub
End Class

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