By: Scott Watermasysk

Published: 4/10/2002

翻譯: Drason

模版控件能讓用戶幾乎不用花費任何時間就創建出復雜的用戶界面. Asp.net有很多控件都使用了模版技術(D " /> 欧美大交乱xxxx,黄色片视频免费看,天堂视频免费看

一区二区久久-一区二区三区www-一区二区三区久久-一区二区三区久久精品-麻豆国产一区二区在线观看-麻豆国产视频

動態ItemTemplate的實現(譯) - item,template

原文: Implementing Dynamic ItemTemplates

By: Scott Watermasysk

Published: 4/10/2002

翻譯: Drason

模版控件能讓用戶幾乎不用花費任何時間就創建出復雜的用戶界面. ASP.NET有很多控件都使用了模版技術(DataGrid就是一個例子). 而這些控件都工作得很好, 通常, 模版可以被保存為ascx文件以增加復用性. 很有可能, 事前你是不知道你的控件是怎么布局的, 而且你需要動態的添加一些模版以應付不同的事件.

使用模版的另一個優勢,就是它們能動態的添加到你的控件里面去. 這樣的話, 你可以事先設計好模版, 然后通過簡單的幾行代碼就添加到你的控件中.

下面這篇文章就要告訴你如何如何一步步的添加一個動態的ItemTemplate和EditItemTemplate到DataGrid中. 另外, 還會告訴你怎么獲取和更新用戶對EditItemTemplate所做的改變. 例子將會是很簡單的. 然后, 我很快就會在TripleASP上面正式發布一個改進后的TableEditor版本. 這個版本將更好的說明如何使用動態模版.

ITempalte的實現 
為了能動態的添加ItemTemplate和EditItemTemplate, 我們需要創建2個類來實現ITemplate的接口(Interface). 第一個類是GenericItem. 這個類的主要工作就是: 取數據源的列名, 創建一個文本控件(literal contral), 為這個文本控件賦值, 最后把這個文本控件加到父控件(在這里父控件就是DataGrid了). 

到目前為止還是很順利. 在繼續下面的討論之前, 我們來看看代碼和完成的步驟.

using System;

using System.Web;

using System.Data; using System.Web.UI;

using System.Web.UI.WebControls;

namespace TripleASP.ItemTemplates

{

/// <summary>

/// Summary description for GenericItem.

/// </summary>

public class GenericItem : ITemplate

{

private string column;

//private bool validate;

public GenericItem(string column)

{

this.column = column;

}

public void InstantiateIn(Control container)

{

Literal l = new Literal();

l.DataBinding += new EventHandler(this.BindData);

container.Controls.Add(l);

}

public void BindData(object sender, EventArgs e)

{

Literal l = (Literal) sender;

DataGridItem container = (DataGridItem) l.NamingContainer;

l.Text = ((DataRowView) container.DataItem)[column].ToString();

}

}

}

正如你看到的, GenericItem類實現了ITemplate的接口(interface). 因為我們是實現接口, 所以必須包括InstantiateIn這個方法. 這個方法是用來定義所有子控件和模版所屬的控件對象的. 在這個方法里面, 我們創建了一個新的Literal控件來保存DataGrid的單元值. 接著, 我們添加了DataBinding事件處理函數. 這個事件處理函數實際上就是在DataGrid綁定數據的時候, 把單元值放到Literal控件的Text屬性中. 最后, 把這個Literal控件加入到控件的容器集合中. 很簡單吧?

動態EditItemTemplate 

動態EditItemTemplate類ValidateEditItem跟GenericItem很類似, 但是有3個地方不同.

第一個不同的地方是, 我們添加的是Textbox控件而不是Literal控件. 這樣的話, 在編輯模式下, 用戶可以做任何修改.

第二個不同的地方, 你會發現我們會顯式地命名控件. 這會使我們能夠獲取更新事件中的任何數據變化.

最后一個不同, 你會看到一個跟Textbox相聯系的RequiredFieldValidator控件. 這是可選的. 但是, 這的確讓你知道有些事是可以這樣做的.

下面就是ValidateEditItem的代碼:

using System;

using System.Data;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web;

namespace TripleASP.ItemTemplates

{

/// <summary>

/// Summary description for ValidateEditItem.

/// </summary>

public class ValidateEditItem : ITemplate

{

private string column;

public ValidateEditItem(string column)

{

this.column = column;

}

public void InstantiateIn(Control container)

{

TextBox tb = new TextBox();

tb.DataBinding += new EventHandler(this.BindData);

container.Controls.Add(tb);

tb.ID = column;

RequiredFieldValidator rfv = new RequiredFieldValidator();

rfv.Text = "Please Answer";

rfv.ControlToValidate = tb.ID;

rfv.Display = ValidatorDisplay.Dynamic;

rfv.ID = "validate" + tb.ID;

container.Controls.Add(rfv); 

}

public void BindData(object sender, EventArgs e)

{

TextBox tb = (TextBox) sender;

DataGridItem container = (DataGridItem)tb.NamingContainer;

tb.Text = ((DataRowView) container.DataItem)[column].ToString();

}

}

}

動態模版的實現 

現在我們已經有兩個實現了ITempalte接口的類了. 一切準備好了! 我們現在要做的就是把它們加入到我們的datagrid里面.

我們把BindData和DynamicColumns兩個方法放在一起. BindData主要是創建SQL查詢語句, 往datagrid添加列(動態列), 然后把數據表綁定到datagrid.

void BindData()

{

string sql = "Select * from publishers Where State Is not null";

DataGrid1.Columns.Add(DynamicColumns("pub_id",false));

DataGrid1.Columns.Add(DynamicColumns("pub_name",true));

DataGrid1.Columns.Add(DynamicColumns("city",true));

DataGrid1.Columns.Add(DynamicColumns("state",true));

DataGrid1.Columns.Add(DynamicColumns("country",true));

DataGrid1.DataKeyField = "pub_id";

DataGrid1.DataSource = GetDataTable(sql);

DataGrid1.DataBind();

}

DynamicColumns有兩個參數: column(字符類型)和isEditable(布爾類型). column變量當然就是我們要加入TemplateColumn的列名. isEditable變量是用作測試的, 如果我們希望這個列是允許編輯的話.

protected TemplateColumn DynamicColumns(string column, bool isEditable)

{

TemplateColumn genericcolumn = new TemplateColumn();

genericcolumn.HeaderText = column;

genericcolumn.ItemTemplate = new GenericItem(column);

if(isEditable)

{

genericcolumn.EditItemTemplate = new ValidateEditItem(column);

}

return genericcolumn;

}

正如你所看到的, 首先我們實例化一個TemplateColumn(genericcolumn), 根據我們要添加的列的名字設置HeaderText屬性(當然,你可以設置為任何東西都可以). 接著, 我們通過添加新的GenericItem的參考(reference), 把ItemTemplate添加到genericcolumn, 并把名稱傳入. 最后, 我們必須檢查isEditable, 以便看看我們需不需要允許編輯這個列. 如果為真, 我們要往ValidateEditItem添加新的參考, 而且把列名也傳過去.

DataGrid事件 

我們的編輯和取消事件是很標準的. 你有可能已經看過它們100遍了. 在我們的編輯事件里面, 我們簡單地取出被選中的行的編號, 然后重新綁定數據.

protected void Edit_Click(Object sender, DataGridCommandEventArgs e)

{

DataGrid1.EditItemIndex = e.Item.ItemIndex;

BindData();

}

我們的取消事件是把當前所選行號設為-1. 這樣就等于告訴datagrid, 不在是編輯模式了. 然后, 我們重新綁定數據.

protected void Cancel_Click(Object sender, DataGridCommandEventArgs e)

{

DataGrid1.EditItemIndex = -1;

BindData();

}

更新事件會跟你以前看到的有一點點不同. 然而, 它卻會讓你想起你在ASP的日子.

protected void Update_Click(Object sender, DataGridCommandEventArgs e)

{

//Gets the UniqueID that is attached to the front of each textbox

//dyamically added to our datagrid's EditItemTempate

string uid = e.Item.UniqueID + ":";

string pub_id = (string)DataGrid1.DataKeys[e.Item.ItemIndex];

string pub_name = (Request.Form[uid + "pub_name"].ToString());

string city = (Request.Form[uid + "city"].ToString());

string state = (Request.Form[uid + "state"].ToString());

string country = (Request.Form[uid + "country"].ToString());

//Simple method to update DB

UpdateRecord(pub_id,pub_name,city,state,country);

DataGrid1.EditItemIndex = -1;

BindData();

}

這樣的話, EditItemTemplate就硬編碼到頁面中去了. 你可能已經看過一些取表單提交數據的例子, 其中的方法, 或者是通過控件位置取值, 或者是控件名稱取值. 但是, 如果你是在運行時創建控件, 那么, 在PostBack的時候, ASP.NET是無法取得這些值的. 為此, 我們只能通過Request.Form的方法來得到這些值.

在你開始在ValidateEditItem類里面仔細尋找被小心命名的textbox的時候, 你必須記住, ASP.NET已經為控件的名字沖突做了預防措施. 一般來說, 這包括增加每個datagrid父控件的名稱, datagrid本身的名稱, 和一個代表每個textbox的序號的字符串放在textbox的ID前面. 我們可以大量的使用這樣的方法. 但是這并不保證我們的代碼絕對的模塊化和可復用. 相反, 我們檢查DataGridCommandEventArgs.Item.UniqueID 并在尾部加上":". 有了這個UniqueID, 我們就可以安全地取得textbox里面的編輯數據, 并更新到數據庫.

結論 

動態添加模版到你的模版控件會在開始的時候增加一點點的工作量. 但是, 一旦你建立了一系列的優秀的模版類, 你會發現, 實現ITemplate會非常的快速和容易. 它運行你建立強大的控件來滿足你數據操作的需要. 如果你需要更好的例子, 請看我即將發布在TripleASP的TableEditor控件.

AspNet技術動態ItemTemplate的實現(譯) - item,template,轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

主站蜘蛛池模板: 久久国产成人亚洲精品影院老金 | 国产成人综合网在线播放 | 色综合久久夜色精品国产 | 国产精品亚洲高清一区二区 | 欧美成人综合在线 | 精品一二三区 | 天天色综| 精品一区二区三区四区乱码 | 狠狠色婷婷狠狠狠亚洲综合 | 精品国产成人a区在线观看 精品国产成人a在线观看 | 能在线观看的一区二区三区 | f性欧美 | 国产精品视频第一页 | 国产原创麻豆 | 久久久精品久久久久久久久久久 | 一区二区视频免费看 | 精品国产免费观看 | 国产午夜精品久久久久小说 | 人人公开免费超级碰碰碰视频 | 福利在线小视频 | 四虎永久免费在线观看 | 97夜色| 色视频免费网站 | 亚洲精品第1页 | 欧美成人精品三级网站 | 婷婷综合丁香 | 亚洲看黄 | 狠狠色噜噜狠狠狠97影音先锋 | 精品一区二区三区在线观看 | 女人夜色黄网在线观看 | 婷婷色国产 | 经典欧美gifxxoo动态图午夜 | 国产高清视频91 | 欧美日韩亚洲区久久综合 | 东方伊人免费在线观看 | 国产欧美一区二区三区观看 | 国产小视频在线观看免费 | 欧美激情视频网站 | 99er这里只有精品 | 久久亚洲人成网站 | 中文字幕日本精品一区二区三区 |