Как определить, к какому классу относится элемент управления в EventHandler? - PullRequest
0 голосов
/ 26 июля 2011

Это мой класс, где у меня есть различные свойства, а также элемент управления Panel:

public class Square
{
    private Panel _pSquare;
    public Panel PSquare
    {
        get { return _pSquare; }
        set { _pSquare = value; }
    }
    ....

Это EventHandler загрузки формы, в котором создается группа квадратных объектов:

private void Form1_Load(object sender, EventArgs e)
{
    for (var n = 0; n < gridSize; n++)
    {
        for (var m = 0; m < gridSize; m++)
        {
            Square squareboard = new Square(n, m);

            squareboard.PSquare.Click += squareEvent;
             ...

Когда пользователь нажимает на Panel, вызывается pSquare_Click EventHandler, чтобы эта часть работала.

private void pSquare_Click(object sender, EventArgs e)
{

У меня проблема: как получить доступ к свойствам класса Square в этом EventHandler?

Ответы [ 2 ]

2 голосов
/ 26 июля 2011

Всякий раз, когда создаете панель, используйте panel.Tag, чтобы связать каждую панель с ее квадратом:

private void Form1_Load(object sender, EventArgs e)
{
    for (var n = 0; n < gridSize; n++)
    {
        for (var m = 0; m < gridSize; m++)
        {
            Square squareboard = new Square(n, m);

            squaredboard.PSquare.Tag = squareboard;
            squareboard.PSquare.Click += squareEvent;
            ...

private void pSquare_Click(object sender, EventArgs e)
{
    Panel panel = (Panel)sender;
    Square square = (Square)panel.Tag;//access to the underlying square object
}
1 голос
/ 27 июля 2011

Ваш класс Square может выглядеть следующим образом:

public class Square
{
    private readonly Panel _pSquare;

    public Square(Panel pSquare)
    {
        this._pSquare = pSquare;
        this._pSquare.Click += this._pSquare_Click;
    }

    void _pSquare_Click(object sender, EventArgs e)
    {
        this.onSquareClicked();
    }

    public event EventHandler SquareClicked;

    private void onSquareClicked()
    {
        EventHandler eventHandler = this.SquareClicked;
        if (eventHandler != null)
        {
            eventHandler(this, EventArgs.Empty);
        }
    }
}

В вашей форме вы можете сначала создать панели, а затем сгенерировать коллекцию квадратов с помощью циклического перемещения по панелям:

    foreach (Panel panel in this.Controls.OfType<Panel>())
    {
        var square = new Square(panel);
        square.SquareClicked += this.squareClicked;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...