|
SharePoint User Control 的开发有多种,现在主要介绍其中的两种。
1. 所有的代码都写在后辍名为ascx的文件中,如下图。 其优点为是容易更新到SharePoint网站, 不需要dll 编辑; 缺点:容易代码出错,没有智能检验,不可以跟踪代码:
<%@ Control Language="C#" AutoEventWireup="true" ClassName="PosterscopeTopNavigation2" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Configuration" %>
<%@ Import Namespace="System.Collections" %>
<%@ Import Namespace="System.Web" %>
<%@ Import Namespace="System.Web.Security" %>
<%@ Import Namespace="System.Web.UI" %>
<%@ Import Namespace="System.Web.UI.WebControls" %>
<%@ Import Namespace="System.Web.UI.WebControls.WebParts" %>
<%@ Import Namespace="System.Web.UI.HtmlControls" %>
<%@ Import Namespace="System.Text" %>
<%@ Import Namespace="System.Xml" %>
<%@ Import Namespace="System.IO" %>
<%@ Import Namespace="Microsoft.SharePoint" %>
<%@ Import Namespace="Microsoft.SharePoint.Navigation" %>
<script runat="server">
private string mediaPhotos = "Media Photos";
private string CategoryImages = "/sites/Posterscopeusa/Pages/CategoryImages.aspx?MCategory={0}&KCategory={1}";
protected void Page_Load(object sender, EventArgs e)
{
try
{
if (!this.IsPostBack)
Bind();
}
catch (Exception ex)
{
//this.Response.Write(ex.Message);
}
}
private void Bind()
{
this.ddlMedia.Items.Clear();
this.ddlMarket.Items.Clear();
SPSecurity.RunWithElevatedPrivileges(delegate()
{
using (SPSite site = new SPSite(SPContext.Current.Site.ID))
{
using (SPWeb rootWeb = site.RootWeb)
{
rootWeb.AllowUnsafeUpdates = true;
string loginUser = HttpContext.Current.User.Identity.Name;
SortedList MSlist = new SortedList();
SortedList KSlist = new SortedList();
foreach (SPWeb web in site.AllWebs)
{
try
{
if (!web.ID.Equals(site.RootWeb.ID))
{
SPUser user = site.RootWeb.EnsureUser(loginUser);
if (web.DoesUserHavePermissions(user.LoginName, SPBasePermissions.ViewListItems))
{
SPList list = null;
try
{
list = web.Lists[mediaPhotos];
}
catch { }
if (list != null)
{
MSlist.Clear();
KSlist.Clear();
//Fill media category and market category column choices to MSlist and KSlist SortedList
SPFieldChoice MediaCategoryField = (SPFieldChoice)list.Fields.GetField("Media Category");
foreach (string choiceName in MediaCategoryField.Choices)
{
string name = Server.HtmlDecode(" ") + choiceName;
//ListItem item = new ListItem(name, string.Format(MCategoryImages, choiceName));
ListItem item = new ListItem(name, choiceName);
MSlist.Add(name, item);
}
SPFieldChoice MarketCategoryField = (SPFieldChoice)list.Fields.GetField("Market Category");
foreach (string choiceName in MarketCategoryField.Choices)
{
string name = Server.HtmlDecode(" ") + choiceName;
// ListItem item = new ListItem(name, string.Format(KCategoryImages, choiceName));
ListItem item = new ListItem(name,choiceName);
KSlist.Add(name, item);
}
break;
}
}
}
}
catch
{ }
finally
{
if (web != null)
{
web.Dispose();
}
}
}
rootWeb.AllowUnsafeUpdates = false;
string MTitle = "Media Category";
string KTitle = "Market Category";
//Fill Media Category Dropdown Items
ddlMedia.Items.Add(new ListItem("----" + Server.HtmlDecode(" ") + MTitle + "----", ""));
if (MSlist.Count > 0)
{
foreach (ListItem childItem in MSlist.Values)
{
ddlMedia.Items.Add(childItem);
}
}
//Fill Market Category Dropdown Items
ddlMarket.Items.Add(new ListItem("----" + Server.HtmlDecode(" ") + KTitle + "----", ""));
if (KSlist.Count > 0)
{
foreach (ListItem childItem in KSlist.Values)
{
ddlMarket.Items.Add(childItem);
}
}
if (Request.QueryString["MCategory"] != null)
{
string mcategoryStr = Request.QueryString["MCategory"].ToString();
if (!string.IsNullOrEmpty(mcategoryStr))
{
//MTitle = string.Format("Media Category: {0}", mcategoryStr);
ddlMedia.Items.Insert(0, new ListItem(Server.HtmlDecode(" ") + MTitle, ""));
ddlMedia.SelectedValue = mcategoryStr;
//Page.RegisterStartupScript("Message", "<script>alert('"+MTitle+"');</sc"+"ript>");
}
else
{
ddlMedia.SelectedIndex = 0;
}
}
if (Request.QueryString["KCategory"] != null)
{
string kcategorystr = Request.QueryString["KCategory"].ToString();
if (!string.IsNullOrEmpty(kcategorystr))
{
//KTitle = string.Format("Market Category: {0}", kcategorystr);
ddlMarket.Items.Insert(0, new ListItem(Server.HtmlDecode(" ") + KTitle, ""));
ddlMarket.SelectedValue = kcategorystr;
}
else
{
ddlMarket.SelectedIndex = 0;
}
}
}
}
});
}
protected void btnSearch_Click(object sender, EventArgs e)
{
this.Response.Redirect(string.Format(CategoryImages,ddlMedia.SelectedValue.ToString(),ddlMarket.SelectedValue.ToString()));
}
</script>
<style type="text/css">
.btn {float:right;
margin-top:5px;
BORDER-RIGHT: #7b9ebd 1px solid; PADDING-RIGHT: 2px; BORDER-TOP: #7b9ebd 1px solid; PADDING-LEFT: 2px; FONT-SIZE: 12px; FILTER: progid:DXImageTransform.Microsoft.Gradient(GradientType=0, StartColorStr=#ffffff, EndColorStr=#cecfde); BORDER-LEFT: #7b9ebd 1px solid; CURSOR: hand; COLOR: black; PADDING-TOP: 2px; BORDER-BOTTOM: #7b9ebd 1px solid
}
</style>
<div>
<!--Media Category Dropdown-->
<asp:DropDownList ID="ddlMedia" runat="server" AutoPostBack="False"
style="background:#dce5e4; color:blue; text-decoration: none;border: 1px inset silver;margin-top:5px;width:230px;" >
</asp:DropDownList></div>
<!--Market Category Dropdown-->
<div><asp:DropDownList ID="ddlMarket" runat="server" AutoPostBack="False"
style="background:#dce5e4; color:blue; text-decoration: none;border: 1px inset silver;margin-top:5px; width:230px;" >
</asp:DropDownList></div>
<!--Search button-->
<div><asp:Button ID="btnSearch" runat="server" Text="Search" CssClass="btn"/> </div>
2. 第二种方法,所有的UI代码写在后辍名为ascx的文件中,其后台代码在项目中new一个新类中。其优点:可跟踪代码,写代码不容易出错;缺点:需要编辑和更新dll文件。
QueryControls.cs
<%@ Control Language="C#" AutoEventWireup="true" Inherits="VCSharePoint.BL.QueryControls,VCSharePoint, Version=1.0.0.0, Culture=neutral, PublicKeyToken=0134fd28ed40d3b2" %>
<style type="text/css">
.labeltitle{font-family:Calibri; font-size:10pt;font-weight:bold;color:#666;}
.select{ font-family:Calibri; font-size:10pt; width:160px; margin-left:10px}
</style>
<table>
<tr>
<td>
<input id="relWebURL" type="hidden" runat="server" /></td>
<td align="right" >
<asp:Label ID="lbYear" runat="server" CssClass="labeltitle" Text="Year:"></asp:Label>
</td>
<td>
<asp:DropDownList ID="ddlYears" runat="server" CssClass="select" AutoPostBack="True" OnSelectedIndexChanged="ddlYears_SelectedIndexChanged">
</asp:DropDownList>
</td>
<td align="right" >
<asp:Label ID="lbMonth" runat="server" Text="Month:" CssClass="labeltitle"></asp:Label>
</td>
<td>
<asp:DropDownList ID="ddlMonths" runat="server" CssClass="select"> </asp:DropDownList>
</td>
</tr>
</table>
QueryControls.cs文件代码:
using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using Microsoft.SharePoint;
namespace VCSharePoint.BL
{
public partial class QueryControls : System.Web.UI.UserControl
{
public DropDownList ddlYears;
public DropDownList ddlMonths;
public HtmlInputHidden relWebURL;
/// <summary>
/// the page inital function
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void Page_Load(object sender, EventArgs e)
{
if (!this.Page.IsPostBack)
{
BLCalculate blcalc = new BLCalculate();
DataTable ymTable = blcalc.GetYMData();
foreach (DataRow row in ymTable.Rows)
{
object oYear = row[UNITS.YMfields[0]]; // get the year value
if (oYear != null && (!string.IsNullOrEmpty(oYear.ToString())))
{
ListItem y = new ListItem();
y.Text = oYear.ToString();
y.Value = oYear.ToString();
if (oYear.ToString() == UNITS.CurrYear) // Default is setting current year
{
y.Selected = true;
object oMonth = row[UNITS.YMfields[1]]; // get the month value
if (oMonth != null && (!string.IsNullOrEmpty(oMonth.ToString())))
{
ListItem m = new ListItem(oMonth.ToString(), oMonth.ToString());
if (!ddlMonths.Items.Contains(m))
{
ddlMonths.Items.Add(m); // set the value into month dropdown
}
}
}
if (!ddlYears.Items.Contains(y)) // Set the values into year dropdown
ddlYears.Items.Add(y);
}
}
if (ddlYears.Items.Count == 0)
ddlYears.Items.Add(new ListItem(UNITS.CurrYear, UNITS.CurrYear)); // set a current year into year dropdown if there is no data in voluteer list.
ListItem mTotal = new ListItem("Total", "All"); // set a total option in month
mTotal.Selected = true;
ddlMonths.Items.Insert(0, mTotal);
}
relWebURL.Value = SPContext.Current.Web.ServerRelativeUrl; // get Relative Web URL
}
/// <summary>
/// Year dropdown select eventhandler
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void ddlYears_SelectedIndexChanged(object sender, EventArgs e)
{
string sYear = ddlYears.SelectedItem.Value;
if (sYear != null)
{
BLCalculate blcalc = new BLCalculate();
DataTable ymTable = blcalc.GetYMData();
ddlMonths.Items.Clear();
foreach (DataRow row in ymTable.Rows)
{
object oYear = row[UNITS.YMfields[0]]; // get the year value
if (oYear != null && (!string.IsNullOrEmpty(oYear.ToString())))
{
if (oYear.ToString() == sYear) // get the month based on selecting year.
{
object oMonth = row[UNITS.YMfields[1]]; // get the month value
if (oMonth != null && (!string.IsNullOrEmpty(oMonth.ToString())))
{
ListItem m = new ListItem(oMonth.ToString(), oMonth.ToString());
if (!ddlMonths.Items.Contains(m))
{
ddlMonths.Items.Add(m); // set the value into month dropdown
}
}
}
}
}
ListItem mTotal = new ListItem("Total", "All"); // set a total option in month
mTotal.Selected = true;
ddlMonths.Items.Insert(0, mTotal);
}
}
}
}
其他待续……
|
|