3

を使用してTableLayoutPanelおり、 の特定の位置でコントロールを取得したいと考えていTableLayoutPanelます。の行と列を反復処理したいのですTableLayoutPanelが、特定の行と列に単一のコントロールが必要な場合でも、この質問は同様に適用されます。
残念ながらGetControlFromPosition(int column, int row)、表示されているコントロールのみを取得します (つまり、Visible プロパティが True に設定されています)。表示されていない特定の位置にあるコントロールにアクセスしてから表示したい場合があるため、これは私にとっては良くありません。

コレクションを繰り返し処理し、必要な位置が見つかるまでorTableLayoutPanel.Controlsを使用して各コントロールの位置を取得する必要がありました。( MSのドキュメントが貧弱であるため、とメソッド の違いはわかりませんが、その質問は個別に尋ねます)。GetPositionFromControl(Control control)GetCellPosition(Control control)
GetPositionFromControlGetCellPosition

これを行うためのより簡単でクリーンな方法はありますか?

4

4 に答える 4

3

より良い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;
}
于 2014-12-16T14:08:05.127 に答える
2

私が思いつく最善の方法は、拡張メソッドを作成することです。「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、残りのパラメーターをシャッフルします。

于 2011-08-22T04:12:42.440 に答える
1

そして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;
            }
        }
    }
于 2011-08-26T17:19:16.453 に答える