首页 > 解决方案 > 使用 c# 和 TableLayoutPanel 创建时间线

问题描述

我正在尝试使用 tablelayoutpanel 创建时间线,我快到了。有两件事我似乎无法弄清楚。

  1. 首先,我想知道控件是否有任何方法可以跨越半列(单元格)?
  2. 然后我想知道如何在一个单元格中包含多个控件。

如果有人可以提供带有解释的示例代码,那就太好了。如果有任何不清楚的地方或者我需要发布更多代码,请告诉我。

到目前为止,这是我的代码:

    public void Init(List<DateModel> dates)
    {
        Table.Controls.Clear();
        Table.RowCount = 10;
        for (int i = 1; i <= Table.RowCount; i++)
            Table.RowStyles.Add(new RowStyle(SizeType.Percent, 10));
        Table.ColumnCount = 38;
        for (int i = 1; i <= Table.ColumnCount; i++)
            Table.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize));
        Table.Dock = DockStyle.Fill;
        Controls.Add(Table);
        SetUpGrid();
        SetUp(dates);
    }

    public void SetUp(List<DateModel> dates)
    {
        var row = 1;
        foreach (var date in dates)
        {
            AddEntry(date.Day, row, 0, 1, Color.White, Color.Black, false);
            for (int i = 0; i < date.LogEntries.Count; i++)
                try
                {
                    AddEntry(string.Format("", row, GetColumnIndex(date.LogEntries[i].Start), GetColumnIndex(date.LogEntries[i].Stop)  date.LogEntries[i].Start, date.LogEntries[i].Start - date.LogEntries[i].Stop, Color.White, Color.Black, false, date.LogEntries[i]);
                }
                catch (Exception)
                {
                    Console.WriteLine();
                }
            row++;
        }
    }

    private void AddEntry(string text, int row, int col, int columnSpan, Color foreColor, Color backColor, 
        bool border, LogEntry entry = null)
    {
        var lbl = new Label
        {
            Text = text,
            AutoSize = false,
            AutoEllipsis = true,
            ForeColor = foreColor,
            BackColor = backColor,
            Dock = DockStyle.Fill,
            BorderStyle = border ? BorderStyle.FixedSingle : BorderStyle.None,
            TextAlign = ContentAlignment.MiddleLeft, 
            Tag = entry,
            Cursor = Cursors.Hand
        };


        // Perhaps I need to check if a cell is empty? 


        lbl.Click += new EventHandler(EditEntry);            
        Table.Controls.Add(lbl, col, row);
        Table.SetColumnSpan(lbl, columnSpan);
    }

    public void SetUpGrid()
    {
        AddEntry(string.Format("Today:"), 0, 0, 1, Color.White, Color.Black, false);
        AddEntry("| 05:00", 0, 1, 2, Color.White, Color.Black, false);
        // And so on.. All the way to 23:00
    }

标签: c#.nettablelayouttimeline

解决方案


推荐阅读