none
listview のデータ表示問題。。。急ぎ RRS feed

  • 質問

  • お聞きしたいことは、listview のColumnHeaderは中間に表示して、データの表示は左寄せにしたいです。出来るらしいですが、自分はソースの書き方判らないです。

    ソースの参照:

    private void button1_Click(object sender, EventArgs e)
            {
                ListViewItem itemx = new ListViewItem();         

               itemx.Text = "aaaa";
                itemx.SubItems.Add("bbbb");        
                itemx.SubItems.Add("cccc"); 
         
                ListView1.Items.Add(itemx);           
            }

     private void Form1_Load(object sender, EventArgs e)
            {

        ListView1.View = View.Details;

               ListView1.Columns.Add("Colmuns1", 150);           
                 ListView1.Columns.Add("Columns2", 150);            
                 ListView1.Columns.Add("Columns3", 150);
                 foreach (ColumnHeader ch in ListView1.Columns)
                {
                    ch.TextAlign = HorizontalAlignment.Center;    
                }

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

    2007年7月12日 9:05

回答

  • シンプルに書くと以下のようになります。ヘッダはセンターで、項目は右寄せにしています。

    listView1.OwnerDraw = true; がポイントです。

     

        public partial class ListViewColumnAlign : Form

        {

            public ListViewColumnAlign()

            {

                InitializeComponent();

            }

     

            private void ListViewColumnAlign_Load(object sender, EventArgs e)

            {

                listView1.OwnerDraw = true;

     

                listView1.View = View.Details;

                listView1.Columns.Add("Colmuns1", 120);

                listView1.Columns.Add("Columns2", 120);

                listView1.Columns.Add("Columns3", 120);

            }

     

            private void cbtn_addColumns_Click(object sender, EventArgs e)

            {

                ListViewItem item = new ListViewItem();

     

                item.Text = "aaaa";

                // サブアイテムの追加

                item.SubItems.Add("bbbb");

                item.SubItems.Add("cccc");

                listView1.Items.Add(item);

            }

     

            private void listView1_DrawSubItem(object sender, DrawListViewSubItemEventArgs e)

            {

                e.DrawText(TextFormatFlags.Right);

            }

     

            private void listView1_DrawColumnHeader(object sender, DrawListViewColumnHeaderEventArgs e)

            {

                using (StringFormat sf = new StringFormat())

                {

                    // Draw the standard header background.

                    e.DrawBackground();

     

                    // Draw the header text.

                    using (Font headerFont =

                                new Font("Helvetica", 10, FontStyle.Bold))

                    {

                        sf.Alignment = StringAlignment.Center;

     

                        e.Graphics.DrawString(e.Header.Text, headerFont,

                            Brushes.Black, e.Bounds, sf);

                    }

                }

            }

     

        }

    2007年7月13日 4:55
    モデレータ

すべての返信

  • オーナードローすれば良いでしょう。
    DrawSubItemイベント、DrawColumnHeaderイベントでそれぞれ処理して下さい。
    以下にサンプルコードがあります。

     

    ListView.OwnerDraw プロパティ
     http://msdn2.microsoft.com/ja-jp/library/system.windows.forms.listview.ownerdraw(VS.80).aspx

    2007年7月12日 14:45
    モデレータ
  • trapemiya様へ

    ご回答していただき、大変有難う御座いました。

    私がMSDNのホームページを参照しましたが、またうまくいかなかったです。

    私は、初心者ですので、サブ項目描画処理部分は、まだ十分理解していないと思います。

    もちょっと詳しいことを説明していただけないでしょうか。

    trapemiyaさん、宜しければ、私のソースを基として、書き直して頂けないでしょうか?!

    描画したいことは、カラムを中間に表示し、リストを左寄せにしたいことだけです。大変勉強になると思います。

    申し訳御座いません、お忙しいところ。

     

    今の設定listview1のプロパティ:OwnerDraw = true

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;

    namespace WindowsApplication1
    {
        public partial class Form1 : Form
        {
            // 一覧リストのカラム名とデータ名
            private string[][] _Columns = {
                new string[] {"Colmuns1","aaaa"},
                new string[] {"Colmuns2","bbbb"},
                new string[] {"Colmuns3","cccc"},
             };

            public Form1()
            {
                InitializeComponent();
            }

            // 一覧リストのサブ項目描画処理
            private void listView1_DrawSubItem(object sender, DrawListViewSubItemEventArgs e)
            {
                StringAlignment alignment = StringAlignment.Near;
                string colName = _Columns[e.ColumnIndex][0];
                switch(colName)
                {
                    case "Colmuns1":
                    case "Colmuns2":
                    case "Colmuns3":
                        alignment = StringAlignment.Center;
                        break;
                    default:
                        alignment = StringAlignment.Near;
                        break;                     

               <<PENDING>>
                }
            }

            private void Form1_Load(object sender, EventArgs e)
            {
                // カラムの追加
                listView1.View = View.Details;
                listView1.Columns.Add("Colmuns1", 120);            
                listView1.Columns.Add("Columns2", 120);
                listView1.Columns.Add("Columns3", 120);

                // カラムを中間に表示
                foreach (ColumnHeader ch in listView1.Columns)
                {
                    ch.TextAlign = HorizontalAlignment.Center;               
                }
            }      

            // イベント処理
            private void button1_Click_1(object sender, EventArgs e)
            {
                // アイテムの追加
                ListViewItem item = new ListViewItem();

                item.Text = "aaaa";
                // サブアイテムの追加
                item.SubItems.Add("bbbb");
                item.SubItems.Add("cccc");
                listView1.Items.Add(item);
            }

            private void listView1_DrawColumnHeader(object sender, DrawListViewColumnHeaderEventArgs e)
            {
                // 描画はまかせる
                e.DrawDefault = true;
            }
        }
    }

    宜しくお願い致します!!!

    2007年7月13日 2:33
  • シンプルに書くと以下のようになります。ヘッダはセンターで、項目は右寄せにしています。

    listView1.OwnerDraw = true; がポイントです。

     

        public partial class ListViewColumnAlign : Form

        {

            public ListViewColumnAlign()

            {

                InitializeComponent();

            }

     

            private void ListViewColumnAlign_Load(object sender, EventArgs e)

            {

                listView1.OwnerDraw = true;

     

                listView1.View = View.Details;

                listView1.Columns.Add("Colmuns1", 120);

                listView1.Columns.Add("Columns2", 120);

                listView1.Columns.Add("Columns3", 120);

            }

     

            private void cbtn_addColumns_Click(object sender, EventArgs e)

            {

                ListViewItem item = new ListViewItem();

     

                item.Text = "aaaa";

                // サブアイテムの追加

                item.SubItems.Add("bbbb");

                item.SubItems.Add("cccc");

                listView1.Items.Add(item);

            }

     

            private void listView1_DrawSubItem(object sender, DrawListViewSubItemEventArgs e)

            {

                e.DrawText(TextFormatFlags.Right);

            }

     

            private void listView1_DrawColumnHeader(object sender, DrawListViewColumnHeaderEventArgs e)

            {

                using (StringFormat sf = new StringFormat())

                {

                    // Draw the standard header background.

                    e.DrawBackground();

     

                    // Draw the header text.

                    using (Font headerFont =

                                new Font("Helvetica", 10, FontStyle.Bold))

                    {

                        sf.Alignment = StringAlignment.Center;

     

                        e.Graphics.DrawString(e.Header.Text, headerFont,

                            Brushes.Black, e.Bounds, sf);

                    }

                }

            }

     

        }

    2007年7月13日 4:55
    モデレータ
  •  trapemiya様へ

    お世話になりました。

    ご回答していただき、大変有難う御座いました。

    リストビューのデータ表示が問題なく、解決されました。

    この度、subItemの描画については、大変勉強になりました。

    大変助かりました!!

     

    最後、も一回感謝いたします。

    まだ宜しく願いいたします。

    2007年7月13日 6:12