【问题标题】:How to programmatically organize button controls into a grid?如何以编程方式将按钮控件组织到网格中?
【发布时间】:2019-12-28 09:37:46
【问题描述】:

我有一堆序列化的目标文件,其中包含与我们拥有的传感器网络相关的信息。

我正在尝试加载每个文件,并在文件中包含一个变量(传感器名称的缩写)加载并显示在按钮上。

然后我需要用户能够单击该按钮并编辑该对象的属性。我很确定后面的部分我可以轻松完成。

我正在努力做的是弄清楚如何构建这些按钮的网格,每个按钮之间有适当的间距。

这是我目前所拥有的

private Dictionary<string, Point> buttonGrid = new Dictionary<string, Point>();

public void LoadNLDNSensors() 
{
    DirectoryInfo d = new DirectoryInfo(filepath);
    string[] files = Directory.GetFiles(filepath);
    if (files.Length == 0)
    {
        MessageBox.Show("Couldn't find sensor files!", "Failure", 
            MessageBoxButtons.OK, MessageBoxIcon.Error);
        return;
    }

    foreach (var file in d.GetFiles("*.sensor"))
    {
        IFormatter formatter = new BinaryFormatter();
        NLDNSensor newSensor = new NLDNSensor();
        newSensor = newSensor.LoadSensorFromFile(file);
        string _brief = newSensor.Brief;
        Button bu = new Button();
        this.Controls.Add(bu);
        bu.Size = new Size(30, 40);
        bu.Location = new Point(1,1);
        int x, y;
        x = 1;
        y = 1;
        // I think my logic needs to go here just not
        // sure how or what type of algorithm I need
        buttonGrid.Add(_brief, new Point(x,y));
        bu.Text = _brief;
        bu.BackColor = Color.Aqua;
        bu.Visible = true;
    }
    return;
}

这将显示我正在尝试显示按钮的 WinForm: https://imgur.com/a/s267yrm

我想将每个文件分隔至少 2 个像素,所以我想我们将按顺序将每个下一个文件的 x, Point 值增加 2。问题是当我们到达窗口的宽度时,我不确定如何让它从下一行开始。

【问题讨论】:

  • 试试 FlowLayoutPanel!
  • 在以下帖子中查看我的解决方案:stackoverflow.com/questions/37165402/… 不要使用流程图。它不支持和很多属性。最好使用常规面板创建自己的面板
  • @jdweng:FLP 很好。你到底有什么不能去工作的?
  • FLP 似乎完全符合我的需要,我只需要手动按字母顺序对按钮进行排序,我认为(因为传感器文件是通过它们的 ID 保存的,它是一个数字),即:12 .sensor 就是其中之一。非常感谢您的建议!
  • @Taw:只有面板的最基本功能可以用 FLP 完成。使用直面板可以做 100 件事情,而使用 FLP 则无法做到。只需比较 FLP 和面板的属性,您就会看到。

标签: c# winforms


【解决方案1】:

非常感谢您对使用 FLP 的建议。它正在做我需要的。我的下一个任务是为这些按钮添加事件触发器,但这让我克服了困难。我最终求助于将按钮存储在排序字典中,然后将它们从该字典添加到 FLP。

public void LoadNLDNSensors()
    {
        DirectoryInfo d = new DirectoryInfo(filepath);

        string[] files = Directory.GetFiles(filepath);

        if (files.Length == 0)
        {
            MessageBox.Show("Couldn't find sensor files!", "Failure",  MessageBoxButtons.OK, MessageBoxIcon.Error);
            return;
        }

        foreach(var file in d.GetFiles("*.sensor"))
        {
            IFormatter formatter = new BinaryFormatter();

            NLDNSensor __newSensor = new NLDNSensor();

            __newSensor = __newSensor.LoadSensorFromFile(file);

            buttons.Add(__newSensor.Brief, __newSensor);

            //flowLayoutPanelSensors.Controls.Add(bu);
        }

        foreach (string str in buttons.Keys)
        {
            Button b = new Button();

            b.BackColor = Color.Pink;

            switch (buttons[str].SensorState)
            {
                case -1:
                    b.BackColor = Color.Red;
                    break;
                case 0:
                    b.BackColor = Color.Aqua;
                    break;
                case 1:
                    b.BackColor = Color.Yellow;
                    break;

                default:
                    b.BackColor = Color.White;
                    break;
            }

            b.Height = 40;
            b.Width = 40;

            b.Text = buttons[str].Brief;
            b.Visible = true;

            flowLayoutPanelSensors.Controls.Add(b);
        }
        return;
    }

这是最终结果的图像:)

非常感谢您的帮助。

https://imgur.com/a/cGCss45

【讨论】:

    猜你喜欢
    • 2012-03-20
    • 1970-01-01
    • 2020-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多