Merhabalar, bir süredir SharePoint anketleri ile ilgili bir modül üzerinde çalışmaktayım. Anket sürecine daha "user friendly" bir arayüz sağlamak için anketin neresinde bulunduğumuzu gösterecek bir Progress Bar isteği gelmişti. Bu yazımda bunu nasıl gerçekleştirdiğimizi, gerekli kodu ve kodun açıklamalarını bulabilirsiniz.
SharePoint'te Anket(Survey) bir çeşit özel listedir. Ankette her soru listeye bir Sütun(Field) olarak eklenmektedir. Diğer bir deyişle, sorularımız, anketin Author, Editor, Created, Modified vs. alanlarının yanına yeni alanlar olarak eklenmektedir. Herbir anket cevabı için Author; anketi cevaplayan, Created; cevap zamanı bilgilerini tutarken Soru Sütunu da bu soruya kişinin verdiği cevap bilgisini tutar.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Microsoft.SharePoint;
namespace SharePointNedir.UserControls.Anket
{
public partial class AnketProgressBar : System.Web.UI.UserControl
{
protected void Page_Load(object sender, EventArgs e)
{
SPWeb curWeb = SPContext.Current.Web;
SPList anketList = curWeb.GetListFromUrl(Request.Url.AbsolutePath);
int pageSeperatorFieldCount = GetPageSeperatorFieldCount(anketList);
int totalSoru = anketList.Fields.Count - 42 - pageSeperatorFieldCount;
int mevcutSoruIndex = 1;
if (Request.QueryString["FirstField"] != null &&
Request.QueryString["FirstField"].ToString() != string.Empty)
{
string strFirstField = Request.QueryString["FirstField"].ToString();
SPField field = anketList.Fields.GetFieldByInternalName(strFirstField);
if (!strFirstField.Equals("ID") || !strFirstField.Equals("ContentTypeId"))
{
foreach (SPField field in anketList.Fields)
{
if (IsQuestion(field))
{
if (field.FieldTypeDefinition.BaseRenderingTypeName != "PageSeparator")
{
if (field.InternalName.Equals(firstField))
break;
mevcutSoruIndex++;
}
}
}
}
}
double percentage = Convert.ToInt32(((double)100 / totalSoru) * mevcutSoruIndex);
Response.Write(percentage.ToString());
}
private static int GetPageSeperatorFieldCount(SPList anketList)
{
int pageSeperatorFieldCount = 0;
foreach (SPField field in anketList.Fields)
{
if (field.FieldTypeDefinition.BaseRenderingTypeName == "PageSeparator")
pageSeperatorFieldCount++;
}
return pageSeperatorFieldCount;
}
private bool IsQuestion(SPField field)
{
SPFieldLookup related = field as SPFieldLookup;
bool countRelated = related != null && related.CountRelated;
return (Enum.IsDefined(typeof(SPFieldType), field.TypeAsString) &&
field.Type != SPFieldType.Lookup &&
field.Type != SPFieldType.User &&
!field.ReadOnlyField &&
!countRelated &&
field.Type != SPFieldType.Computed &&
field.Type != SPFieldType.File &&
field.Type != SPFieldType.Integer &&
field.Type != SPFieldType.Recurrence &&
field.Type != SPFieldType.CrossProjectLink &&
field.Type != SPFieldType.AllDayEvent &&
field.ShowInListSettings != false &&
field.Reorderable);
}
}
}
İlk olarak içinde bulunduğumuz site ve URL bilgisi kullanarak anket listemizi alıyoruz. Anket sorularını sayfalama yapmak için "Sayfa Ayırıcı" (PageSeperatorField) kullanmış isek bunun sayısını buluyoruz, çünkü toplam soru sayısı bulurken bu alanları saymamamız lazım. Toplam soru sayısını bulurken Magic bir sayımız var, 42. SharePoint Anket tipinde default 42 adet alan bulunmaktadır. Eklediğimiz soru sayısını bulabilmek için toplam alan sayısından 42 ve Sayfa Ayırıcıları çıkarmamız gerekiyor. Kodda sonraki adım, şu an kaçıncı soruda bulunduğumuzu bulmamızı sağlıyor.
SharePoint anket cevaplarken ilk soru için NewForm açar, kişinin cevap kaydını oluşturur, sonraki sorular ise EditForm'da FirstField QueryString parametresi ile açılır ve bu kaydın soru alanlarını güncelleyerek çalışır. NewForm'da anket yeni başlıyor, yani mevcutSoruIndex 1. Sonraki sorularda ise FirstField parametresinden soru alınarak, kaçıncı soruda olduğumuzu bulmaya çalışıyoruz. Burada bir IsQuestion metodumuz var, bu metod sütunun SharePoint temel alanı mı, yoksa bizim eklediğimiz soru alanı mı olduğunu anlamamızı sağlıyor. Bu metod için aşağıdaki linke bakabilirsiniz.
Son olarak örnekte anket tamamlama oranını Response.Write ile yazdırdım, ama siz bu yüzde değeri kullanarak güzel bir progress bar oluşturabilirsiniz. Herkese iyi günler..