0

我已经在 Windows 窗体中创建了一个表格布局,如图所示,我在我的表格中添加了一个鼠标右键单击菜单,我想在我右键单击 perticuler 单元格时为单元格着色,所以我该怎么做。

当我单击add device单元格时应涂成绿色,单击delete device时应显示默认颜色,单击fire时应将单元格涂成红色,依此类推

下面是我的表格和表格布局

http://i48.tinypic.com/33ok3cw.jpg

4

3 回答 3

1

嗨,我没有你要找的东西,但是,

TableLayoutPanel 本身并没有真正的“单元格”,实际上是作为控件的容器。这意味着您无法真正检索单个行、列或单元格。另一种方法是使用面板并在每个面板上放置单独的点击事件。

但是,如果您确定要使用 TableLayoutPanels,则可以使用 EventArgs 中 TableLayoutPanel 上发生鼠标单击的位置的 XY 坐标。并确定它是哪个块,因为你有均匀分布的行/列。

例如,如果您的所有单元格大小相同并且 TableLayoutPanel 停靠在表单中,这将获得选定的单元格。:

Point selectedCell = new Point();
private void tableLayoutPanel1_MouseClick(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Right)
    {

       //show contextMenuStrip
        selectedCell = new Point(e.X / (tableLayoutPanel1.Width / tableLayoutPanel1.ColumnCount), e.Y / (tableLayoutPanel1.Height / tableLayoutPanel1.RowCount));
    }
}
于 2013-04-15T08:28:35.090 回答
0

我得到了我的问题的答案,可以如下所示首先我们需要找到发送事件的标签控件(发送者),如下所示

    private void AssignClickEvent()
    {
        foreach (Control c in tableLayout.Controls.OfType<Label>())
        {

            c.MouseClick += tablelayout_MouseClick;
            addDevice.Click += addDevice_Click;
            deleteDevice.Click += deleteDevice_Click;
            fire.Click += fire_Click;
            fault.Click += fault_Click;
            suppress.Click += suppress_Click;

        }
    }

有一个指针控制的全局变量

 public Label h = new Label();

然后我们需要将发送者复制到控件

    private void tablelayout_MouseClick(object sender, MouseEventArgs e)
    {
        Label l = (Label)sender;

        if (e.Button == MouseButtons.Right)
        {
            h = l;
            num = l.Text;
            m.MenuItems.AddRange(new MenuItem[] { addDevice, deleteDevice, fire, fault,suppress  });
            tableLayout.ContextMenu = m;
            m.Show((Control)(sender), e.Location);
        }           

    }

然后使用全局控件“h”为控件设置颜色

    public void addDevice_Click(object sender, EventArgs e)
    {
        try
        {
            h.BackColor = Color.Green; ;
            comport.Write("AB");
            comport.Write(num);
            comport.Write(" "); 
            stausLable.Text = "Device "+num+" added";
            comport.WriteLine("000000000000");
        }
        catch (InvalidOperationException )
        {
            stausLable.Text = "Open communication port";

        }
    }

http://i.imgur.com/XkfHENW.png?1

于 2013-04-16T08:48:04.263 回答
0

有一种更简单的方法,无需实现这些事件以及额外的变量。假设上下文菜单名为“DeviceActionsContextMenu”并链接到标签控件(根据您的评论),实现工具条项目的点击事件 -

    private void addDeviceToolStripMenuItem_Click(object sender, EventArgs e)
    {
        (contextMenuStrip1.SourceControl as Label).BackColor = Color.Green;
    }

或实现上下文菜单的项目点击事件 -

    private void DeviceActionsContextMenu_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
    {
        if (e.ClickedItem == addDeviceToolStripMenuItem)
        {
            (contextMenuStrip1.SourceControl as Label).BackColor = Color.Green;
        }
    }
于 2013-04-16T09:09:05.007 回答