تحميل عناصر التحكم في المستخدم بشكل برمجي في عنصر نائب (ASP.NET)

StackOverflow https://stackoverflow.com/questions/2644250

سؤال

في صفحة .aspx لدي ؛

    <%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="_Default" AspCompat="True" %>

    <%@ Register src="Modules/Content.ascx" tagname="Content" tagprefix="uc1" %>

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
    <title></title>
    </head>
    <body>
    <form id="form1" runat="server">
        <div>
        <asp:PlaceHolder ID="Modulecontainer" runat="server"></asp:PlaceHolder>
        </div>
        </form>
    </body>  
</html>

في بلدي aspx.vb لدي ؛

    Try
        Dim loadmodule As UserControl
        loadmodule = Me.LoadControl("~/modules/content.ascx")
        Modulecontainer.Controls.Add(loadmodule)
    Catch ex As Exception
        Response.Write(ex.ToString & "<br />")
    End Try

والنتيجة هي عنصر نائب فارغ وليس أخطاء.

شكرا جزيلا على أي مساعدة

PS بعد إجابة FAT_TONY قمت بتغيير الكود إلى ؛

Try
            Dim loadmodule As ASP.ContentModule
            loadmodule = CType(LoadControl("~\Modules\Content.ascx"), ASP.ContentModule)
            Modulecontainer.Controls.Add(loadmodule)
        Catch ex As Exception
            Response.Write(ex.ToString & "<br />")
        End Try

ولكن لا توجد نتائج للأسف.

هل كانت مفيدة؟

المحلول

بدلاً من إعلان UserControl كنوع "التحكم" ، أعلن أنه اسم الفصل الذي حددته في ملف USERCONTROL.ASCX:

<%@ Control className="MyUserControl" %>

لذلك في الكود الخاص بك على صفحة .aspx:

Dim objControl as ASP.MyUserControl = CType(LoadControl("~\Controls\MyUserControl.ascx"), ASP.MyUserControl)

مزيد من المعلومات المتاحة على MSDN.

تحرير: تحقق من ملف الكود-behind لعنصر تحكم المستخدم الخاص بك وألاحظ مساحة الاسم واسم الفصل الموجود هناك. عندما قمت بإنشاء عنصر تحكم المستخدم الخاص بي ، تمت إضافته تلقائيًا إلى مساحة الاسم التي تحتوي على اسم المجلد وكذلك مساحة اسم التطبيق.

ثم ، في .aspx.vb ، استبدل "ASP.ContentModule" بـ "namepace.className" من ملف .ascx.vb الخاص بك. أيضًا ، تأكد من أنك لا تزال تتصل بطريقة إضافة على حاملك.

مثالي في C# ولكن يمكنني طرح VB إذا كنت بحاجة. تم تسمية طلبي بسهولة "Tester".

ASCX Code-Behind:

namespace Tester.modules
{
    public partial class content : System.Web.UI.UserControl
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }
    }
}

ASPX Code-Behind:

namespace Tester
{
    public partial class _Default : System.Web.UI.Page
    {   
        private Namespace.ClassName loadmodule;
        protected void Page_Load(object sender, EventArgs e)
        {
            loadmodule = (Namespace.ClassName)LoadControl("~/modules/content.ascx");
            Modulecontainer.Controls.Add(loadmodule);
        }
    }
}

نصائح أخرى

لا أعرف VB جيدًا ، لكن ألا تحتاج إلى إعلان التحكم في أن يكون Usercontrol وليس فقط التحكم؟ على سبيل المثال حاول التغيير

Dim loadmodule As Control

ل

Dim loadmodule As UserControl
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top