查找行控制指标加入到TableLayoutPanel中 [英] Find row index of control added to TableLayoutPanel

查看:291
本文介绍了查找行控制指标加入到TableLayoutPanel中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我要采取行动时,控件添加到Windows窗体一个TableLayoutPanel。我处理控制的ParentChanged事件,以找出是否该控件添加到父(这里TableLayoutPanel中),但我收到指数为-1。

的TableLayoutPanel吨;

 私人无效的button1_Click(对象发件人,EventArgs的)
{
    // this.Text = tableLayoutPanel1.Height.ToString();

    T =新的TableLayoutPanel();
    t.Dock = DockStyle.Fill;
    //t.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
    t.AutoSize = TRUE;
    //t.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
    t.RowStyles.Add(新RowStyle(SizeType.AutoSize));
    t.RowStyles.Add(新RowStyle(SizeType.AutoSize));
    t.ColumnStyles.Add(新ColumnStyle(SizeType.Percent,50));
    t.ColumnStyles.Add(新ColumnStyle(SizeType.Percent,50));
    panel1.Controls.Add(T);

    t.CellBorderStyle = TableLayoutPanelCellBorderStyle.Single;


    标签LBL =新的Label();
    lbl.ParentChanged + =新的EventHandler(lbl_ParentChanged);
    lbl.Margin =新System.Windows.Forms.Padding(20,150,20,20);
    lbl.Text =你好;
    t.Controls.Add(LBL,0,0);
}

无效lbl_ParentChanged(对象发件人,EventArgs的)
{
    标签LBL =(标签)发送;
    INT行= t.GetRow(LBL); //这里我得到行= -1 ??????
}
 

我需要排至该控件添加号码。该控制应采取行动独立当它被添加到所述的TableLayoutPanel的。如何得到它?

 无效t_ControlAdded(对象发件人,ControlEventArgs E)
    {
        INT行= t.GetRow(e.Control); //这也给排= -1
    }
 

解决方案

您需要增加行数/列数,如果添加新的 RowStyles / ColumnStyles 的TableLayoutPanel 。在此之后,你可以很容易地使用 GetPositionFromControl(控制值)方法。

我觉得, ControlAdded 事件是在这种情况下,更好的办法。试试看吧。

做这样的:

 公共部分类Form1中:形态
{
    私人TableLayoutPanel中板;

    公共Form1中()
    {
        的InitializeComponent();
        InitializeTableLayoutPanel();
    }

    私人无效Form1_Load的(对象发件人,EventArgs的)
    {
        的AddControl(0,0);
        的AddControl(0,1);
        的AddControl(1,0);
        的AddControl(1,1);
        的AddControl(2,0);
        的AddControl(2,1);
        的AddControl(3,0);
        的AddControl(3,1);
    }

    私人无效InitializeTableLayoutPanel()
    {
        面板=新的TableLayoutPanel();
        panel.Dock = DockStyle.Fill;
        panel.AutoSize = TRUE;
        panel.ColumnStyles.Add(新ColumnStyle(SizeType.Percent,50));
        panel.ColumnStyles.Add(新ColumnStyle(SizeType.Percent,50));
        panel.ColumnCount = 2;
        panel.RowStyles.Add(新RowStyle(SizeType.AutoSize));
        panel.RowStyles.Add(新RowStyle(SizeType.AutoSize));
        panel.RowCount = 2;

        panel.CellBorderStyle = TableLayoutPanelCellBorderStyle.Single;
        panel.ControlAdded + =新ControlEventHandler(OnControlAdded);

        this.Controls.Add(板);
    }

    私人无效OnControlAdded(对象发件人,ControlEventArgs E)
    {
        如果(e.Control!= NULL)
        {
            INT列= panel.GetPositionFromControl(e.Control).COLUMN;
            INT行= panel.GetPositionFromControl(e.Control).Row;

            的MessageBox.show(的String.Format(列:{0},行:{1},列,行));
        }
    }

    ///<总结>
    ///添加到控制面板
    ///< /总结>
    ///< PARAM NAME =栏>列位置< /参数>
    ///< PARAM NAME =行>行位置和LT; /参数>
    私人无效的AddControl(INT列,诠释行)
    {
        标签标签=新的Label();
        label.Font =新的字体(新的FontFamily(德罗伊德桑),20,FontStyle.Bold);
        label.Name =标签;
        label.Text =呐喊!;

        如果(列< panel.ColumnCount和放大器;&安培;行< panel.RowCount)
            panel.Controls.Add(标签,列,行);
        其他
            抛出新ArgumentOutOfRangeException();
    }
}
 

I need to take an action when a control is added to a TableLayoutPanel in Windows Forms. I am handling ParentChanged event of the control to find out if the control is added to a parent(here TableLayoutPanel), but the index I receive is -1.

TableLayoutPanel t;

private void button1_Click(object sender, EventArgs e)
{
    // this.Text = tableLayoutPanel1.Height.ToString();

    t = new TableLayoutPanel();
    t.Dock = DockStyle.Fill;
    //t.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
    t.AutoSize = true;
    //t.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
    t.RowStyles.Add(new RowStyle(SizeType.AutoSize));
    t.RowStyles.Add(new RowStyle(SizeType.AutoSize));
    t.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50));
    t.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50));
    panel1.Controls.Add(t);

    t.CellBorderStyle = TableLayoutPanelCellBorderStyle.Single;


    Label lbl = new Label();
    lbl.ParentChanged += new EventHandler(lbl_ParentChanged);
    lbl.Margin = new System.Windows.Forms.Padding(20, 150, 20, 20);
    lbl.Text = "Hello";
    t.Controls.Add(lbl, 0, 0);
}

void lbl_ParentChanged(object sender, EventArgs e)
{
    Label lbl = (Label)sender;
    int row = t.GetRow(lbl);//here I get row = -1 ??????
}

I need row number to which the control is added. The control should take action independent of when it is added to the TableLayoutPanel. How to get it ?

    void t_ControlAdded(object sender, ControlEventArgs e)
    {
        int row = t.GetRow(e.Control);      //this also gives row = -1      
    }

解决方案

You need to increment RowCount/ColumnCount, if you add new RowStyles/ColumnStyles to your TableLayoutPanel. After this you can easily use the GetPositionFromControl(Control value) Method.

I think, ControlAdded Event is the better approach in this case. Give it a try.

Do it like this:

public partial class Form1 : Form
{
    private TableLayoutPanel panel;

    public Form1()
    {
        InitializeComponent();
        InitializeTableLayoutPanel();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        AddControl(0, 0);
        AddControl(0, 1);
        AddControl(1, 0);
        AddControl(1, 1);
        AddControl(2, 0);
        AddControl(2, 1);
        AddControl(3, 0);
        AddControl(3, 1);
    }

    private void InitializeTableLayoutPanel()
    {
        panel = new TableLayoutPanel();
        panel.Dock = DockStyle.Fill;
        panel.AutoSize = true;
        panel.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50));
        panel.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50));
        panel.ColumnCount = 2;
        panel.RowStyles.Add(new RowStyle(SizeType.AutoSize));
        panel.RowStyles.Add(new RowStyle(SizeType.AutoSize));
        panel.RowCount = 2;

        panel.CellBorderStyle = TableLayoutPanelCellBorderStyle.Single;
        panel.ControlAdded += new ControlEventHandler(OnControlAdded);

        this.Controls.Add(panel);
    }

    private void OnControlAdded(object sender, ControlEventArgs e)
    {
        if (e.Control != null)
        {
            int column = panel.GetPositionFromControl(e.Control).Column;
            int row = panel.GetPositionFromControl(e.Control).Row;

            MessageBox.Show(string.Format("Column: {0}, Row: {1}", column, row));
        }
    }

    /// <summary>
    /// Add Control to Panel
    /// </summary>
    /// <param name="column">column position</param>
    /// <param name="row">row position</param>
    private void AddControl(int column, int row)
    {
        Label label = new Label();
        label.Font = new Font(new FontFamily("Droid Sans"), 20, FontStyle.Bold);
        label.Name = "label";
        label.Text = "Whoop!";

        if (column < panel.ColumnCount && row < panel.RowCount)
            panel.Controls.Add(label, column, row);
        else
            throw new ArgumentOutOfRangeException();
    }
}

这篇关于查找行控制指标加入到TableLayoutPanel中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆