Ссылка на класс UserControl, основанный на строковом значении - PullRequest
0 голосов
/ 24 января 2011

У меня сейчас есть следующий код:

Dim ucAppName As UserControl_appName = CType(Parent.FindControl(strucParam(i).ParentFindControl), UserControl_appName)

Как я могу изменить его так, чтобы "UserControl_appName" не был жестко запрограммирован. Я хотел бы передать это как строку. Спасибо!

Ответы [ 3 ]

0 голосов
/ 24 января 2011

Используйте интерфейс и внедрите его в свой пользовательский контроль. Затем вы можете привести свой usercontrol к интерфейсу и получить все общие свойства и методы, доступные вам.

Public Interface ucInterface

    Property textbox() As String
    Function calculate() As Double

End Interface

Public Class UserControl_appName
    Inherits System.Web.UI.UserControl
    Implements ucInterface

    Public Function calculate() As Double Implements ucInterface.calculate
        Return 99 / 10
    End Function

    Public Property textbox() As String Implements ucInterface.textbox
        Get
            Return txtBox.text
        End Get
        Set(ByVal value As String)
            txtBox.text = value
        End Set
    End Property

End Class

Public Class Test
    Public Sub Test()

        Dim ucAppName As ucInterface = CType(Parent.FindControl(strucParam(i).ParentFindControl), ucInterface)

        ucAppName.textbox = "Test 1"
        ucAppName.calculate()

    End Sub
End Class
0 голосов
/ 25 января 2011

Проверьте систему. Отражение.Вы также можете извлекать объекты из других сборок или даже из библиотек, на которые ссылаются.Конечно, чтобы это работало, вы должны помнить, что этот код возвращает ссылку на «объект».У вас все еще будет возможность определить интерфейс, определяющий общую реализацию всех ваших элементов управления, или другое средство определения типа.

Imports System.Reflection
Public Class ObjectFactory
Public Shared Function NamedObject(ByVal ObjectName As String) As Object
    Dim Assem = [Assembly].GetExecutingAssembly()

    Dim MyType As Type = Assem.GetType(ObjectName.Trim)
    Dim MyObject As Object = Nothing
    Try
        MyObject = Activator.CreateInstance(MyType)
    Catch MyProblem As TargetInvocationException
        MessageBox.Show(MyProblem.ToString)
    End Try

    Return MyObject
End Function

Конечный класс

0 голосов
/ 24 января 2011

Подсказки:

Вам нужно передать System.Type вашему методу ...

Вам нужно будет использовать Object.GetType (), а также оператор typeof. Вы также можете создать экземпляр класса Type , используя его квалифицированное имя, если оно находится в выполняющейся сборке ИЛИ AssemblyQualifiedName

Основная идея ниже:

WebForm

<h2>Passing Types</h2>
<asp:Panel runat="server" ID="pnl1">
    <p>
        <asp:TextBox runat="server" ID="txt1" />
    </p>
    <p>
        <asp:DropDownList runat="server" ID="ddl1" />
    </p>
    <p>
        <asp:HyperLink runat="server" ID="hl1" Text="Link1" NavigateUrl="http://www.google.co.uk" Target="_blank" />
    </p>
</div>
<asp:Label runat="server" ID="lout" />
<div>
    <p>
        <asp:DropDownList runat="server" ID="ddlTypes">
        </asp:DropDownList>
        &nbsp;
        <asp:Button runat="server" ID="btnGetValueFromType" Text="Get Value By Control Type" onclick="btnGetValueFromType_Click" />
    </p>
</asp:Panel>

CodeBehind ( Извинения, это было довольно давно, так как я сделал любой VB.net , поэтому этот пример находится в C # )

    protected void Page_Load(object sender, EventArgs e)
    {
        if (! IsPostBack){
            buildGui();
        }
    }

    private void buildGui(){
        List<string> lstStrings = new List<string>(5);

        lstStrings.Add("one");
        lstStrings.Add("two");
        lstStrings.Add("three");
        lstStrings.Add("four");
        lstStrings.Add("five");

        ddl1.DataSource = lstStrings;
        ddl1.DataBind();

        //Populate the Types Dropdown with some fullyqualified type names (includes the assembly name,version number, PublicKey etc.)
        Dictionary<string, string> lstTypes = new Dictionary<string, string>(3);

        lstTypes.Add(this.ddl1.GetType().Name, this.ddl1.GetType().AssemblyQualifiedName);
        lstTypes.Add(this.txt1.GetType().Name, this.txt1.GetType().AssemblyQualifiedName);
        lstTypes.Add(this.hl1.GetType().Name, this.hl1.GetType().AssemblyQualifiedName);

        //lstTypes.Add(this.hl1.GetType().Name, this.hl1.GetType().AssemblyQualifiedName);
        lstTypes.Add(this.CRJunk01.GetType().Name, this.CRJunk01.GetType().AssemblyQualifiedName);

        ddlTypes.DataSource = lstTypes;
        ddlTypes.DataValueField = "value";
        ddlTypes.DataTextField = "key";
        ddlTypes.DataBind();
    }

    protected void btnGetValueFromType_Click(object sender, EventArgs e)
    {
        Type t = Type.GetType(ddlTypes.SelectedValue);

        lout.Text = "Looking for a type: " + t.ToString();

        foreach(Control c in this.pnl1.Controls){
            if (c.GetType().Equals(Type.GetType(ddlTypes.SelectedValue)))//Look for controls whose type is the same as the type selected in ddl1.
            {
                lout.Text += string.Format("<br/>Got Control of type: {0}", c.GetType().Name);
                //Cast to your custom Interface/BaseClass and extract the value.
                lout.Text += "<br/>Value is: " + ((ICrJunkControl)(c)).ControlValue;
            }
        }
    }

Это то, что вам, вероятно, понадобится, чтобы «использовать».

В заключение, вероятно, будет лучше, если все ваши пользовательские элементы управления наследуются от базового класса или интерфейса. Таким образом, когда вы нашли нужный объект на основе его типа, вы можете привести его к интерфейсу или базовому классу, а затем получить значение индивидуального общего члена, например, ControlValue. Реализация ваших базовых классов переопределит это. Это поможет преодолеть проблемы, связанные с разрозненными элементами управления, имеющими разных членов, которые выставляют свое состояние.

например.

Текстовое поле -> Текст
DropdownList -> SelectedValue
Гиперссылка -> Текст / NavigateUrl

НТН,

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