下面這篇文章就要告訴你如何如何一步步的添加一個(gè)動(dòng)態(tài)的ItemTemplate " /> 性夜夜春夜夜爽AA片A,久久国产视频网站,美女伊人网

天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

DataGrid 動(dòng)態(tài)添加模板列 實(shí)現(xiàn)代碼

使用模版的另一個(gè)優(yōu)勢(shì),就是它們能動(dòng)態(tài)的添加到你的控件里面去. 這樣的話(huà), 你可以事先設(shè)計(jì)好模版, 然后通過(guò)簡(jiǎn)單的幾行代碼就添加到你的控件中.

下面這篇文章就要告訴你如何如何一步步的添加一個(gè)動(dòng)態(tài)的ItemTemplate和EditItemTemplate到DataGrid中. 另外, 還會(huì)告訴你怎么獲取和更新用戶(hù)對(duì)EditItemTemplate所做的改變. 例子將會(huì)是很簡(jiǎn)單的. 然后, 我很快就會(huì)在TripleASP上面正式發(fā)布一個(gè)改進(jìn)后的TableEditor版本. 這個(gè)版本將更好的說(shuō)明如何使用動(dòng)態(tài)模版.


ITempalte的實(shí)現(xiàn)
為了能動(dòng)態(tài)的添加ItemTemplate和EditItemTemplate, 我們需要?jiǎng)?chuàng)建2個(gè)類(lèi)來(lái)實(shí)現(xiàn)ITemplate的接口(Interface). 第一個(gè)類(lèi)是GenericItem. 這個(gè)類(lèi)的主要工作就是: 取數(shù)據(jù)源的列名, 創(chuàng)建一個(gè)文本控件(literal contral), 為這個(gè)文本控件賦值, 最后把這個(gè)文本控件加到父控件(在這里父控件就是DataGrid了).

到目前為止還是很順利. 在繼續(xù)下面的討論之前, 我們來(lái)看看代碼和完成的步驟.
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類(lèi)實(shí)現(xiàn)了ITemplate的接口(interface). 因?yàn)槲覀兪菍?shí)現(xiàn)接口, 所以必須包括InstantiateIn這個(gè)方法. 這個(gè)方法是用來(lái)定義所有子控件和模版所屬的控件對(duì)象的. 在這個(gè)方法里面, 我們創(chuàng)建了一個(gè)新的Literal控件來(lái)保存DataGrid的單元值. 接著, 我們添加了DataBinding事件處理函數(shù). 這個(gè)事件處理函數(shù)實(shí)際上就是在DataGrid綁定數(shù)據(jù)的時(shí)候, 把單元值放到Literal控件的Text屬性中. 最后, 把這個(gè)Literal控件加入到控件的容器集合中. 很簡(jiǎn)單吧?

動(dòng)態(tài)EditItemTemplate
動(dòng)態(tài)EditItemTemplate類(lèi)ValidateEditItem跟GenericItem很類(lèi)似, 但是有3個(gè)地方不同.
第一個(gè)不同的地方是, 我們添加的是Textbox控件而不是Literal控件. 這樣的話(huà), 在編輯模式下, 用戶(hù)可以做任何修改.
第二個(gè)不同的地方, 你會(huì)發(fā)現(xiàn)我們會(huì)顯式地命名控件. 這會(huì)使我們能夠獲取更新事件中的任何數(shù)據(jù)變化.
最后一個(gè)不同, 你會(huì)看到一個(gè)跟Textbox相聯(lián)系的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();
}
}
}

動(dòng)態(tài)模版的實(shí)現(xiàn)
現(xiàn)在我們已經(jīng)有兩個(gè)實(shí)現(xiàn)了ITempalte接口的類(lèi)了. 一切準(zhǔn)備好了! 我們現(xiàn)在要做的就是把它們加入到我們的datagrid里面.

我們把BindData和DynamicColumns兩個(gè)方法放在一起. BindData主要是創(chuàng)建SQL查詢(xún)語(yǔ)句, 往datagrid添加列(動(dòng)態(tài)列), 然后把數(shù)據(jù)表綁定到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有兩個(gè)參數(shù): column(字符類(lèi)型)和isEditable(布爾類(lèi)型). column變量當(dāng)然就是我們要加入TemplateColumn的列名. isEditable變量是用作測(cè)試的, 如果我們希望這個(gè)列是允許編輯的話(huà).
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;
}

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


DataGrid事件
我們的編輯和取消事件是很標(biāo)準(zhǔn)的. 你有可能已經(jīng)看過(guò)它們100遍了. 在我們的編輯事件里面, 我們簡(jiǎn)單地取出被選中的行的編號(hào), 然后重新綁定數(shù)據(jù).

protected void Edit_Click(Object sender, DataGridCommandEventArgs e)
{
DataGrid1.EditItemIndex = e.Item.ItemIndex;
BindData();
}
我們的取消事件是把當(dāng)前所選行號(hào)設(shè)為-1. 這樣就等于告訴datagrid, 不在是編輯模式了. 然后, 我們重新綁定數(shù)據(jù).
protected void Cancel_Click(Object sender, DataGridCommandEventArgs e)
{
DataGrid1.EditItemIndex = -1;
BindData();
}
更新事件會(huì)跟你以前看到的有一點(diǎn)點(diǎn)不同. 然而, 它卻會(huì)讓你想起你在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();
}

這樣的話(huà), EditItemTemplate就硬編碼到頁(yè)面中去了. 你可能已經(jīng)看過(guò)一些取表單提交數(shù)據(jù)的例子, 其中的方法, 或者是通過(guò)控件位置取值, 或者是控件名稱(chēng)取值. 但是, 如果你是在運(yùn)行時(shí)創(chuàng)建控件, 那么, 在PostBack的時(shí)候, ASP.NET是無(wú)法取得這些值的. 為此, 我們只能通過(guò)Request.Form的方法來(lái)得到這些值.

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


結(jié)論
動(dòng)態(tài)添加模版到你的模版控件會(huì)在開(kāi)始的時(shí)候增加一點(diǎn)點(diǎn)的工作量. 但是, 一旦你建立了一系列的優(yōu)秀的模版類(lèi), 你會(huì)發(fā)現(xiàn), 實(shí)現(xiàn)ITemplate會(huì)非常的快速和容易. 它運(yùn)行你建立強(qiáng)大的控件來(lái)滿(mǎn)足你數(shù)據(jù)操作的需要. 如果你需要更好的例子, 請(qǐng)看我即將發(fā)布在TripleASP的TableEditor控件.

AspNet技術(shù)DataGrid 動(dòng)態(tài)添加模板列 實(shí)現(xiàn)代碼,轉(zhuǎn)載需保留來(lái)源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 金瓶梅 快播 | 熟女少妇内射日韩亚洲 | 亚洲字幕久久 | 人妻天天爽夜夜爽三区麻豆A片 | 狠狠狠色丁香婷婷综合久久 | 伊人久久中文字幕久久cm | 91精品国产色综合久久不 | 亚洲字幕久久 | 暖暖日本大全免费观看 | 日日碰狠狠添天天爽 | 久久re热线视频精品99 | 天天啪免费视频在线看 | 欧美gay老头互吃 | AV无码久久无遮挡国产麻豆 | 穿着丝袜被男生强行啪啪 | 精品国产国偷自产在线观看 | 中国xxxxx| 国产成人精品视频免费大全 | 被男按摩师添的好爽在线直播 | 成人伊人青草久久综合网 | 麻豆国产原创中文AV网站 | 墨西哥美女主播 | 日本粉嫩学生毛绒绒 | 91精品国产色综合久久不 | 国产精品亚洲欧美一区麻豆 | 2020美女视频黄频大全视频 | yellow免费| 精品午夜国产福利观看 | 欧美日本韩国一二区视频 | 亚洲AV成人片色在线观看网站 | 成人中文字幕在线观看 | YELLOW高清视频免费观看 | 国内精品伊人久久久久 | 被室友C哭调教双性 | 脱jk裙的美女露小内内无遮挡 | 最近中文字幕免费高清MV视频6 | 伦理在线影院伦理电影 | 色即是空 BT| 在线观看免费av网站 | 折磨比基尼美女挠肚子 | 国产麻豆精品人妻无码A片 国产麻豆精品久久一二三 国产麻豆精品传媒AV国产在线 |