• 締切済み

[C#]ListView一覧表示時の幅設定について

[開発言語] C# [開発環境] Visual Studio 2005 C#のListViewに関して質問です。 ViewプロパティにListを指定した場合のItemの幅はどのように設定するのでしょうか? 理想としては、エクスプローラのように ItemのTextの長さに応じて最適な幅に調節したいのです。 よろしくお願いいたします。

みんなの回答

  • reset_cat
  • ベストアンサー率68% (94/138)
回答No.2

Widthに値(120とか)を設定してしまうと、それ以降ヘッダの自動計算は行われないみたいですね。 最初にアイテムを追加する前にWidthを-1に設定すると、とりあえず動いているようですが・・・あまりいいやり方ではないですね。 ふと思ったのですが、ViewでDetailを使用したくない理由はなんでしょうか?ヘッダを表示したくないだけならば、HeaderStyleをColumnHeaderStyle.Noneにすれば実現できる上にColumnHeaderやWidth = -1なども問題なく使用できると思いますが・・・

  • reset_cat
  • ベストアンサー率68% (94/138)
回答No.1

日にちが経ってるので、もう見てないかもしれませんが・・・ ViewプロパティがListの時は、Detailの時のヘッダ項目が無い表示と同じ扱いをできるっぽいので、Detailの時と同じ様に列を追加してやることで幅が操作できるようです。 ColumnHeader column1 = new ColumnHeader(); column1.Name = "column1"; listView1.Columns.Add(column1); としておいて、 listView1.Columns[0].Width = 180; または listView1.Columns["column1"].Width = 180; とか。

chowwwwwww
質問者

お礼

なるほど。幅の直接指定はこれでクリアできました。 ありがとうございます。 ただ、Details時と同じ要領で listView1.Columns[0].Width = -1; としても、幅の自動調節はされませんでした。 List時には、中身に応じて幅を自動調節することは不可能なのでしょうか?

関連するQ&A

  • ストアアプリ開発 C# ListViewについて

    ストアアプリ開発 C#初心者です。 サーバーからデータ取得後、 ListViewにデータを追加したいのですがよくわかりません。 ListViewに表示させたいのは日付、タイトル、画像です。 xaml↓ <ListView Grid.Row="1" x:Name="ListView1"></ListView> C# foreach (var item in blog_list){ ListViewItem addItem = new ListViewItem(); addItem.Tag = item.GetObject().GetNamedString("id"); addItem.Content = item.GetObject().GetNamedString("name"); ListView1.Items.Add(addItem); } 本当に初心者で申し訳ないのですがわかりやすい 解説等してるサイトありましたら教えてください。

  • C# ListView 自作列幅調整 描画されない

    いつもお世話になっております。 今回はC#のListViewで皆様にお聞きしたいことがあり、 質問させて頂きました。 ListViewに3列追加しListViewの幅が変更された際に 2列目のみを引き延ばすものを作りたいと思っています。 しかし、以下操作を行うと、ListViewのリサイズ等で 描画更新されない状態になってしまいます。 (また、リストアイテムをクリックするとその列は描画されるのですが、 アイテムの描画開始Y位置がおかしくなっています。)  1.縦スクロールバーが表示されるまで縮小する  2.スクロールバーのノブを下に移動  3.縦スクロールバーの表示が消えるまで拡大する サンプルコード及び画像を添付いたします。 内容は、  3列のListViewに適当なアイテムを10個追加し、  OnClientSizeChangedでClientSize.Widthと1列3列の幅から  2列目の幅を算出・設定しています。 ※画像は、以下コントロールをFormに張り付けただけのもので  問題の起こる操作をした際のものになります。 class MyListView : ListView {   public const int COL_1_WIDTH  = 30;   public const int COL_3_WIDTH  = 75;   enum LISTVIEW_COL   {     COL1,     COL2,     COL3,     NUM   }   public MyListView() {     Dock = DockStyle.Fill;     HeaderStyle = ColumnHeaderStyle.None;     FullRowSelect = true;     HideSelection = false;     View = System.Windows.Forms.View.Details;     //ヘッダ追加     ColumnHeader column1 = new ColumnHeader();     ColumnHeader column2 = new ColumnHeader();     ColumnHeader column3 = new ColumnHeader();     ColumnHeader[] columnHeaders = { column1, column2, column3 };     this.Columns.AddRange( columnHeaders );     //ヘッダ幅追加     this.Columns[( int )LISTVIEW_COL.COL1].Width = COL_1_WIDTH;  //1列固定     this.Columns[( int )LISTVIEW_COL.COL3].Width = COL_3_WIDTH; //3列固定     int width = ClientRectangle.Width;     for( int i = 0; i < Columns.Count; i++ ) {       if( i == ( int )LISTVIEW_COL.COL2 ) { continue; }       width -= Columns[i].Width;     }     //2列 リストビューの幅いっぱいになるように調節     this.Columns[( int )LISTVIEW_COL.COL2].Width = width;     //適当にアイテム追加     for( int i = 0; i < 10; i++ ) {       string[] strs = { "COL1", "COL2", "COL3" };       ListViewItem item = new ListViewItem( strs );       this.Items.Add( item );     }   }   protected override void OnClientSizeChanged( EventArgs e ) {     base.OnClientSizeChanged( e );     //2列の幅を調整     int width = ClientRectangle.Width;     for( int i = 0; i < Columns.Count; i++ ) {       if( i == ( int )LISTVIEW_COL.COL2 ) { continue; }       width -= Columns[i].Width;     }     Columns[( int )LISTVIEW_COL.COL2].Width = width;   } } 何故このようになってしまうのかご存知の方いらっしゃいましたら教えてください。

  • ListViewでのリスト表示(初歩的な質問です)

    WinXP Pro VB6.0で開発を行っています。 現在、ドラッグ&ドロップにより、ListViewでファイルのパスをリスト表示するプログラムを作成しています。 ListBoxではなくListViewを利用する理由は、パスの長さに合わせてスクロールバーを表示したいためです。 そこで、ドラッグ&ドロップイベントでファイルのパスを取得することは出来たのですが、単純なリスト表示ができません。 ListView1.ListItems.Add(, , tmpPath) でパスを追加しているのですが、プロパティの設定がよく分からずうまく表示できません。 Viewを2-lvwLstに変更し、何となく表示はしているのですが2列表示になり、縦のスクロールバーが表示されません。 なお、表示の際、ヘッダ部分は必要ありません。 また、パスのみの表示であるため、一項目の表示です。 プロパティの設定例を教えていただけませんか? 非常に初歩的な質問ですがよろしくお願いします。

  • C# ListView内の検索機能について

    C#にて次のようなアプリを作成しています。 まず、MainであるForm1に、ListViewと<追加>ボタンがあります。そのボタンを押下すると入力Form(Form2)が表示されます。Form2ではListViewに追加したい項目を入力し、Form2内の<リスト追加>ボタンを押下のタイミングでForm1のListViewにその項目が追加されていきます。 MainのForm1には<検索>ボタンと検索キーワード入力テキストが用意されていて、ボタン押下のタイミングでForm1内のListViewの項目と照らし合わせ、同じ項目があれば、その項目をForm3のListViewに追加/表示させようと考えています。 この"検索"の機能が実装できません。 string keyWord = textBox1.Text; ListViewItem foundItem = listView1.FindItemWithText(keyWord, true, 0, true); if (foundItem != null) { fm3 = new Form3(); fm3.listView1.TopItem = foundItem; } fm3.Show(); 上記のように考えていますが、うまくいきません。 エラーはありません。 どうにか検索機能を実装させるために、どうか皆さんアドバイスのほど、よろしくお願いいたします。

  • C#の処理をリアルタイムに表示させる方法

    いつもありがとうございます。 現在、visual C#を勉強中で、とても初歩的なことを聞いてしまうかもしれませんが、 よろしくお願いします。 かなり時間がかかる処理を作っているのですが、 すべて終わるまでツールが結果を表示してくれなくて困っています。 forやforeachのループを1回回るごとに データを表示させることは可能でしょうか? また処理途中で一時停止したいです。 具体的には、listviewにデータを表示させています。 たとえば以下のような処理ですが、すべ終わって結果が 表示されるのは、1個ずつリアルタイムにリストビューに 追加されていき・・・ さらに途中で一時停止をしたいと考えています。 for (int i=0; i<10000; i++) { 処理して得られたデータを listView1.Items.Add(データ); と追加 } 以上よろしくお願いします。

  • コンボボックスの矢印の幅調整

    コンボボックスでアイテムを選択する矢印の幅を広くしたいのですが、 プロパティで設定する事が可能なのでしょうか?。高さはフォントの大きさで設定出来るのですが、 幅の調節の方法が分からないので教えてください。 使用言語はC++ Builder4.0です(NT4.0)。 御回答を宜しくお願いします。

  • C#:C#のFormから、WindowsのExplorerへのD&Dした時のパスの取得

    C#のプログラム歴1ヵ月の新参者です。 (C,C++の経験はありません。) C#のListViewのアイテムを、WindowsのExplorerに ドラッグ&ドロップしたときの、フォルダパスを C#側で拾いたいのですが、拾い方がわからず困っています。   ネットで検索してみたのですが、WindowsのExplorerから C#側へのドラッグ&ドロップの解説は沢山あるのですが、 Windows Explorerへのドラッグ&ドロップの解説をしてくれる所が、全く見つけられずトホホな状況になっています。 C#だけでの実装では無理なのでしょうか? すいませんが、よろしくお願いいたします。

  • ArrayListのソートについて

    プログラム上でListViewのカラムをクリックするとソートされる プログラムを作ろうと入れたのですが、リストはソートされるのに 中身(ArrayList)がソートされていないためソート後のアイテムを クリックしても違う値しか出てきません。 それにはArrayListのソートが必要と言う事が書いてあったので 実装をしてみたのですが、比較ができないようなエラーが出て うまくソートもできませんでした。 どうすればListViewのカラムソートと連動してArrayListのソートが 出来るようになるでしょうか? 開発環境はVS2005(C#) .NET2.0です。 サンプルクラスは以下の通りです。 public void UpdateListView() { ArrayList list = null; if (listView1.Columns[1].Text == "差出人") { // 受信メールの場合 list = collectionMail[RECEIVE]; } else if (listView1.Columns[1].Text == "差出人または宛先") { // 削除メールの場合 list = collectionMail[DELETE]; } listView1.BeginUpdate(); // リストビューの内容をクリアする listView1.Items.Clear(); // ListViewを設定する foreach (Mail mail in list) { ListViewItem item = new ListViewItem(mail.subject); item.SubItems.Add(mail.address); listView1.Items.Add(item); } listView1.EndUpdate(); } private void Form1_Load(object sender, EventArgs e) { // ListViewにアイテムを追加する for (int no = 0; no < subject.Length; no++) { Mail mail = new Mail(subject[no], address[no], body[no]); collectionMail[RECEIVE].Add(mail); } UpdateTreeView(); UpdateListView(); } public class Mail { public string subject; public string address; public string body; public Mail(string subject, string address, string body) { this.subject = subject; this.address = address; this.body = body; } }

  • リストビューの列ヘッダーの幅について

    visual basic 6.0です。 リストビューの列ヘッダーの幅を、実行中に変更できないようにするには、どのようなコードを記述すればいいでしょうか。プロパティページでは設定できませんでした。どなたか教えてください。 よろしくお願いします。

  • FindFirstFileについて教えてください。

    Visual Studio C++ 2010 Expressを利用して、C言語のプログラムを作成しています。 その中でFindFirstFileを使っています。 Visual Studio上でWin32コンソールアプリのプロジェクトを作成して、このプログラムをコンパイルしました。 プロジェクトのプロパティは変更していません。 コンパイルしたものを実行すると戻り値としてINVALID_HANDLE_VALUEが返ってきて、ファイルのリストを取得できませんでした。 一方で、コマンドプロンプト上でMakefileを作成し、同じソースをコンパイルした場合は、ファイルのリストを正常に取得することが出来ます。 従いまして、おそらくプログラムは問題ないと思います。 Visual Studioのプロジェクトで、何かプロパティの設定が必要でしょうか? 実行環境は、Windows7 64-bitです。 何かご存知の方いらっしゃいましたら、教えて頂けますか?

専門家に質問してみよう