Bu Makalemiz WebPart Bileşenleri ve Class Library-1 makalesinin devamı niteliğindedir. (http://ykaratoprak.blogspot.com/2008/11/webpart-bileenleri-ve-class-library-1.html) Öncelikle bir adet Class Library oluşturalım, adına MyAutoCompleterGeneric diyelim. Web part bileşenlerini kullanabilmek için Web.dll ve Ajax dll eklenmelidir, System.Web , System.Extender ve son olarakta AjaxToolkiti ekleyelim:

Yukarıdaki resim sanırım bu işlemi nasıl bir sıralama ile yapacağınızı anlatmaktadır. Öncelikle kontrolümüzü tanıyalım. Kontrol bir AutoCompleter , Ajax’ın Standart AutoCompleter’a göre avantajları neden böyle bir örnek yapmamı açıklacaktır. Standart Ajax da AutoCompleterExtender ancak bir Standart Asp.net textbox’ına uygulanmaktaydı. Fakat biz iki aracı(AjaxCompleter+TextBox= MyAutoCompleter) bir kontrole indirgedik. Yukarıdaki işlemlerden sonra :
AjaxCompleteExtender’ın bir TargetId ye ihtiyaç duyduğunu hatırlarız. Ama burda Extender benim geliştirdiğim kontrolüme gömülmektedir. O zaman ikinci farkta ortaya çıktı. TargetId source içinde tanımlama gereği yoktur. Ama önemli iki element var: Path( AutoComplete için Web Servisinin adresi ), ServiceMethod (Web Servisi içindeki olay)
Bunun için;
public class MyCompleter : WebPart
{
private string path = string.Empty;
private string text = string.Empty;
private string servicemethod = string.Empty;
private string labeltext = string.Empty;
TextBox textbox;
Bunun için yukarıdaki tanımlama ve extenderın çalışacağı kontrol olan textbox gereklidir. Aşağıdaki kodlama makalemizin en önemli kısmı Path, ServiceMethod ve Textbox’a yazılan verileri yakalamak için tanımlanır.
public string Path
{
get { return path; }
set { path = value; }
}
public string LabelText
{
get { return labeltext; }
set { labeltext = value; }
}
public string Text
{
get { return textbox.Text; }
set { textbox.Text = value; }
}
public string ServiceMethod
{
get { return servicemethod; }
set { servicemethod = value; }
}
Örneğin GET path değişkenine atanan değerlere erişir. SET ise path değişkenine değer atamak için yazılır. Şimdi Path, ServiceMethod gibi metodları nasıl kontrolümüzde çağıracağımızı görelim.
protected override void CreateChildControls()
{
string webServicePath = Path;
try
{
// TextBox önce Create edilir ve eklenir. . .
Literal textboxLabel = new Literal();
textboxLabel.Text = LabelText;
this.Controls.Add(textboxLabel);
textbox = new TextBox();
textbox.ID = "t1";
this.Controls.Add(textbox);
// AutoComplete Create edilir ve eklenir . . .
AutoCompleteExtender autoComplete = new AutoCompleteExtender();
autoComplete.MinimumPrefixLength = 1;
autoComplete.ServicePath = webServicePath;
autoComplete.ServiceMethod = ServiceMethod;
autoComplete.TargetControlID = "t1";
this.Controls.Add(autoComplete);
}
catch (Exception ex)
{
Literal errMsg = new Literal();
errMsg.Text = ex.Message;
this.Controls.Add(errMsg);
}
}
AutoComplete.ServicePath = webServicePath, AutoComplete.ServiceMethod = ServiceMethod, ve autoComplete.TargetControlID = "t1" ile oluşturulan textBox’a AutoComplete özellikleri eklendi.

AutoComplete özelliği için bir List değeri dönderen bir adet Web Servisi yazmak gerekecek. Ben Web Servisime veritabanı desteği vereceğim.
Web Servisimin kodları aşağıdadır. Dikkat edersek yukarıda Path, Servise Method’un nereden geldiğini görebiliriz.Path dğeri Web Servisin adı, Service Method ise Array değeri dönderecek Metoddur.
using System.Data.SqlClient;
using System.Web.Configuration;
namespace WebApplication1
{
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.Web.Script.Services.ScriptService]
public class WebServiceFromDBase : System.Web.Services.WebService
{
[System.Web.Services.WebMethod]
[System.Web.Script.Services.ScriptMethod]
public string[] GetProducts(string prefixText)
{
DataTable dt;
dt = GetDataFromSql("[sp_GetAllProductsWithPrefix]", prefixText, 0);
string[] items = new string[dt.Rows.Count];
int i = 0;
foreach (DataRow drow in dt.Rows)
{
items.SetValue(drow["Product"].ToString(), i);
i++;
}
return items;
}
public DataTable GetDataFromSql(string sp, string prefixText, int isAll)
{
SqlConnection con = new SqlConnection(WebConfigurationManager.ConnectionStrings["constring"].ToString());
SqlCommand cmd = new SqlCommand(sp, con);
try
{
con.Open();
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@prefixText", prefixText + "%");
cmd.Parameters.AddWithValue("@isAll", isAll);
SqlDataReader dr = cmd.ExecuteReader();
DataTable dt = new DataTable();
dt.Load(dr);
return dt;
}
finally
{
con.Dispose();
cmd.Dispose();
}
}
}
}
Şimdi sayfamızda bu işlemi yapan C# kodlarına bakalım:
protected void Search_Click(object sender, EventArgs e)
{
GridView1.DataSource = GetData("[sp_GetAllProductsWithPrefix]", MyCompleter1.Text, 1);
GridView1.DataBind();
}
public DataTable GetData(string sp, string parameter, int isAll)
{
SqlConnection con = new SqlConnection(WebConfigurationManager.ConnectionStrings["constring"].ToString());
SqlCommand cmd = new SqlCommand(sp, con);
try
{
con.Open();
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@prefixText", parameter + "%");
cmd.Parameters.AddWithValue("@isAll", isAll);
SqlDataReader dr = cmd.ExecuteReader();
DataTable dt = new DataTable();
dt.Load(dr);
return dt;
}
finally
{
con.Dispose();
cmd.Dispose();
}
}
Yukarıdaki kodda GetData() metodu ile MyAutoCompleter’ın içine yazılan veriye göre belli bir değer dönecektir.
Kaynak kodu(Anasayfa.aspx):
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Test</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:ScriptManager ID="ScriptManager1" runat="server">
<Services>
<asp:ServiceReference Path="~/WebServiceFromDBase.asmx" />
</Services>
</asp:ScriptManager>
<table><tr><td><table><tr><td>
<cc1:MyCompleter ID="MyCompleter1" runat="server" ServiceMethod="GetProducts"
Path="WebServiceFromDBase.asmx" LabelText="Ürünler : " />
</td><td>
<asp:Button ID="Search" runat="server" Text="Ara" onclick="Search_Click" />
</td></tr></table>
</td>
</tr>
<tr>
<td>
<asp:GridView ID="GridView1" runat="server" BackColor="White"
BorderColor="#999999" BorderStyle="None" BorderWidth="1px" CellPadding="3"
GridLines="Vertical" Height="79px" Width="711px">
<FooterStyle BackColor="#CCCCCC" ForeColor="Black" />
<RowStyle BackColor="#EEEEEE" ForeColor="Black" />
<PagerStyle BackColor="#999999" ForeColor="Black" HorizontalAlign="Center" />
<SelectedRowStyle BackColor="#008A8C" Font-Bold="True" ForeColor="White" />
<HeaderStyle BackColor="#000084" Font-Bold="True" ForeColor="White" />
<AlternatingRowStyle BackColor="#DCDCDC" />
</asp:GridView>
</td>
</tr></table>
</div>
</form></body>
</html>

0 yorum:
Yorum Gönder