Viditelnost formulářových prvků v ASCX control v Sharepointu
Pokud jste se někdy pokoušeli vyvinout složitější webpartu s velkým množstvím vstupních prvků a spoustou grafiky, zcela jistě jste došli do situace, kdy tradiční přetížení metody CreateChildControls prostě nestačí, nebo je přinejmenším velmi nepraktické. Rozumnou alternativou se zdá být použití klasické ASP.NET ascx controly, která nabízí kromě oddělení definiční a prezentační části také větší komfort pro designery (minimálně v tom, že se vám nebudou "hrabat v kódu").
Nejprve si vytvoříme soubor MyWebControl.ascx, což je klasická template. Do ní umístíme hlavičku a první prvek.
<%@ Control EnableViewState="true" Language="C#" AutoEventWireup="true" CodeBehind="MyWebControl.ascx.cs" Inherits="MyWebControlNamespace.MyWebControl, MyWebControlNamespace, Version=1.0.0.0, Culture=neutral, PublicKeyToken=......." %><asp:PlaceHolder runat="server" id="PhMyFirstPlaceHolder" />
Dále si vytvoříme code-behind soubor MyWebControl.ascx.cs, jehož počáteční definice bude:
namespace MyWebControlNamespace{ public partial class MyWebControl : System.Web.UI.UserControl { protected void Page_Load(object sender, EventArgs e) { //vas kod } //metody }}No a do třetice vytvoříme soubor MyWebControl.ascx.designer.cs:
namespace MyWebControlNamespace{ public partial class MyWebControl { protected global::System.Web.UI.WebControls.PlaceHolder PhMyFirstPlaceHolder; }}Tím máme základní strukturu ASCX controly hotovou. Ještě donutíme Visual Studio zobrazovat zanoření souborů tak, jak máme rádi u ASP.NET aplikací.
Otevřeme si třeba v Notepadu projektový soubor jmenoprojektu.csproj a upravíme (nebo přidáme - pokud jste soubory nevytvářeli přes Visual Studio a tím pádem v projektu chybí) tagy Compile:
<Compile Include="MyWebControl.ascx.cs"> <DependentUpon>MyWebControl.ascx</DependentUpon> <SubType>ASPXCodeBehind</SubType></Compile> <Compile Include="MyWebControl.ascx.designer.cs"> <DependentUpon>MyWebControl.ascx</DependentUpon></Compile>
Nyní už stačí otevřít projektový soubor ve Visual Studiu (popř. pouze udělat Reload) a ASCX control vypadá přesně jako v ASP.NET aplikaci.
Horste, to ale stále není všechno!
Nebyl by to Sharepoint, aby neměl nějaké "ale". V tomto případě se "ale" skrývá v tom, že každé přidání prvku do ASCX controly vyžaduje ruční přidání řádku do MyWebControl.ascx.designer.cs a jeho správné natypování. Čili pokud přidáte Label, budete muset ještě přidat:
protected global::System.Web.UI.WebControls.Label LbMujKrasnyLabel;
Bez toho svůj nový prvek v code-behind neuvidíte. Na druhou stranu, je to úkon primitivní a v porovnání s předchozím způsobem minimálně obtěžující.
Poslední nutný úkon je načtení vaší nové ASCX control do webparty:
protected override void CreateChildControls(){ base.CreateChildControls(); Control ctrl = Page.LoadControl("~/_controltemplates/MyWebUserControl.ascx"); this.Controls.Add(ctrl);}Ještě jednou díky Mirovi za uvedený postup - slibovaná dvojitá vodka s rybízovým džusem ho určitě nemine.





