Nadszedł czas na kolejny wpis z cyklu SharePoint application pages. Na koniec poprzedniego wpisu widzieliśmy, że dla nowego elementu potrzebujemy strony, która by była kontenerem dla niego. W moim przypadku to “WorkFlow01_New.aspx”. Oczywiście można sobie wyobrazić, że ten sam formularz będzie wykorzystywany do różnych zadań, ale byłoby to zbyt skomplikowane i chaotyczne. Dodajemy nową application page do naszego projektu w Visual Studio, a następnie dodajemy do modułu “PlaceHolderMain” następujące kontrolki: 5 etykiet, 4 pola tekstowe, 1 kontrolkę kalendarza oraz przycisk.

Problematyczne jest to, że przy projektowaniu stron aplikacji nie mamy dostępu do graficznego designera w Visual Studio, a więc niestety nie jesteśmy w stanie zobaczyć naszego projekt od razu, musimy używać innych narzędzi aby widzieć jak w rzeczywistości będzie wyglądała nasza strona. Poniżej moja prosta strona, jak widać nie jest to nic skomplikowanego.

[code language="csharp"]</pre>
<asp:ContentID=”PageHead”ContentPlaceHolderID=”PlaceHolderAdditionalPageHead”runat=”server”>

</asp:Content>

<asp:ContentID=”Main”ContentPlaceHolderID=”PlaceHolderMain”runat=”server”>

<tablewidth=”1000″>

<tr>

<td><asp:LabelID=”LbInvoiceNumber”runat=”server” Text=”InvoiceNumber”> </asp:Label></td>

<td><asp:LabelID=”LbInvoiceDate”runat=”server”Text=”InvoiceDate”>

</asp:Label></td>

<td><asp:LabelID=”LbInvoiceAmount”runat=”server”Text=”InvoiceAmount”>

</asp:Label></td>

<td><asp:LabelID=”LbSupplier”runat=”server”Text=”Supplier”>

</asp:Label></td>

<td><asp:LabelID=”LbPurchaseOrder”runat=”server”Text=”PurchaseOrder”>

</asp:Label></td>

</tr>

<tr>

<td><asp:TextBoxID=”InvoiceNumber”runat=”server”></asp:TextBox></td>

<td><asp:CalendarID=”InvoiceDate”runat=”server”></asp:Calendar></td>

<td><asp:TextBoxID=”InvoiceAmount”runat=”server”></asp:TextBox></td>

<td><asp:TextBoxID=”Supplier”runat=”server”></asp:TextBox></td>

<td><asp:TextBoxID=”PurchaseOrder”runat=”server”></asp:TextBox></td>

</tr>

</table>

<asp:ButtonID=”SaveToList”runat=”server”Text=”Save to list”OnClick=”SaveList”on/>

</asp:Content>

<asp:ContentID=”PageTitle”ContentPlaceHolderID=”PlaceHolderPageTitle”runat=”server”>

Application Page

</asp:Content>

<asp:ContentID=”PageTitleInTitleArea”ContentPlaceHolderID=”PlaceHolderPageTitleInTitleArea”runat=”server”>

My Application Page

</asp:Content>
<pre>
[/code]
SharePoint Application Page
SharePoint Application Page
Teraz nadszedł moment aby stworzyć metodę, która prześle zawartość naszego formularza do listy. Gdy korzystamy ze stron aplikacyjnych wszystko co się dzieje zależy od nas, a tym samym bez oprogramowania przycisku na stronie nic by się nie wydarzyło. Jak widać w kodzie strony, już umieściłem kod dla zdarzenia  OnClick w kontrolce przycisk. Kod jest następujący:
[code language="csharp"]
protectedvoid SaveList(object sender, EventArgs e)
{

SPList list = SPContext.Current.Web.Lists.TryGetList("Financial Workflow List");
SPListItem newItem = list.Items.Add();
newItem["InvoiceNr"]=InvoiceNumber.Text.ToString() ;
newItem["InvoiceDt"]=InvoiceDate.SelectedDate ;
newItem["InvoiceAm" ]=InvoiceAmount.Text ;
newItem["Supplier" ]=Supplier.Text.ToString ();
newItem["PurchaseOrder"]=PurchaseOrder.Text.ToString()  ;
newItem.Update();

HttpContext context = HttpContext.Current;
if (HttpContext.Current.Request.QueryString["IsDlg"] != null)
{
context.Response.Write("<script type=’text/javascript’>window.frameElement.commitPopup()</script>");
context.Response.Flush();
context.Response.End();
}}}
[/code]
No dobrze co takiego robimy? Pierwsza część kodu tworzy instancję naszej listy. Następnie przypisujemy odpowiednio zawartość naszych kontrolek do listy, by w końcu wywołać metodę Update() aby przesłać wszystko do listy. Na sam koniec musimy usunąć SharePoint application pages z ekranu, a jednocześnie ta ostatnia część odświeża zawartość listy. I to wszystko. Wkrótce postaram się stworzyć kolejną część serii, która będzie bazowała na SharePoint application pages i na tym co stworzyliśmy do tej pory, a doda dalsze opcje.