TableLayoutPanel GetControlFromPosition не получает невидимые элементы управления. Как получить доступ к невидимому элементу управления в указанной позиции? - PullRequest
3 голосов
/ 22 августа 2011

Я использую TableLayoutPanel и хочу получить элемент управления в определенной позиции в TableLayoutPanel. Я хочу перебрать строки и столбцы TableLayoutPanel, но этот вопрос в равной степени применим, если я просто хотел один элемент управления для конкретной строки и столбца.
К сожалению, GetControlFromPosition(int column, int row) извлекает только видимые элементы управления (то есть их свойство Visible имеет значение True). Это не очень хорошо для меня, так как иногда я хочу получить доступ к элементу управления в определенной позиции, которая не видна, а затем сделать его видимым.

Мне пришлось прибегнуть к переборам коллекции TableLayoutPanel.Controls, а затем получить позицию каждого элемента управления, используя GetPositionFromControl(Control control) или GetCellPosition(Control control), пока я не найду нужную позицию.
(Я не уверен в разнице между GetPositionFromControl и GetCellPosition методами, поскольку документация MS скудна, но Я задам этот вопрос отдельно ).

Есть ли для меня более простой или более чистый способ сделать это?

Ответы [ 4 ]

3 голосов
/ 16 декабря 2014

лучший метод c #:

public static Control GetAnyControlAt(this TableLayoutPanel panel, int column, int row)
{
    foreach (Control control in panel.Controls)
    {
        var cellPosition = panel.GetCellPosition(control);
        if (cellPosition.Column == column && cellPosition.Row == row)
            return control;
    }
    return null;
}
2 голосов
/ 22 августа 2011

Лучшее, что я могу придумать, - это создать метод расширения. Создайте новый модуль с именем «Extensions.vb» и добавьте:

Imports System.Runtime.CompilerServices

Public Module Extensions

    <Extension()>
    Public Function GetAnyControlAt(Panel As TableLayoutPanel, Column As Integer, Row As Integer) As Control
        For Each PanelControl As Control In Panel.Controls
            With Panel.GetCellPosition(PanelControl)
                If Column = .Column AndAlso Row = .Row Then Return PanelControl
            End With
        Next
        Return Nothing
    End Function
End Module

Теперь вы можете использовать следующее для доступа к методу:

Dim MyControl As Control = TableLayoutPanel1.GetAnyControlAt(Column, Row)

Методы расширения добавляют метод в класс, указанный в качестве первого параметра, в данном случае Panel As TableLayoutPanel, и перетасовывают остальные параметры вместе.

1 голос
/ 01 февраля 2019

Я нашел обходной путь / хак для использования GetControlFromPosition для visible = false, сначала добавьте элемент управления на панель макета таблицы, а затем установите для visible значение false

пример:

CheckBox Chk_Tbl_exist = new CheckBox();
Chk_Tbl_exist.Text = "This is a checkbox"; 
TableLayoutPanel.Controls.Add(Chk_Tbl_exist, 0, 1);
Chk_Tbl_exist.Visible = false;
1 голос
/ 26 августа 2011

А для c #:

public static class ExtensionMethods
        {
            public static Control GetAnyControlAt(TableLayoutPanel pp, int col, int row)
            {
            bool fnd = false;
            Control sendCC = null;
            foreach (Control cc in pp.Controls)
            {
                if (pp.GetCellPosition(cc).Column == col)
                {
                    if (pp.GetCellPosition(cc).Row == row)
                    {
                        sendCC = cc;
                        fnd = true;
                        break;
                    }
                }
            }

            if (fnd == true)
            {
                return sendCC;
            }
            else
            {
                return null;
            }
        }
    }
...