??xml version="1.0" encoding="utf-8" standalone="yes"?>
]]>
]]>
开始新U程
?Net下创Z个新U程是非常容易的Q你可以通过以下的语句来开始一个新的线E:
Thread thread = new Thread (new ThreadStart (ThreadFunc));
thread.Start ();
W一条语句创Z个新的Thread对象Qƈ指明了一个该U程的方法。当新的U程开始时Q该Ҏ也就被调用执行了。该U程对象通过一个System..Threading.ThreadStartcȝ一个实例以cd安全的方法来调用它要调用的线E方法?nbsp;
W二条语句正式开始该新线E,一旦方法StartQ)被调用,该线E就保持在一?alive"的状态下了,你可以通过d它的IsAlive属性来判断它是否处?alive"状态。下面的语句昄了如果一个线E处?alive"状态下将该线E挂LҎQ?nbsp;
if (thread.IsAlive) {
thread.Suspend ();
}
不过h意,U程对象的StartQ)Ҏ只是启动了该U程Q而ƈ不保证其U程ҎThreadFuncQ)能立卛_到执行。它只是保证该线E对象能被分配到CPU旉Q而实际的执行q要由操作系l根据处理器旉来决定?nbsp;
一个线E的Ҏ不包含Q何参敎ͼ同时也不q回M倹{它的命名规则和一般函数的命名规则相同。它既可以是静态的QstaticQ也可以是非静态的QnonstaticQ。当它执行完毕后Q相应的U程也就l束了,其线E对象的IsAlive属性也p|ؓfalse了。下面是一个线E方法的实例Q?nbsp;
public static void ThreadFunc()
{
for (int i = 0; i <10; i++) {
Console.WriteLine("ThreadFunc {0}", i);
}
}
前台U程和后台线E?nbsp;
.Net的公用语aq行ӞCommon Language RuntimeQCLRQ能区分两种不同cd的线E:前台U程和后台线E。这两者的区别是Q应用程序必运行完所有的前台U程才可以退出;而对于后台线E,应用E序则可以不考虑其是否已l运行完毕而直接退出,所有的后台U程在应用程序退出时都会自动l束?nbsp;
一个线E是前台U程q是后台U程可由它的IsBackground属性来军_。这个属性是可读又可写的。它的默认gؓfalseQ即意味着一个线E默认ؓ前台U程。我们可以将它的IsBackground属性设|ؓtrueQ从而之成Z个后台线E?nbsp;
下面的例子是一个控制台E序Q程序一开始便启动?0个线E,每个U程q行5U钟旉。由于线E的IsBackground属性默认ؓfalseQ即它们都是前台U程Q所以尽程序的ȝE很快就q行l束了,但程序要到所有已启动的线E都q行完毕才会l束。示例代码如下:
using System;
using System.Threading;
class MyApp
{
public static void Main ()
{
for (int i=0; i<10; i++) {
Thread thread = new Thread (new ThreadStart (ThreadFunc));
thread.Start ();
}
}
private static void ThreadFunc ()
{
DateTime start = DateTime.Now;
while ((DateTime.Now - start).Seconds <5)
;
}
}
接下来我们对上面的代码进行略微修改,每个线E的IsBackground属性都讄为trueQ则每个U程都是后台U程了。那么只要程序的ȝE结束了Q整个程序也q束了。示例代码如下:
using System;
using System.Threading;
class MyApp
{
public static void Main ()
{
for (int i=0; i<10; i++) {
Thread thread = new Thread (new ThreadStart (ThreadFunc));
thread.IsBackground = true;
thread.Start ();
}
}
private static void ThreadFunc ()
{
DateTime start = DateTime.Now;
while ((DateTime.Now - start).Seconds <5)
;
}
}
既然前台U程和后台线E有q种差别Q那么我们怎么知道该如何设|一个线E的IsBackground属性呢Q下面是一些基本的原则Q对于一些在后台q行的线E,当程序结束时q些U程没有必要l箋q行了,那么q些U程应该设|ؓ后台U程。比如一个程序启动了一个进行大量运的U程Q可是只要程序一旦结束,那个U程失Ml箋存在的意义,那么那个U程p是作为后台线E的。而对于一些服务于用户界面的线E往往是要讄为前台线E的Q因为即使程序的ȝE结束了Q其他的用户界面的线E很可能要l存在来昄相关的信息,所以不能立即终止它们。这里我只是l出了一些原则,具体到实际的q用往往需要编E者的q一步仔l斟酌?nbsp;
U程优先U?nbsp;
一旦一个线E开始运行,U程调度E序可以控制其所获得的CPU旉。如果一个托的应用E序q行在Windows机器上,则线E调度程序是由Windows所提供的。在其他的^CQ线E调度程序可能是操作pȝ的一部分Q也自然可能?Net框架的一部分。不q我们这里不必考虑U程的调度程序是如何产生的,我们只要知道通过讄U程的优先我们可以该线E获得不同的CPU旉?nbsp;
U程的优先是由Thread.Priority属性控制的Q其值包含:ThreadPriority.Highest、ThreadPriority.AboveNormal、ThreadPriority.Normal、ThreadPriority.BelowNormal和ThreadPriority.Lowest。从它们的名UC我们自然可以知道它们的优先程度,所以这里就不多作介l了?nbsp;
U程的默认优先为ThreadPriority.Normal。理ZQ具有相同优先的线E会获得相同的CPU旉Q不q在实际执行Ӟ消息队列中的U程d或是操作pȝ的优先的提高等原因会导致具有相同优先的线E会获得不同的CPU旉。不q从M上来考虑仍可以忽略这U差异。你可以通过以下的方法来改变一个线E的优先U?nbsp;
thread.Priority = ThreadPriority.AboveNormal;
或是Q?nbsp;
thread.Priority = ThreadPriority.BelowNormal;
通过上面的第一句语句你可以提高一个线E的优先U,那么该线E就会相应的获得更多的CPU旉Q通过W二句语句你侉K低了那个U程的优先Q于是它׃被分配到比原来少的CPU旉了。你可以在一个线E开始运行前或是在它的运行过E中的Q何时候改变它的优先。理Z你还可以L的设|每个线E的优先U,不过一个优先q高的线E往往会媄响到其他U程的运行,甚至影响到其他程序的q行Q所以最好不要随意的讄U程的优先?nbsp;
挂vU程和重新开始线E?nbsp;
Threadcd别提供了两个Ҏ来挂LE和重新开始线E,也就是Thread.Suspend能暂停一个正在运行的U程Q而Thread.Resume又能让那个线El运行。不像Windows内核Q?Net框架是不记录U程的挂h数的Q所以不你挂vU程q几ơ,只要一ơ调用Thread.Resume可以让挂v的线E重新开始运行?nbsp;
Threadc还提供了一个静态的Thread.SleepҎQ它能一个线E自动的挂v一定的旉Q然后自动的重新开始。一个线E能在它自n内部调用Thread.SleepҎQ也能在自n内部调用Thread.SuspendҎQ可是一定要别的U程来调用它的Thread.ResumeҎ才可以重新开始。这一Ҏ不是很容易想通的啊?下面的例子显CZ如何q用Thread.SleepҎQ?nbsp;
while (ContinueDrawing) {
DrawNextSlide ();
Thread.Sleep (5000);
}
l止U程
在托的代码中,你可以通过以下的语句在一个线E中另一个线E终止掉Q?nbsp;
thread.Abort ();
下面我们来解释一下AbortQ)Ҏ是如何工作的。因为公用语aq行时管理了所有的托管的线E,同样它能在每个线E内抛出异常。AbortQ)Ҏ能在目标U程中抛Z个ThreadAbortException异常从而导致目标线E的l止。不qAbortQ)Ҏ被调用后Q目标线E可能ƈ不是马上q止了。因为只要目标线E正在调用非托管的代码而且q没有返回的话,该线E就不会立即l止。而如果目标线E在调用非托的代码而且陷入了一个死循环的话Q该目标U程根本不会终止。不q这U情况只是一些特例,更多的情冉|目标U程在调用托的代码Q一旦AbortQ)被调用那么该U程q即终止了?nbsp;
在实际应用中Q一个线E终止了另一个线E,不过往往要等那个U程完全l止了它才可以l运行,q样的话我们应该用到它的JoinQ)Ҏ。示例代码如下:
thread.Abort (); // 要求l止另一个线E?nbsp;
thread.Join (); // 只到另一个线E完全终止了Q它才l运?nbsp;
但是如果另一个线E一直不能终止的话(原因如前所qͼQ我们就需要给JoinQ)Ҏ讄一个时间限ӞҎ如下Q?nbsp;
thread.Join (5000); // 暂停5U?nbsp;
q样Q在5U后Q不那个线E有没有完全l止Q本U程强行运行了。该Ҏq返回一个布型的|如果是true则表明那个线E已l完全终止了Q而如果是false的话Q则表明已经过了时间限制了?nbsp;
旉U程
.Net框架中的Timercd以让你用时钟线E,它是包含在System.Threading名字I间中的Q它的作用就是在一定的旉间隔后调用一个线E的Ҏ。下面我l大家展CZ个具体的实例Q该实例?Uؓ旉间隔Q在控制C输出不同的字W串Q代码如下:
using System;
using System.Threading;
class MyApp
{
private static bool TickNext = true;
public static void Main ()
{
Console.WriteLine ("Press Enter to terminate...");
TimerCallback callback = new TimerCallback (TickTock);
Timer timer = new Timer (callback, null, 1000, 1000);
Console.ReadLine ();
}
private static void TickTock (object state)
{
Console.WriteLine (TickNext ? "Tick" : "Tock");
TickNext = ! TickNext;
}
}
从上面的代码中,我们知道W一个函数回调是?000毫秒后才发生的,以后的函数回调也是在每隔1000毫秒之后发生的,q是由Timer对象的构造函C的第三个参数所军_的。程序会?000毫秒的时间间隔后不断的生新U程Q只到用戯入回车才l束q行。不q值得注意的是Q虽然我们设|了旉间隔?000毫秒Q但是实际运行的时候往往q不能非常精。因为Windows操作pȝq不是一个实时系l,而公用语aq行时也不是实时的,所以由于线E调度的千变万化Q实际的q行效果往往是不能精到毫秒U的Q但是对于一般的应用来说那已l是_的了Q所以你也不必十分苛求?nbsp;
结
本文介绍了在.Net下进行多U程~程所需要掌握的一些基本知识。从文章中我们可以知道在.Net下进行多U程~程相对以前是有了大大的化,但是其功能ƈ没有被削弱。用以上的一些基本知识,读者就可以试着~写.Net下的多线E程序了。不q要~写出功能更加强大而且Bug的多线E应用程序,读者需要掌握诸如线E同步、线E池{高U的多线E编E技术。读者不妨参考一些操作系l方面或是多U程~程斚w的技术丛书?
]]>
]]>
]]>
其中LIKE ';%?'明显多了个分?#8220;;”Q这q能搜烦得出来么Q估计是~辑器编译的~故?br>
======重新~辑文如下:
在进行数据库查询Ӟ有完整查询和模糊查询之分?br>
一般模p语句如下:
SELECT 字段 FROM ?WHERE 某字D?Like 条g
其中关于条gQSQL提供了四U匹配模式:
1Q?Q表CZQ?个或多个字符。可匚wLcd和长度的字符Q?font color=#666>有些情况下若是中文,请用两个百分号Q?%Q表C?/font>?br>
比如 SELECT * FROM [user] WHERE u_name LIKE '%?'
会把u_name?#8220;张三”Q?#8220;张猫?#8221;?#8220;三脚?#8221;Q?#8220;唐三?#8221;{等?#8220;?#8221;的记录全扑և来?br>
另外Q如果需要找出u_name中既?#8220;?#8221;又有“?#8221;的记录,请用and条g
SELECT * FROM [user] WHERE u_name LIKE '%?' AND u_name LIKE '%?'
若?SELECT * FROM [user] WHERE u_name LIKE '%??'
虽然能搜索出“三脚?#8221;Q但不能搜烦出符合条件的“张猫?#8221;?br>
2Q_Q?表示L单个字符。匹配单个Q意字W,它常用来限制表达式的字符长度语句Q?br>
比如 SELECT * FROM [user] WHERE u_name LIKE '_三_'
只找?#8220;唐三?#8221;q样u_nameZ个字且中间一个字?#8220;?#8221;的;
再比?SELECT * FROM [user] WHERE u_name LIKE '三__';
只找?#8220;三脚?#8221;q样nameZ个字且第一个字?#8220;?#8221;的;
3Q[ ]Q表C括号内所列字W中的一个(cM正则表达式)。指定一个字W、字W串或范_要求所匚w对象为它们中的Q一个?br>
比如 SELECT * FROM [user] WHERE u_name LIKE '[张李王]?
找?#8220;张三”?#8220;李三”?#8220;王三”Q而不?#8220;张李王三”Q;
?[ ] 内有一pd字符Q?1234、abcde之类的)则可略写?#8220;0-4”?#8220;a-e”
SELECT * FROM [user] WHERE u_name LIKE '老[1-9]'
找?#8220;?”?#8220;?”?#8230;…?#8220;?”Q?br>
4Q[^ ] Q表CZ在括h列之内的单个字符。其取值和 [] 相同Q但它要求所匚w对象为指定字W以外的M个字W?br>
比如 SELECT * FROM [user] WHERE u_name LIKE '[^张李王]?
找Z?#8220;?#8221;?#8220;?#8221;?#8220;?#8221;?#8220;赵三”?#8220;孙三”{;
SELECT * FROM [user] WHERE u_name LIKE '老[^1-4]';
排?#8220;?”?#8220;?”Q寻?#8220;?”?#8220;?”?#8230;…
5Q查询内容包含通配W时
׃通配W的~故Q导致我们查询特D字W?#8220;%”?#8220;_”?#8220;[”的语句无法正常实玎ͼ而把Ҏ字符?#8220;[ ]”括v便可正常查询。据此我们写Z下函敎ͼ
function sqlencode(str)
str=replace(str,"[","[[]") '此句一定要在最?br>str=replace(str,"_","[_]")
str=replace(str,"%","[%]")
sqlencode=str
end function
在查询前待查字W串先经该函数处理即可?
]]>
]]>
3、获取编辑行的关键字
4、删除一行,获取关键字。这个地方还是用rowdeleting 事g?
5、删除前提示关键字,不仅仅是提示“确认删除吗Q?而是提示“确认删除关键字?**的数据吗Q?
6、显C页?
昄늠要在aspx代码里填入几行数据,上面的代码已l有?重新写一下:
阅读全文
]]>
ASP 1.1化ؓQ?L了类型指? Eval通过反射实现Q本文不再阐q?
<%# DataBinder.Eval(Container.DataItem, "ProductName").ToString() %>
ASP 2.0又简化ؓQ去掉了Container局部变量:
<%# Eval("ProductName") %>
那么QPage.Eval()又是如何知道"ProductName"是那个数据的属性呢Q即Container.DataItem真的消失了吗Q?br>
Eval()是Page的父cTemplateControl的方?br> TemplateControl.Eval()可以自动计算出Container, 机制是从一个dataBindingContext:Stack堆栈来获取?br>
1. 建立DataItem Container 栈:
在Control.DataBind()中,建立Q这样可以保证子控g的DataItem Container始终在栈?br>
public class Control
{
protected virtual void DataBind(bool raiseOnDataBinding)
{
bool foundDataItem = false;
if (this.IsBindingContainer)
{
object o = DataBinder.GetDataItem(this, out foundDataItem);
if (foundDataItem)
Page.PushDataItemContext(o); <-- DataItem压入堆栈
}
try
{
if (raiseOnDataBinding)
OnDataBinding(EventArgs.Empty);
DataBindChildren(); <-- l定子控?br> }
finally
{
if (foundDataItem)
Page.PopDataItemContext(); <-- DataItem弹出堆栈
}
}
}
2. 获取DataItem Container
public class Page
{
public object GetDataItem()
{
...
return this._dataBindingContext.Peek(); <-- d堆栈剙的DataItem ContainerQ就是正在绑定的DataItem Container
}
}
3. TemplateControl.Eval()
public class TemplateControl
{
protected string Eval (string expression, string format)
{
return DataBinder.Eval (Page.GetDataItem(), expression, format);
}
}
l论Q从上面看出Page.Eval()在计的时候还是引用了Container.DataItemQ只不过q个DataItem通过DataItem Container堆栈自动计算出来的。我认ؓPage.Eval()看似把问题简化了Q其实把问题搞得更加秘?/p>
异常详细信息: System.Web.HttpException: GridView“GridView1”Ȁ发了未处理的事g“PageIndexChanging”?/p>
源错?
执行当前 Web h期间生成了未处理的异常。可以用下面的异常堆栈跟踪信息定有关异常原因和发生位|的信息?nbsp;
堆栈跟踪:
[HttpException (0x80004005): GridView“GridView1”Ȁ发了未处理的事g“PageIndexChanging”。]
System.Web.UI.WebControls.GridView.OnPageIndexChanging(GridViewPageEventArgs e) +324
System.Web.UI.WebControls.GridView.HandlePage(Int32 newPage) +110
System.Web.UI.WebControls.GridView.HandleEvent(EventArgs e, Boolean causesValidation, String validationGroup) +516
System.Web.UI.WebControls.GridView.RaisePostBackEvent(String eventArgument) +213
System.Web.UI.WebControls.GridView.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +31
System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +32
System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +244
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +3837
--------------------------------------------------------------------------------
版本信息: Microsoft .NET Framework 版本:2.0.50727.42; ASP.NET 版本:2.0.50727.42
ASP.NET的CS代码:
using System;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Collections;
public partial class _Default : System.Web.UI.Page
{
string zhumin = ConfigurationSettings.AppSettings["ConnectionString"].ToString();
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
BindDataGrid();
IsFirstLastPage();
}
}
private void BindDataGrid()
{
SqlConnection MyConnection = new SqlConnection(zhumin);
String cmdText = "SELECT * FROM Orders";
SqlDataAdapter da = new SqlDataAdapter(cmdText,MyConnection);
MyConnection.Open();
DataSet ds = new DataSet();
da.Fill(ds);
GridView1.DataSource = ds;
GridView1.DataBind();
MyConnection.Close();
}
protected void GridView1_PageIndexChanged(object source,System.Web.UI.WebControls.DataGridPageChangedEventArgs e)
{
GridView1.PageIndex = e.NewPageIndex;
BindDataGrid();
}
protected void PageCut_Click(object sender, EventArgs e)
{
String commangArg = ((LinkButton)sender).CommandArgument;
switch (commangArg)
{
case "First":
{
GridView1.PageIndex = 0;
break;
}
case "Prev":
{
GridView1.PageIndex = (int)Math.Max(0,GridView1.PageIndex - 1);
break;
}
case "Next":
{
GridView1.PageIndex = (int)Math.Min(GridView1.PageCount - 1, GridView1.PageIndex + 1);
break;
}
case "Last":
{
GridView1.PageIndex = GridView1.PageCount - 1;
break;
}
default:
{
break;
}
}
BindDataGrid();
IsFirstLastPage();
}
private void IsFirstLastPage()
{
if (GridView1.PageCount > 0)
{
if (GridView1.PageCount != 1)
{
if (GridView1.PageIndex == 0)
{
LinkButton2.Enabled = false;
}
else
{
LinkButton2.Enabled = true;
}
if (GridView1.PageIndex == GridView1.PageCount - 1)
{
LinkButton3.Enabled = false;
}
else
{
LinkButton3.Enabled = true;
}
}
else
{
LinkButton2.Enabled = false;
LinkButton3.Enabled = false;
}
}
else
{
LinkButton1.Enabled = false;
LinkButton2.Enabled = false;
LinkButton3.Enabled = false;
LinkButton4.Enabled = false;
}
}
}
最后是我的ASPX代码:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>无标题页</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<center>
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" BackColor="Yellow"
ForeColor="Black" Width="372px" AllowPaging="True">
<Columns>
<asp:BoundField DataField="OrderID" HeaderText="员工QD" />
<asp:BoundField DataField="EmployeeID" HeaderText="֮QD" />
<asp:BoundField DataField="ShipVia" HeaderText="QhipQD" />
</Columns>
</asp:GridView>
</center>
<br />
<br />
<center style="text-align: left">
<asp:LinkButton ID="LinkButton1" runat="server" CommandArgument="First">首页</asp:LinkButton>
<asp:LinkButton ID="LinkButton2" runat="server" CommandArgument="Prev">上一?lt;/asp:LinkButton>
<asp:LinkButton ID="LinkButton3" runat="server" CommandArgument="Next">下一?lt;/asp:LinkButton>
<asp:LinkButton ID="LinkButton4" runat="server" CommandArgument="Last">N</asp:LinkButton></center>
</div>
</form>
</body>
</html>
如果已经安装了以前版本的 Visual Studio 2005Q如 Visual Studio Team Suite、Visual Studio 标准版或 Visual Studio 专业版的试?2 或社区技术预?(CTP) 版本Q则必须严格按照以下所C顺序卸载,然后才能开始安装Q何版本的 Visual Studio 2005Q?
//创徏一?span>SqlConnection string SQL_Select = "select id, ItemName from DDLItem order by id desc"; //构造一?span>SqlDataAdapter SqlDataAdapter myAdapter = new SqlDataAdapter( SQL_Select, //开始读取数?/span> Conn.Open(); DataSet dataSet = new DataSet(); myAdapter.Fill( dataSet,"Table1" ); Conn.Close(); //开始绑?span>DropDownList //指定DropDownList使用的数据源 DropDownList1.DataSource = dataSet.Tables["Table1"].DefaultView; //指定DropDownList使用的表里的那些字段 DropDownList1.DataTextField = "ItemName"; //dropdownlist?span>Text的字D?/span> DropDownList1.DataValueField = "id";//dropdownlist?span>Value的字D?/span> DropDownList1.DataBind(); } Response.Write("<script language='javascript'>alert('数据已被保存!');</script>"); //加入鼠标滑过的高亮效?br> if (e.Row.RowType == DataControlRowType.DataRow)//判定当前的行是否属于datarowcd的行 Free版本的收费版本的区别可以看这里:http://freetextbox.com/features/ <%@ Page Language="C#" ContentType="text/html"%> 其实在ASP.Net~程中,不用调用md5.asp来加密数据。在DotNet中有自带的类QSystem.Web.Security.HashPasswordForStoringInConfigFile() public string md5(string str,int code) 转蝲Q?/strong> 1.加密?/strong> Response.Redirect("DetailInfo.aspx?id=" + Convert.ToBase64String(System.Text.Encoding.Default.GetBytes("sp10006")).Replace("+","%2B")); 2.解密?/strong> string ID = System.Text.Encoding.Default.GetString(Convert.FromBase64String(Request.QueryString["id"].ToString().Replace("%2B","+")));
]]>
标注的是主键的字D?
阅读全文
]]>
sdr.Fill(ds,"users");
if (ds.Tables["users"].Rows.Count > 0)
或?
DataSet1.Tables.Rows.Count 阅读全文
]]>
btnClick.Attributes.Add("onclick", "return confirm('Are you sure?');"); 阅读全文
]]>
con.Open();
SqlCommand cmd = new SqlCommand(strSql,con);
SqlDataReader dr = cmd.ExecuteReader();
while (dr.Read())
{
DropDownList1.Items.Add(new ListItem(dr["status"].ToString(), dr["status_Id"].ToString()));
}
]]>
Width="542px" AllowPaging="True" AllowSorting="True"
DataKeyNames="DB31_1,DB31_2" OnRowCancelingEdit="GridView1_RowCancelingEdit" OnRowDeleting="GridView1_RowDeleting" OnRowEditing="GridView1_RowEditing" OnRowUpdating="GridView1_RowUpdating" OnPageIndexChanging="GridView1_PageIndexChanging" OnRowDataBound="GridView1_RowDataBound" OnSelectedIndexChanged="GridView1_SelectedIndexChanged" OnSorting="GridView1_Sorting" >
<Columns>
<asp:TemplateField HeaderText="序号">
<ItemTemplate>
<%# this.GridView1.PageIndex * this.GridView1.PageSize + this.GridView1.Rows.Count + 1%>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="学历代码" SortExpression="DB1_1">
<EditItemTemplate>
<%--<asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("DB1_1") %>'></asp:TextBox>--%>
<asp:DropDownList ID ="ddlXL" runat="server" DataValueField='<%# Bind("DB1_1") %>'></asp:DropDownList>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<%# Bind("xueliText") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="学历名称" SortExpression="DB1_2">
<EditItemTemplate>
<asp:TextBox ID="TextBox2" runat="server" Text='<%# Bind("DB1_2") %>'></asp:TextBox>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label2" runat="server" Text='<%# Bind("DB1_2") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="操作" ShowHeader="False">
<EditItemTemplate>
<asp:LinkButton ID="LinkButton1" runat="server" CausesValidation="True" CommandName="Update"
Text="更新"></asp:LinkButton>
<asp:LinkButton ID="LinkButton2" runat="server" CausesValidation="False" CommandName="Cancel"
Text="取消"></asp:LinkButton>
</EditItemTemplate>
<ItemTemplate>
<asp:LinkButton ID="LinkButton1" runat="server" CausesValidation="False" CommandName="Edit"
Text="~辑" OnClientClick="return confirm('认要编辑吗Q?);"></asp:LinkButton>
<asp:LinkButton ID="LinkButton3" runat="server" CausesValidation="False" CommandName="Delete"
Text="删除" OnClientClick="return confirm('认要删除吗Q?);"></asp:LinkButton>
<asp:LinkButton ID="LinkButton2" runat="server" CausesValidation="False" CommandName="Select"
Text="选择"></asp:LinkButton>
</ItemTemplate>
</asp:TemplateField>
</Columns>
<AlternatingRowStyle BackColor="Aquamarine" />
</asp:GridView>
/// <summary>
/// l定数据到GridView
/// </summary>
private void GridViewBind()
{
?a >数据?/font>
string strSql = "SELECT * FROM DB1";
得到数据?br> this.GridView1.DataSource=conn.GetDs(strSql).Tables[0].DefaultView;
this.GridView1.DataBind();
}
/// <summary>
/// ~辑当前?br> /// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e)
{
GridView1.EditIndex = e.NewEditIndex;
//当前~辑行背景色高亮
this.GridView1.EditRowStyle.BackColor = Color.FromName("#F7CE90");
GridViewBind();
}
/// <summary>
/// 取消~辑状?br> /// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void GridView1_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
{
GridView1.EditIndex = -1;
GridViewBind();
}
/// <summary>
/// 删除记录q程
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)
{
//得到单位~号
string rowToDelete = GridView1.DataKeys[e.RowIndex].Values[0].ToString();
//转换为整?br> //int ID=Convert.ToInt32(rowToDelete);
//?strong class=kgb onmouseover='isShowAds = true;isShowAds2 = true;ads.Move(this,"","%u6700%u5F3A%u7684%u6570%u636E%u5E93%uFF01%u6765%u81EA%u5FAE%u8F6F","20650","数据?,"%u6570%u636E%u5E93","http%3A//go.microsoft.com/%3Flinkid%3D6331217", event)' style="FONT-WEIGHT: normal; CURSOR: hand; COLOR: #0000ff; TEXT-DECORATION: underline" onclick='javascript:window.open("http://s3.17luntan.com/ClickPortal/WebClick.aspx?id=20650&k=%u6570%u636E%u5E93&siteid=b2cbdffd-bcbf-4415-a129-3344f19a46a3&url=http%3A//www.sxsky.cn/it/html/200672026657.htm&gourl=http%3A//go.microsoft.com/%3Flinkid%3D6331217&parm=1F3B79A61F6BC47108CB35D7933E8B153E88870C86CE9FAC&alliedsiteid=0");' onmouseout="isShowAds = false;isShowAds2 = false">数据?/strong>中删?/span>
string str = "DELETE FROM DB1 where DB1_1=" + "'" + rowToDelete + "'" + "";
try
{
conn.RunSql(str);
//重新l定数据
GridViewBind();
}
catch (Exception ex)
{
Response.Write("数据库错误,错误原因Q? + ex.Message);
Response.End();
}
/// <summary>
/// 更新记录q程
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
string ID = GridView1.DataKeys[e.RowIndex].Values[0].ToString();
string DB1_1 = ((TextBox)GridView1.Rows[e.RowIndex].FindControl("TextBox1")).Text;
//string DB1_2 = ((TextBox)GridView1.Rows[e.RowIndex].FindControl("TextBox2")).Text;
string DB1_2 = (((DropDownList))GridView1.Rows[e.RowIndex].FindControl("ddlXL")).SelectedItem.Text;
//判断表单Ҏ否有Iƈl出提示信息
if (DB1_1 == "" || DB1_2 == "")
{
conn.Alert("误入完整信息!", Page);
return;
}
try
{
conn.BuilderEdit("select * from DB1 where DB1_1 ='" + ID + "'");
conn.dr["DB1_1"] = DB1_1;
conn.dr["DB1_2"] = DB1_2;
conn.BuilderEditClose();
}
catch (OracleException err)
{
if (err.Code.ToString() == "1")
conn.Alert("错误Q已存在h相同主键的记?, Page);
else
conn.Alert("错误Q未能添加记?, Page);
}
//q回览状?br> GridView1.EditIndex = -1;
GridViewBind();
}
/// <summary>
/// 分页事g
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
GridView1.PageIndex = e.NewPageIndex;
GridViewBind();
}
/// <summary>
/// 加入鼠标效果及ؓDropDownListl定?/span>
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
//为DropDownListl定?br> if (((DropDownList)e.Row.FindControl("ddlXL")) != null)
{
DropDownList ddlXL = (DropDownList)e.Row.FindControl("ddlXL");
ddlXL.Items.Clear();
ddlXL.Items.Add(new ListItem("博士", "1"));
ddlXL.Items.Add(new ListItem("士", "2"));
ddlXL.Items.Add(new ListItem("学士", "3"));
}
{
//当鼠标放上去的时?先保存当前行的背景颜?q给附一颜色
e.Row.Attributes.Add("onmouseover", "currentcolor=this.style.backgroundColor;this.style.backgroundColor='yellow',this.style.fontWeight='';");
//当鼠标离开的时?背景颜色还原的以前的颜?br> e.Row.Attributes.Add("onmouseout", "this.style.backgroundColor=currentcolor,this.style.fontWeight='';");
}
//单击行改变行背景颜色
if (e.Row.RowType == DataControlRowType.DataRow)
{
e.Row.Attributes.Add("onclick", "this.style.backgroundColor='#99cc00'; this.style.color='buttontext';this.style.cursor='default';");
}
}
]]>
]]>
[原文源码下蝲]
[译者改后源码下载]
[译]在GridView中针寚w标单ȝ某一独立单元D行编?br>原文发布日期Q?007.04.07
作者:Declan Bright
译Q?a target=_blank>webabcd
介绍
ASP.NET的GridView控g允许你通过讄它的EditIndex属性来~辑数据行,此时整个数据行都处于~辑模式?nbsp;如果你在EditItemTemplate的一些列中用了DropDownList控gQ那么你也许不希望整个数据行都处于编辑模式?nbsp;因ؓQ如果每一个DropDownList控g都有很多选项的话Q那么一ơ加载所有DropDownList控g的所有选项׃D面执行~慢?nbsp;
另外Q如果你的数据行的编辑模式需要占用更多的I间的话Q那么针Ҏ一个独立的单元D行编辑要优于针对整个数据行进行编辑?nbsp;q里Q我示范如何实现这L功能Q又如何d理事仉证(event validationQ?nbsp;
背景
本文Z我之前写的一文章:GridView和DataList响应单击数据行和双击数据行事?/font>。如果你不知道如何让GridView响应单击数据行事Ӟ那么你可以在阅读本文之前先看看这文章?nbsp;
~辑某一个独立的GridView单元根{?/strong>
我所演示的这个GridView有一个不可见的asp:ButtonField控gQ它处于GridView的第一列,名ؓ“SingleClick”?nbsp;它用于给GridView的数据行增加单击事g?nbsp;
<asp:ButtonField Text="SingleClick" CommandName="SingleClick" Visible="False" />
</Columns>
其它每一列的ItemTemplate中有一个可见的Label控g和一个不可见的TextBox或DropDownList控g?nbsp;Z方便Q我们称Label为显C控ӞTextBox或DropDownList为编辑控件?br>
<ItemTemplate>
<asp:Label ID="DescriptionLabel" runat="server" Text='<%# Eval("Description") %>'></asp:Label>
<asp:TextBox ID="Description" runat="server" Text='<%# Eval("Description") %>' Width="175px" visible="false"></asp:TextBox>
</ItemTemplate>
</asp:TemplateField>
q里的办法就是用昄控g来显C数据,当单元格所包含的显C控件被单击的时候,则把昄控g的Visible属性设|ؓfalseq且把编辑控件的Visible属性设|ؓtrue?nbsp;q里不用使用EditItemTemplat?nbsp;
在RowDataBound事g内@环ؓ每一数据行的每一单元格增加单M件?nbsp;使用单元格在数据行中的烦引作Z件参敎ͼq样在单元格触发了单M件后我们可以知道到底是哪个单元D单击了?nbsp;
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
// 从第一个单元格内获得LinkButton控g
LinkButton _singleClickButton = (LinkButton)e.Row.Cells[0].Controls[0];
// q回一个字W串Q表C对包含目标控g?nbsp;ID 和事件参数的回发函数?nbsp;JavaScript 调用
string _jsSingle = ClientScript.GetPostBackClientHyperlink(_singleClickButton, "");
// l每一个可~辑的单元格增加事g
for (int columnIndex = _firstEditCellIndex; columnIndex < e.Row.Cells.Count; columnIndex++)
{
// 增加列烦引作Z件参?br> string js = _jsSingle.Insert(_jsSingle.Length - 2, columnIndex.ToString());
// l单元格增加onclick事g
e.Row.Cells[columnIndex].Attributes["onclick"] = js;
// l单元格增加鼠标l过时指针样?br> e.Row.Cells[columnIndex].Attributes["style"] += "cursor:pointer;cursor:hand;";
}
}
}
在RowCommand事g内读出命令参数和事g参数?nbsp;q会告诉我们被选中的行和列的烦引?nbsp;
int _columnIndex = int.Parse(Request.Form["__EVENTARGUMENT"]);
因ؓ知道了被选中的行和列的烦引,所以可以通过把显C控件的Visible讄为falseQ编辑控件的Visible讄为true来把某个独立的单元格讄为编辑模式?nbsp;然后通过清除单元格的属性来删除被选中单元格的单击事g?nbsp;
_displayControl.Visible = false;
// 获得被选中单元格的~辑控gq设|其可见
Control _editControl = _gridView.Rows[_rowIndex].Cells[_columnIndex].Controls[3];
_editControl.Visible = true;
// 清除被选中单元格属性以删除click事g
_gridView.Rows[_rowIndex].Cells[_columnIndex].Attributes.Clear();
下面有一些代码用于回发服务器后设|焦点到~辑控gQ如果编辑控件是DropDownList的话Q那么它的SelectedValue要设|ؓ昄控g的|如果~辑控g是TextBox的话Q那么ؓ了做好编辑的准备p使它的文本被选中?nbsp;
"<script>document.getElementById('" + _editControl.ClientID + "').focus();</script>");
// 如果~辑控g是DropDownList的话
// SelectedValue讄为显C控件的?br> if (_editControl is DropDownList && _displayControl is Label)
{
((DropDownList)_editControl).SelectedValue = ((Label)_displayControl).Text;
}
// 如果~辑控g是TextBox的话则选中文本框内文本
if (_editControl is TextBox)
{
((TextBox)_editControl).Attributes.Add("onfocus", "this.select()");
}
在这个Demo中,我把事g被触发的历史记录也写C里?nbsp;
如果GridView处于~辑模式的话Q那么要在RowUpdating事g里去查找被选中行的每一个单元格?nbsp;如果发现单元格处于编辑模式的话,那么p?#8220;更新”代码?nbsp;在这个Demo中,数据保存在DataTable里,而这个DataTable则储存在session中?nbsp;
{
// 获得单元格的~辑控g
Control _editControl = _gridView.Rows[e.RowIndex].Cells[i].Controls[3];
if (_editControl.Visible)
{
. update the data
}
}
Z保RowUpdating事g在编辑单元格后被Ȁ发,要在Page_Load中来触发q个事g?nbsp;~辑了TextBox后,通过按回车键或者单d一单元格来佉K面做回发处理Q下面的q段代码是用于保M数据的改变都会被更新?br>
{
this.GridView1.UpdateRow(this.GridView1.SelectedIndex, false);
}
Z验证而注册回发和回调数据
在RowDataBound中创建的自定义事件必要在页中注册?nbsp;通过重写RenderҎ来调用ClientScriptManager.RegisterForEventValidation?nbsp;通过GridViewRow.UniqueIDq回行的唯一IDQ按U的唯一ID通过在行的唯一ID后附?#8220;$ct100”而生成?nbsp;
{
foreach (GridViewRow r in GridView1.Rows)
{
if (r.RowType == DataControlRowType.DataRow)
{
for (int columnIndex = _firstEditCellIndex; columnIndex < r.Cells.Count; columnIndex++)
{
Page.ClientScript.RegisterForEventValidation(r.UniqueID + "$ctl00", columnIndex.ToString());
}
}
}
base.Render(writer);
}
q将防止M“回发或回调参数无?#8221;的错误?br>
q个Demo中的其它CZ
使用SQL数据源控件编辑某一独立的GridView单元?br>用SqlDataSouce控g实现q个技术需要对GridView的RowUpdating事g做一些修攏V?nbsp;当更新GridView的行的时候,SqlDataSource控g一般要把|valuesQ从EditItemTemplate转移到NewValues集合里?nbsp;因ؓ我们没有使用EditItemTemplateQ所以这U情况下|valuesQ不会自动地转移到NewValues集合里?nbsp;
e.NewValues.Add(key, value);
我在App_Data文g夹下使用了一个简单的SQL Server Express数据库?nbsp;Q要使用你自q数据库的话,你可以修改web.config里的q接字符Ԍ
使用对象数据源控件编辑某一独立的GridView单元?br>本示例用了App_Code文g夹内的两个类Q?br> ·Task.cs – d对象
·TaskDataAccess.cs – 理d对象
Aspx늚后置代码与SQL Data SourceCZ是一L?nbsp;ObjectDataSource通过TaskDataAccess.csc里的GetTasks和UpdateTaskҎ来管理数据?nbsp;
有着电子数据表样式的GridView
q里有一个与电子数据表的样式很像的GridView?nbsp;Q虽然它看v来像一个电子数据表Q但是ƈ不是真的有像电子数据表一L功能Q它仍然是一个GridView。)
q里虽然有一些单d改变单元格样式的附加代码Q但是主要的代码q是与上面所q是相同的?br>
用SQL数据源控件实现有着电子数据表样式的GridView
本示例与上面的基本相同,但是它修改了GridView的RowUpdating事g以其允许用SqlDataSource控g来工作?br>
参?/strong>
·GridView和DataList响应单击数据行和双击数据行事?/font>
·ASP.NET 2.0数据教程
l论
如果你想在GridView中一ơ只针对一个单元格q行~辑Q那么这个方法将会对你有所帮助?br>
译者注Q事仉证(EventValidationQ。出于安全目的,此功能验证回发或回调事g的参数是否来源于最初呈现这些事件的服务器控件。如果数据有效ƈ且是预期的,则用ClientScriptManager.RegisterForEventValidationҎ来注册回发或回调数据以进行验证?br> 点击下蝲此文?/font>
]]>
]]>
1.1 取当前年月日时分U?
currentTime=System.DateTime.Now;
阅读全文
]]>
~号
Ҏ名称
功能描述
1
NextQ)
q回一?~2147483647之间的整?
2
NextQiQ?
q回一?~i之间的整?
3
NextQiQjQ?
q回一个i~j之间的整?
4
NextdoubleQ)
q回一?~1之间的随机小?
5
NextdoubleQ? byteQ)Q?
?~255之间的随机整C为字节数l各元素的倹{?
阅读全文
]]>
]]>
]]>
]]>
1。下载最新版FreeTextBox(版本3.1.6),解压
FreeTextBox 3.1.6 (2006/07/18)
博客园本C载: http://www.cnblogs.com/Files/cleo/FTBv3-1-6.zip
作者网站下载地址Qhttp://freetextbox.com/download/
详细版本有哪些改q和修改历史可以看这里:http://freetextbox.com/download/changelog.aspx
* BUG: Firefox postback problems (due to IE specific code)
* CHANGE: createlink now requires text to be selected
* BUG: FontSizesMenuList now functions correctly
* BUG: IE users would see the tag path of the entire document
* BUG: WordClean fix for <b> tags
* BUG: bug in FF vs. IE DOM handling of extra \n tag
2。打开ASP.Net2.0目Q添加引用。(如果dq以前版本的FreeTextBoxQ先删除以前版本的引用)
2.1。拷贝ftb.imagegallery.aspxC要用FreeTextBox的目录(当然可以是其他,但是可能要设|\径)
3。将FreeTextBoxd到工h。(工具栏〉常规〉选择V浏览到DLL文gQ添加)
4。可以将工具栏上的控件拖入到你的面?br>
runat="server" Text='<%# Bind("Contents") %>'
ButtonDownImage="True"
ToolbarLayout="ParagraphMenu,FontFacesMenu,FontSizesMenu,FontForeColorsMenu|Bold,Italic,Underline,Strikethrough;Superscript,Subscript,RemoveFormat|JustifyLeft,JustifyRight,JustifyCenter,JustifyFull;BulletedList,NumberedList,Indent,Outdent;CreateLink,Unlink,InsertImage,InsertImageFromGallery,InsertRule|Cut,Copy,Paste;Undo,Redo,Print">
</FTB:FreeTextBox>
4.1。修改ImageGalleryPath属性ؓ你图片的攄目录?br>5。Q&A
5.1。QQ怎么不能新徏目录Q上传文件等Q?br> AQ修改ftb.imagegallery.aspx面可以做到
SupportFolder="~/aspnet_client/FreeTextBox/"
AllowImageDelete="true" AllowImageUpload="true"
AllowDirectoryCreate="true" AllowDirectoryDelete="true" runat="Server" />
修改AllowImageDelete{属?br>5.2。QQ怎么没有看到“从图片库插入囄”q个图标Q?br> AQ修?lt;FTB:FreeTextBox />的ToolbarLayout属性,d一个InsertImageFromGalleryQ上面代码的例子是已经d好的?br>5.3。QQ按钮怎么是英文提C?
AQ?lt;FTB:FreeTextBox />有个属性叫做LanguageQ把默认的en-US改称zh-CN吧,是中文体了Q听说这个版本带?5U语a呢?br>
新增博客园本C载: http://www.cnblogs.com/Files/cleo/FTBv3-1-6.zip
]]>
]]>
<%@ Import Namespace="System"%>
<script language="C#" runat="server">
void Page_Load(Object sender,EventArgs e){
//获取要加密的字段Qƈ转化为Byte[]数组
byte[] data=System.Text.Encoding.Unicode
.GetBytes(source.Text.ToCharArray());
//建立加密服务
System.Security.Cryptography.MD5 md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
//加密Byte[]数组
byte[] result= md5.ComputeHash(data);
//加密后的数l{化ؓ字段
string sResult=System.Text.Encoding.Unicode.GetString(result);
//昄出来
sha1_1.Text="MD5普通加密:"+sResult.ToString()+"<br/>";
//作ؓ密码方式加密
string EnPswdStr=System.Web.Security.FormsAuthentication.
HashPasswordForStoringInConfigFile(source.Text.ToString(),"MD5");
//昄出来
sha1_2.Text="MD5密码加密Q?+EnPswdStr+"<br/>";
}
</script>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>试</title>
</head>
<body>
<h3>SHA1加密</h3>
<form runat="server">
<asp:label id="sha1_1" runat="server"></asp:label>
<asp:label id="sha1_2" runat="server"></asp:label>
<asp:textbox ID="source" runat="server" TextMode="SingleLine" Text="test" AutoPostBack="true" />
Q回车)
</form>
</body>
</html>
{
if(code==16) //16位MD5加密Q取32位加密的9~25字符Q?br>{
return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(str,"MD5").ToLower().Substring(8,16) ;
}
if(code==32) //32位加?br>{
return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(str,"MD5").ToLower();
}
return "00000000000000000000000000000000"; }
单的使用
头文Ӟusing System.Web.Security;
初始化数据库里的字段
string strPwd=FormsAuthentication.HashPasswordForStoringInConfigFile(this.tbox_Pwd.Text,"MD5");ASP.NET中加密与解密QueryString的方?/h2>
]]>
<table cellpadding=10 style="font: 10.5pt 宋体">
<tr>
<td width=1 bgcolor="BD8672"/>
<td valign="top">
<b>书名Q?lt;/b><%# DataBinder.Eval(Container.DataItem, "eat_name") %><br>
<asp:linkbutton CommandName="edit" runat="server" ID="Linkbutton1" NAME="Linkbutton1">
<b>名称Q?lt;/b><%# DataBinder.Eval(Container.DataItem, "eat_name") %>
</asp:linkbutton>
</td>
</tr>
</table>
</ItemTemplate>
<EditItemTemplate>
<table cellpadding=10 style="font: 10.5pt 宋体">
<tr>
<td width=1 bgcolor="BD8672"/>
<td valign="top">
<img align="top" src='<%# DataBinder.Eval(Container.DataItem, "eat_id") %>' >
</td>
<td valign="top">
<b>书名Q?lt;/b><%# DataBinder.Eval(Container.DataItem, "eat_name") %><br>
<b>cdQ?lt;/b><%# DataBinder.Eval(Container.DataItem, "eat_name") %><br>
<b>出版? IDQ?lt;/b><%# DataBinder.Eval(Container.DataItem, "eat_name") %><br>
<b>hQ?lt;/b><asp:TextBox id="edit_price" text='<%# DataBinder.Eval(Container.DataItem, "eat_name") %>' runat="server" />
<p>
<asp:linkbutton CommandName="update" runat="server" ID="Linkbutton2" NAME="Linkbutton2"><img border="0" src="..//images/update_book.gif" ></asp:linkbutton>
<asp:linkbutton CommandName="cancel" runat="server" ID="Linkbutton3" NAME="Linkbutton3"><img border="0" src="..//images/cancel_book.gif" ></asp:linkbutton>
</td>
</tr>
<tr>
<td colspan="2" style="padding-top:15" align="center">
<span id="Span1" EnableViewState="false" style="font: arial 11pt;" runat="server" />
</td>
</tr>
</table>
</EditItemTemplate>
</ASP:DataList>
]]>
]]>
]]>