C# 用C合并DatagridView中的多行标题#

C# 用C合并DatagridView中的多行标题#,c#,winforms,datagridview,merge,C#,Winforms,Datagridview,Merge,我有一个项目,需要从数据库中查看Datagridview中的数据,它看起来应该像甘特图 我希望Datagridview如下所示: 我已经尝试了很多来自互联网的代码,但都没有正常工作 例如,这个: 此外,我不知道如何将日值放入单元格/行标题中 这就是我从一个月中得到天数的方法 int year = DateTime.Now.Year; int Jan = 1; int daysInJan = System.DateTime.DaysInMonth(year, Jan); 与它提供的示例相比,

我有一个项目,需要从数据库中查看Datagridview中的数据,它看起来应该像甘特图

我希望Datagridview如下所示:

我已经尝试了很多来自互联网的代码,但都没有正常工作

例如,这个:

此外,我不知道如何将日值放入单元格/行标题中

这就是我从一个月中得到天数的方法

int year = DateTime.Now.Year;
int Jan = 1;
int daysInJan = System.DateTime.DaysInMonth(year, Jan);
与它提供的示例相比,该方法工作得很好。也就是说:

我无法在一个标题下获得超过2列

根据我们在评论中的讨论,我认为您只需添加额外的列宽,就可以将“主”标题扩展到两列以上。这很好,直到我测试了足够多的列以允许水平滚动。就在那时,我注意到一个月的“主要”标题只有在该月的第一天列可见时才会显示

以下代码将解决这些问题:

  • 延伸超过2+列
  • 通过调整大小显示“主”标题,而不考虑第1列的可见性
  • 如何将日值放入单元格/行标题中

  • IDisposable
    对象的常规清理和重构

  • 在表单中,要设置网格,请执行以下操作:

    private int[] daysInMonths;
    
    private void Form1_Load(object sender, EventArgs e)
    {
        int year = DateTime.Now.Year;
        daysInMonths = new int[12];
    
        // Add a column for each day of the year; where
        // column name = the date (creates all unique column names)
        // column header text = the numeric day of the month
        for (int month = 1; month <= 12; month++)
        {
            daysInMonths[month - 1] = DateTime.DaysInMonth(year, month);
    
            // for days 1-31, 1-29, etc.
            for (int day = 1; day <= daysInMonths[month - 1]; day++)
            {
                DateTime date = new DateTime(year, month, day);
                DataGridViewTextBoxColumn col = new DataGridViewTextBoxColumn()
                {
                    Name = date.ToString(),
                    HeaderText = day.ToString(),
                    Width = 20
                };
    
                this.dataGridView1.Columns.Add(col);
            }
        }
    
        // add some default rows
        for (int r = 0; r < 4; r++)
        {
            DataGridViewRow row = new DataGridViewRow();
            row.CreateCells(this.dataGridView1);
            row.HeaderCell.Value = $"Project {r + 1}";
            this.dataGridView1.Rows.Add(row);
        }
    
        this.dataGridView1.AllowUserToAddRows = false;
        this.dataGridView1.RowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders;
        this.dataGridView1.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.EnableResizing;
        this.dataGridView1.ColumnHeadersHeight = this.dataGridView1.ColumnHeadersHeight * 2;
        this.dataGridView1.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.BottomCenter;
    
        this.dataGridView1.Paint += DataGridView1_Paint;
        this.dataGridView1.Scroll += DataGridView1_Scroll;
        this.dataGridView1.ColumnWidthChanged += DataGridView1_ColumnWidthChanged;
        this.dataGridView1.Resize += DataGridView1_Resize;
    }
    
    private int[]天/月;
    私有void Form1\u加载(对象发送方、事件参数e)
    {
    int year=DateTime.Now.year;
    daysInMonths=新整数[12];
    //为一年中的每一天添加一列;其中
    //列名=日期(创建所有唯一列名)
    //列标题文本=月份的数字日期
    对于(int month=1;month,它提供的示例可以很好地工作。也就是说:

    我无法在一个标题下获得超过2列

    根据我们在评论中的讨论,我认为只需添加额外的列宽即可将“main”标题扩展到2列以上。这很好,直到我测试了足够多的列以允许水平滚动。然后我注意到“main”只有当某个月的第一天列可见时,才会显示该月的标题

    以下代码将解决这些问题:

  • 延伸超过2+列
  • 通过调整大小显示“主”标题,而不考虑第1列的可见性
  • 如何将日值放入单元格/行标题中

  • IDisposable
    对象的常规清理和重构

  • 在表单中,要设置网格,请执行以下操作:

    private int[] daysInMonths;
    
    private void Form1_Load(object sender, EventArgs e)
    {
        int year = DateTime.Now.Year;
        daysInMonths = new int[12];
    
        // Add a column for each day of the year; where
        // column name = the date (creates all unique column names)
        // column header text = the numeric day of the month
        for (int month = 1; month <= 12; month++)
        {
            daysInMonths[month - 1] = DateTime.DaysInMonth(year, month);
    
            // for days 1-31, 1-29, etc.
            for (int day = 1; day <= daysInMonths[month - 1]; day++)
            {
                DateTime date = new DateTime(year, month, day);
                DataGridViewTextBoxColumn col = new DataGridViewTextBoxColumn()
                {
                    Name = date.ToString(),
                    HeaderText = day.ToString(),
                    Width = 20
                };
    
                this.dataGridView1.Columns.Add(col);
            }
        }
    
        // add some default rows
        for (int r = 0; r < 4; r++)
        {
            DataGridViewRow row = new DataGridViewRow();
            row.CreateCells(this.dataGridView1);
            row.HeaderCell.Value = $"Project {r + 1}";
            this.dataGridView1.Rows.Add(row);
        }
    
        this.dataGridView1.AllowUserToAddRows = false;
        this.dataGridView1.RowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders;
        this.dataGridView1.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.EnableResizing;
        this.dataGridView1.ColumnHeadersHeight = this.dataGridView1.ColumnHeadersHeight * 2;
        this.dataGridView1.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.BottomCenter;
    
        this.dataGridView1.Paint += DataGridView1_Paint;
        this.dataGridView1.Scroll += DataGridView1_Scroll;
        this.dataGridView1.ColumnWidthChanged += DataGridView1_ColumnWidthChanged;
        this.dataGridView1.Resize += DataGridView1_Resize;
    }
    
    private int[]天/月;
    私有void Form1\u加载(对象发送方、事件参数e)
    {
    int year=DateTime.Now.year;
    daysInMonths=新整数[12];
    //为一年中的每一天添加一列;其中
    //列名=日期(创建所有唯一列名)
    //列标题文本=月份的数字日期
    
    对于(int month=1;month DGVs不允许您在没有大量工作的情况下执行此操作。也许将其全部绘制到面板上更简单?您需要什么样的用户交互方式?链接的示例有什么不正常的地方?除了标题在屏幕外滚动时有点笨拙地重新居中,并且需要这样做之外,它似乎可以像我之前所说的那样工作pected.DGVs不允许您在没有大量工作的情况下执行此操作。也许将其全部绘制到面板上更简单?您需要什么样的用户交互方式?链接的示例有什么不正常的地方?除了标题在从屏幕上滚动时有点笨拙地重新居中之外,它似乎如我所期望的那样工作。