none
請問要怎麼把Windows Form的 DataGridView設計如下圖 RRS feed

  • 問題

  • 就是要讓DataGridView的header 上面三格合併,然後輸入文字,下面也可以輸入文字

    有點像上面輸入"動物"

    下面三格分別輸入"貓" "狗" "鳥"

    想做出類似這樣的header設計

    謝謝


    • 已編輯 paipay 2016年8月24日 上午 10:35
    2016年8月24日 上午 10:33

解答

所有回覆

  • Windows Forms 要做出這種東西麻煩的很.

    你可以參考

    http://www.codeproject.com/Articles/474418/DataGridViewplus-e-plusStackedplusHeader


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2016年8月24日 下午 03:22
    版主
  • 那請問有沒有可以做到類似效果的表格呢?
    2016年8月25日 上午 11:07
  • 我前面的回文不是有給你 link 嗎 ? 這得需要點改造才做得到.

    另外, 或許看看 ListView 能不能做到接近你的需求

    https://msdn.microsoft.com/zh-tw/library/6dwb14tw(v=vs.110).aspx


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2016年8月25日 下午 12:48
    版主
  • 或是說該如何畫出這樣的header?
    2016年8月25日 下午 12:56
  • 那篇文章不是有解說, 也有 source code 可以下載的嗎 ?


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2016年8月25日 下午 01:12
    版主
  • 您可以參考這篇討論的範例:

    How to merge two column headers in a datagridview

    2016年8月25日 下午 01:25
  • 阿對就是類似這種!!

    不過他的語法是vb的

    希望有c#的

    2016年8月26日 上午 10:34
  • 用工具轉看看

    http://www.carlosag.net/tools/codetranslator/


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2016年8月27日 上午 02:23
    版主
  • 前輩你好,已轉成C#給你參考一下.

    -----------------------------------------------------------------------------------------------------

    public Form1()
    {
        InitializeComponent();
        dgv.CellPainting += dgv_CellPainting;
        dgv.ColumnWidthChanged += dgv_ColumnWidthChanged;
        dgv.Paint += dgv_Paint;
        dgv.Scroll += dgv_Scroll;
    }
    private void Form1_Load(object senderEventArgs e)
    {
        this.dgv.Columns.Add("JanWin""Win");
        this.dgv.Columns.Add("JanLoss""Loss");
        this.dgv.Columns.Add("FebWin""Win");
        this.dgv.Columns.Add("FebLoss""Loss");
        this.dgv.Columns.Add("MarWin""Win");
        this.dgv.Columns.Add("MarLoss""Loss");
        this.dgv.Columns.Add("AprWin""Win");
        this.dgv.Columns.Add("AprLoss""Loss");
        this.dgv.Rows.Add("1""2""3""2""2""2""4""2");
        for (int j = 0j <= this.dgv.ColumnCount - 1j++)
        {
            this.dgv.Columns[j].Width = 45;
        }
        this.dgv.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.EnableResizing;
        this.dgv.ColumnHeadersHeight = this.dgv.ColumnHeadersHeight * 2;
        this.dgv.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.BottomCenter;
    }
    void dgv_Paint(object senderPaintEventArgs e)
    {
        string[] monthes = { "January""February""March""April" };
        int j = 0;
        while (j < 8)
        {
            Rectangle r1 = this.dgv.GetCellDisplayRectangle(j-1true);
            int w2 = this.dgv.GetCellDisplayRectangle(j + 1-1true).Width;
            r1.X += 1;
            r1.Y += 1;
            r1.Width = r1.Width + w2 - 2;
            r1.Height = r1.Height / 2 - 2;
            e.Graphics.FillRectangle(new SolidBrush(this.dgv.ColumnHeadersDefaultCellStyle.BackColor), r1);
            StringFormat format = new StringFormat();
            format.Alignment = StringAlignment.Center;
            format.LineAlignment = StringAlignment.Center;
            e.Graphics.DrawString(monthes[j / 2], this.dgv.ColumnHeadersDefaultCellStyle.Fontnew SolidBrush(this.dgv.ColumnHeadersDefaultCellStyle.ForeColor), r1format);
            j += 2;
        }
    }
     
    void dgv_Scroll(object senderScrollEventArgs e)
    {
        Rectangle rtHeader = this.dgv.DisplayRectangle;
        rtHeader.Height = this.dgv.ColumnHeadersHeight / 2;
        this.dgv.Invalidate(rtHeader);
    }
    void dgv_ColumnWidthChanged(object senderDataGridViewColumnEventArgs e)
    {
        Rectangle rtHeader = this.dgv.DisplayRectangle;
        rtHeader.Height = this.dgv.ColumnHeadersHeight / 2;
        this.dgv.Invalidate(rtHeader);
    }
    void dgv_CellPainting(object senderDataGridViewCellPaintingEventArgs e)
    {
        if (e.RowIndex == -1 && e.ColumnIndex > -1)
        {
            Rectangle r2 = e.CellBounds;
            r2.Y += e.CellBounds.Height / 2;
            r2.Height = e.CellBounds.Height / 2;
            e.PaintBackground(r2true);
            e.PaintContent(r2);
            e.Handled = true;
        }
    }

    參考自

    https://social.msdn.microsoft.com/Forums/en-US/4a3f5639-8c2b-4a86-ae08-28abb9c8f845/how-to-merge-two-column-headers-in-a-datagridview?forum=vbgeneral

    2016年8月29日 上午 04:59
  • 程式碼沒有很多, 可以自行改改看, 有問題再貼出來
    2016年8月29日 上午 06:54