2017-02-05 1 views
0

Je suis en train de développer un contrôle GridView personnalisé. Celui-ci possède une liste de sélection dans l'en-tête, tout comme Excel. Comme Excel comme filtre, l'une des options sont "filtre personnalisé". dans ce cas, je veux montrer un peu de contrôle que j'ai conçu en tant que contrôle de l'utilisateur comme ascx. maintenant lorsque je veux utiliser ce contrôle utilisateur dans mon contrôle personnalisé. j'utiliser ce code:Comment utiliser UserControl dans CustomControl?

protected override void RenderContents(HtmlTextWriter writer) 
    { 

     UserControl uc = new UserControl(); 
     AADQuickCustomFilter CustomFilter = (AADQuickCustomFilter)uc.LoadControl("~/AADQuickCustomFilter.ascx"); 
     TextWriter tw = new StringWriter(); 
     HtmlTextWriter hw = new HtmlTextWriter(tw); 
     CustomFilter.RenderControl(hw); 

     writer.Write(tw.ToString()); 
     base.RenderContents(writer); 
    } 

malheureusement j'eu erreur Une exception de type « System.Web.HttpException » a eu lieu en System.Web.dll mais n'a pas été traitée dans le code utilisateur Informations complémentaires: Le fichier ' /AADQuickCustomFilter.ascx 'n'existe pas. enter image description here

Alors S'il vous plaît aidez-moi, où est le problème. ce que j'ai mal fait? Merci experts

+0

Ici, j'ai remplacé RenderControl de mon contrôle personnalisé – AminAmiriDarban

+1

Vous devez spécifier le chemin de la racine de votre site, votre ascx est là? – CrudaLilium

+0

Aidez-moi avec code snip s'il vous plaît @CrudaLilium – AminAmiriDarban

Répondre

0

Voici la réponse. Au début, je créer classe enregistrer des fichiers ascx en tant que ressource intégré comme ce code:

using System.Web.Hosting; 
using System.Web.Caching; 
using System.Collections; 
using System; 
using System.IO; 
using System.Web; 
using System.Reflection; 

namespace AADGridView 
{ 
    public class AssemblyResourceProvider : VirtualPathProvider 
    { 
     string mResourcePrefix; 

     public AssemblyResourceProvider() : this("EmbeddedWebResource") 
     { 
     } 

     public AssemblyResourceProvider(string prefix) 
     { 
      mResourcePrefix = prefix; 
     } 

     private bool IsAppResourcePath(string virtualPath) 
     { 
      String checkPath = VirtualPathUtility.ToAppRelative(virtualPath); 
      return checkPath.StartsWith("~/" + mResourcePrefix + "/", 
        StringComparison.InvariantCultureIgnoreCase); 
     } 

     public override bool FileExists(string virtualPath) 
     { 
      return (IsAppResourcePath(virtualPath) || 
        base.FileExists(virtualPath)); 
     } 

     public override VirtualFile GetFile(string virtualPath) 
     { 
      if (IsAppResourcePath(virtualPath)) 
       return new AssemblyResourceVirtualFile(virtualPath); 
      else 
       return base.GetFile(virtualPath); 
     } 

     public override CacheDependency 
       GetCacheDependency(string virtualPath, 
       IEnumerable virtualPathDependencies, 
       DateTime utcStart) 
     { 
      if (IsAppResourcePath(virtualPath)) 
       return null; 
      else 
       return base.GetCacheDependency(virtualPath, 
         virtualPathDependencies, utcStart); 
     } 
    } 

    class AssemblyResourceVirtualFile : VirtualFile 
    { 
     string path; 

     public AssemblyResourceVirtualFile(string virtualPath) : base(virtualPath) 
     { 
      path = VirtualPathUtility.ToAppRelative(virtualPath); 
     } 

     public override Stream Open() 
     { 
      string[] parts = path.Split('/'); 
      string assemblyName = parts[2]; 
      string resourceName = parts[3]; 
      assemblyName = Path.Combine(HttpRuntime.BinDirectory, assemblyName); 
      Assembly assembly = Assembly.LoadFile(assemblyName); 
      if (assembly == null) throw new Exception("Failed to load " + assemblyName); 
      Stream s = assembly.GetManifestResourceStream(resourceName); 
      if (s == null) throw new Exception("Failed to load " + resourceName); 
      return s; 
     } 
    } 
} 

Ensuite, il suffit Substituer la constractor de votre contrôle personnalisé comme celui-ci:

public AADExcelFilterGridView() : base() 


    {System.Web.Hosting.HostingEnvironment.RegisterVirtualPathProvider(new AssemblyResourceProvider(ResourcePrefix)); 
} 

Et puis

static string mResourcePrefix = "EmbeddedWebResource"; 

    public static string ResourcePrefix 
    { 
     get 
     { 
      return mResourcePrefix; 
     } 

     set 
     { 
      mResourcePrefix = value; 
     } 
    } 

Maintenant, juste besoin d'ajouter votre contrôle utilisateur à votre rendu de contrôle personnalisé Comme ci-dessus:

protected override void RenderContents(HtmlTextWriter writer) 
    { 

     UserControl uc = new UserControl(); 
     AADQuickFilter CustomFilter = (AADQuickFilter)uc.LoadControl("~/EmbeddedWebResource/AADGridView.dll/AADGridView.AADQuickFilter.ascx"); 
     TextWriter tw = new StringWriter(); 
     HtmlTextWriter hw = new HtmlTextWriter(tw); 
     CustomFilter.RenderControl(hw); 

     writer.Write(tw.ToString()); 
     base.RenderContents(writer); 
    } 

C'est tout ce que vous avez, espérons utile. Merci pour les très bons commentaires des experts.