.Net - Как создать UserControl, который реализует интерфейс?Ошибка с LoadControl - PullRequest
3 голосов
/ 04 февраля 2011

У меня есть несколько пользовательских элементов управления, которые я хочу, чтобы каждый имел некоторые базовые функции.Ниже моя реализация:

public interface IMyTabInterface
{
    void LoadData();
}

public partial class MyFirstTab : System.Web.UI.UserControl, IMyTabInterface
{
    public void LoadData()
    {
        ...
    }

}

Затем, в коде другой страницы, я пытаюсь:

    protected void LoadFirstTab()
    {
        Control uControl1 = Page.LoadControl("/Controls/MyFirstTab.ascx");
        Control uControl2 = Page.LoadControl("/Controls/MySecondTab.ascx");

        // Want to do something like this, but don't get this far... :
        var myFirstTab = (IMyTabInterface)uControl1;
        var mySecondTab = (IMyTabInterface)uControl2;

        myFirstTab.LoadData();
        mySecondTab.LoadData();

        Panel1.Controls.Add(myFirstTab);
        Panel1.Controls.Add(mySecondTab);
    }

Я знаю, что многое из этого еще не правильно, но я получаю ошибкув строке LoadControl ():

«MyFirstTab» здесь не разрешен, поскольку он не расширяет класс «System.Web.UI.UserControl»

, даже есликласс явно расширяет класс UserControl.Что тут происходит?Есть ли лучший способ сделать это?

1 Ответ

5 голосов
/ 04 февраля 2011

Это будет работать:

var myFirstTab = (IMyTabInterface)uControl1;
var mySecondTab = (IMyTabInterface)uControl2;

myFirstTab.LoadData();
mySecondTab.LoadData();

Panel1.Controls.Add((Control)myFirstTab);
Panel1.Controls.Add((Control)mySecondTab);

Что происходит?

Ваши myFirstTab и mySecondTab переменные имеют тип IMyTabInterface, так как вы их объявилиas (это то, что позволяет вам вызывать LoadData для них).

Однако, чтобы добавить элемент в коллекцию элементов управления, они должны иметь тип Control(или тот, который наследуется от него) - это достигается приведением.


Другой вариант:

var myFirstTab = (IMyTabInterface)uControl1;
var mySecondTab = (IMyTabInterface)uControl2;

myFirstTab.LoadData();
mySecondTab.LoadData();

Panel1.Controls.Add(uControl1);
Panel1.Controls.Add(uControl2);

Здесь вы используете исходные типы Control, с которых вы начали,так что не нужно кастовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...