Yeni bir makale ile herkese merhaba ; Makalemin konusu başlığındanda anlaşılacağı gibi web user controller olacak; Şimdi google’da web user controller üzerine bir araştırma yaparsanız çıkan makalelerin bir çoğu web user kontrolerin oluşturma sürecinden ve bir aspx sayfasına nasıl ekleneceğini göstermektedir. Şimdi şöyle düşünelim. Bir user kontrole ( ben kısaca WUC diyeceğim. ) nasıl aspx sayfasından erişirim?, içerisinde nasıl bir takım değişiklikler yaparım? Ve aralarında haberleşmeyi nasıl sağlarım? Bunları merak ediyorsanız bu makale tam size göre!
Bir web user kontrol oluşturalım(Bu makaleyi okumadan önce kitaplardan yada netten WUC üzerine bir araştırma yapmanızı tavsiye ederim.)
Wuc Tasarımı şöyle olsun:
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="WebUserControl.ascx.cs" Inherits="WebUserControl" EnableViewState="false" %>
<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="ajax" %>
<style type="text/css">
.header
{
height: 30px;
width: 100%;
background: url(_assets/img/header.gif) repeat-x;
color: #fff;
font-size: 1.1em;
font-weight: bold;
line-height: 30px;
}
</style>
<div style="width:25%"><div class="header"><asp:Label ID="lblcaption" runat="server" Text=""></asp:Label></div>
<table style=" border-bottom-style:solid; border-bottom-width:thin; border-bottom-color:Black;
border-left-style:solid; border-left-width:thin; border-left-color:Black;
border-right-style:solid; border-right-width:thin; border-right-color:Black;
border-top-style:solid; border-top-width:thin; border-top-color:Black; width:100%">
<tr><td><asp:PlaceHolder ID="PlaceHolder1" runat="server"><table> <tr>
<td >Adınız</td> <td ><asp:TextBox ID="txtad" runat="server"></asp:TextBox></td> </tr>
<tr><td >SoyAdınız</td><td ><asp:TextBox ID="txtsoyad" runat="server"></asp:TextBox></td></tr>
<tr> <td valign="top">Adres</td> <td ><asp:TextBox ID="txtadres" runat="server" Height="120px" TextMode="MultiLine"></asp:TextBox></td></tr>
<tr> <td >Dogum Yeriniz</td>
<td ><asp:TextBox ID="txtsehir" runat="server"></asp:TextBox></td>
</tr>
<tr>
<td >Mail Adresiniz</td>
<td ><asp:TextBox ID="txtmail" runat="server"></asp:TextBox></td>
</tr>
</table>
<ajax:AutoCompleteExtender ID="AutoCompleteExtender1" runat="server"
MinimumPrefixLength="1"
ServiceMethod="GetAllCities"
ServicePath="WebServiceGetAllCity.asmx"
TargetControlID="txtsehir"
CompletionSetCount="20">
</ajax:AutoCompleteExtender>
</asp:PlaceHolder></td></tr>
</table>
</div>
PlaceHolder ile içeriğe müdahale etmekte kullanacağım.AutoCompleteExtender ise şehirler textboxına karakter girilince bu karakter ile başlayan şehirleri veritabanından çekip ajax ile bir liste açmak için kullanılmıştır. Ama dikkat ediniz. Script Manager yok, Script Managerı Default aspx de kullanıcağım. Gerektiğinde başka yerlerde placeHolder.items.Clear deyeceğim ve ajax içeriği istediğim zaman kaldıracağım.
C# tarafına bakalım:
public partial class WebUserControl : System.Web.UI.UserControl
{
private string caption = string.Empty;
private bool clearitems = false;
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
InitialPage();
}
}
public void InitialPage()
{
if (ClearItems)
{
PlaceHolder1.Controls.Clear();
PlaceHolder1.Controls.Add(new LiteralControl("<table><tr><td>Adınız</td><td>:</td><td>"));
Label lblad = new Label();
lblad.Text = Ad;
PlaceHolder1.Controls.Add(lblad);
PlaceHolder1.Controls.Add(new LiteralControl("</td></tr><tr><td>SoyAdınız</td><td>:</td><td>"));
Label lblsoyad = new Label();
lblsoyad.Text = Soyad;
PlaceHolder1.Controls.Add(lblsoyad);
PlaceHolder1.Controls.Add(new LiteralControl("</td></tr><tr><td>Adres</td><td>:</td><td>"));
Label lbladres = new Label();
lbladres.Text = Adres;
PlaceHolder1.Controls.Add(lbladres);
PlaceHolder1.Controls.Add(new LiteralControl("</td></tr><tr><td>Şehir</td><td>:</td><td>"));
Label lblsehir = new Label();
lblsehir.Text = Sehir;
PlaceHolder1.Controls.Add(lblsehir);
PlaceHolder1.Controls.Add(new LiteralControl("</td></tr><tr><td>Mail Adresiniz</td><td>:</td><td>"));
Label lblmail = new Label();
lblmail.Text = Email;
PlaceHolder1.Controls.Add(lblmail);
PlaceHolder1.Controls.Add(new LiteralControl("</td></tr></table>"));
}
lblcaption.Text = Caption;
}
public string Ad
{
get { return txtad.Text; }
set { txtad.Text = value; }
}
public string Soyad
{
get { return txtsoyad.Text; }
set { txtsoyad.Text = value; }
}
public string Adres
{
get { return txtadres.Text; }
set { txtadres.Text = value; }
}
public string Sehir
{
get { return txtsehir.Text; }
set { txtsehir.Text = value; }
}
public string Email
{
get { return txtmail.Text; }
set { txtmail.Text = value; }
}
public string Caption
{
get { return caption; }
set { caption = value; }
}
public bool ClearItems
{
get { return clearitems; }
set { clearitems = value; }
}
}
Yukarıda dikkat ettiyseniz. Puplic olarak WUC içindeki kontrollere erişmeye çalışmışım. Bu işlem properties tanımlama türkçesi özellik verme denir. Burada get ReadOnly özelliğine sahiptir atanan değeri okur ve public olarak saklar. Set ise WriteOnly özelliğine sahiptir. Sadece = karakterinin solunda kullanılır Yani sadece değer aktarabilir ama içerik öğrenemezsiniz. Yukarıda girilen WUC içeriğine erişmek readwriteOnly property’si olmadan imkansızdır. Text degerlere erişildiği gibi int ve bool degerler WUC içerisine atılabilir ve sonra ulaşabilirsiniz.
User kontrolümüzü Default.aspx sayfamıza yerleştirelim:

Yukarıdaki tasarımdan sonra Default aspx sayfamızın Source ve Sonrada C# kodlarına bakalım:
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Web User Controller -1</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:ScriptManager ID="ScriptManager1" runat="server">
<Services>
<asp:ServiceReference Path="WebServiceGetAllCity.asmx" />
</Services>
</asp:ScriptManager>
<uc1:WebUserControl ID="WebUserControl1"
Caption="Kullanıcı Kayıt Bilgileri Giriş" ClearItems="false" runat="server" />
<div style="width: 25%">
<div style="width: 100%">
<asp:Button ID="BtnGonder" runat="server" Text="Gönder"
onclick="BtnGonder_Click" /></div>
</div>
</div>
</form>
</body>
</html>
Script Managerı dikkat ederseniz sayfa içinde kullandım ve şehirleri çekeceğim. Web servisi ekledim.
Yukarıda; WUC deki C# kodlarında şu satırlar eminim dikkatinizi çekmiştir.
public string Caption
{
get { return caption; }
set { caption = value; }
}
public bool ClearItems
{
get { return clearitems; }
set { clearitems = value; }
}
Bir string ve bool deger bu kısa birkaç satır aslında makalemizin temelini oluşturuyor. Caption değerine Global olarak istediğim degeri atarım. Zaten böylede yapmamışmıyım:
. . . . .
. . . .. . . . .
<uc1:WebUserControl ID="WebUserControl1"
Caption="Kullanıcı Kayıt Bilgileri Giriş" ClearItems="false" runat="server" />
. . . . . .
Yukarıdaki kod bana şunu diyor. Başlık “Kullanıcı kayıt bilgileri giriş” olsun temlar silinmesin peki bu Caption nereye atanacak onu şöyle yapmadık mı ? (yukarıda)
lblcaption.Text = Caption;
Demek ki; istediğim zaman WUC ‘ün başlıgına dinamik müdahale edeceğim. C# tarafına bakalım.
ArrayList listarray = new ArrayList();
protected void BtnGonder_Click(object sender, EventArgs e)
{
listarray.Add(WebUserControl1.Ad);
listarray.Add(WebUserControl1.Soyad);
listarray.Add(WebUserControl1.Adres);
listarray.Add(WebUserControl1.Sehir);
listarray.Add(WebUserControl1.Email);
Session.Add("UserInfo", listarray);
Response.Redirect("Onay.aspx"); }
public string Ad
{
get { return txtad.Text; }
set { txtad.Text = value; }
}
sayesinde;
WebUserControl1.Ad değerine girilen text’e ulaşabiliyorum. Bunu bir Array sınıfına attıp istediğim yere taşıyabilirim. Buda bir onay sayfası olsun. Içerik tamamen aynı web user kontrol sürüklenip bırakılıyor. Başka hiç bişe yok şimdi sadece kod tarafından müdahale edelim.
ArrayList listarray = new ArrayList();
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
listarray = (ArrayList)Session["UserInfo"];
WebUserControl1.ClearItems = true;
WebUserControl1.Ad = listarray[0].ToString();
WebUserControl1.Soyad = listarray[1].ToString();
WebUserControl1.Adres = listarray[2].ToString();
WebUserControl1.Sehir = listarray[3].ToString();
WebUserControl1.Email = listarray[4].ToString();
}
}
Yukarıdaki Session ifadesi Arraylist sınıfına dönüştürülür ve get set properties sayesinde Ad/Soyad/Adres/Sehir/Email değerleri ne bu sefer atanır dikkat edin önce ulaştık Session ile taşıdık şimdi başka bir sayfada atadık . Ama yukarıda tek satırlık kod belki son noktayı koyacak: WebUserControl1.ClearItems = true; bu kod parçası WUC içeriyini tamamen silecektir. Şimdi biraz geriye gidelim.
. . . . . . . .
public void InitialPage()
{
if (ClearItems)
{
PlaceHolder1.Controls.Clear();
PlaceHolder1.Controls.Add(new LiteralControl("<table><tr><td>Adınız</td><td>:</td><td>"));
Label lblad = new Label();
lblad.Text = Ad;
PlaceHolder1.Controls.Add(lblad);
PlaceHolder1.Controls.Add(new LiteralControl("</td></tr><tr>< . . . . . . . . . . .. . . . . .
. . . . .
Default.aspx deki WUC Clearitem = false olarak atanmıştı. Böylelikle WUC içeriyi korundu. Onay.aspx sayfasında true değeri aldı. Bakalım ne oldu
If(ClearItems)
{
WUC temizle
}
else
{
WUC içeriği koru
}
Bakalım neler oluyor ?

Get Set Properies ile verilere ulaşılır.
ClearItems = true ile WUC yeniden tasarlanır ve Veriler eklenir. Web user kontroller ile istediğiniz dinamik siteleri ve web uygulamalarını gerçekleştirebilirsiniz.Bu makalede web user controllere get set properties vermeyi öğrendik ilerleyen bölümlerde bunlara daha farklı bakacağız.
Bir Makalemizde burada sona erdi.Saygılar...
Yazar : Yusuf KARATOPRAK