|
|
2006年4月24日
IIS1.1遇到的问题解决方法 步骤尝试如下:
1.当然先确定一下,是否真的装了1.1的版本,查看路径 C:\WINNT\Microsoft.NET\Framework\v1.1.4322
2.也是很多人都知道,重新安装 aspnet_regiis ,怎么安装,就不多说了,网上很多!
3.重启IIS,重新启动ASP.NET服务程序
4.如果你的Web服务器使用了固定IP:确定你的“Internet信息服务”中使用的是“默认web站点”并且其属性中的IP地址为“(全部未分配)”,而不是你己指定的ip地址。可以修改“默认web站点”的名字,但不要删除,一旦删除,只要在新建的时候,名称严格为“默认web站点”也可以恢复
5.如果你的IE使用了代理的话,把 Bypass Proxy Server for local adresses勾上
6.如果你本身已经有个web站点,请把它卸载掉,不用重新安装vs.net,只要重新安装下iis也可以。
7.如果还是不行,那可真没什么办法了,那就重装IIS,FRAMWORK,.NET,操作系统吧
最后说一个安全问题,尽量不要把IIS指向默认路径C:\Inetpub\wwwroot 这个路径很容易受攻击,最好重新指向一个新的路径,然后把wwwroot文件夹删除掉,需要用户上传文件的,千万要阻止上传“.HTA”文件,做好访问网站的权限,屏蔽执行HTA文件,做好数据库备份工作!
又是工作中的一点经验,供大家参考,少走弯路!
确实是Bug
1.你的Web服务器使用了固定IP:确定你的“Internet信息服务”中使用的是“默认web站点”并且其属性中的IP地址为“(全部未分配)”,而不是你己指定的ip地址。然后在回到VS.NET中重试,或许可以解决。 2.以上方法不能解决问题时,考虑MSDN中的解决办法,如下: Visual Studio .NET 无法确定在 Web 服务器计算机上运行的是否为 ASP.NET 1.1 版。该错误可能在几种不同情况下发生。请检查是否属于以下情况: a, 确保 .NET Framework 1.1 版安装在 Web 服务器计算机上。有关详细信息,请参见 Visual Studio .NET 软件要求。 b, 如果 ASP.NET 已安装在 Web 服务器计算机上,但仍然遇到此错误,则可能是配置问题。为了纠正有问题的安装或配置,可以使用名为 aspnet_regiis 的 ASP.NET 实用工具。在类似如下所示的路径中可以找到此命令行实用工具: C:\WINDOWS\Microsoft.NET\Framework\v1.1.nnnn\ 其中 nnnn 表示四位内部版本号。在最高版本号下查找。使用 /i 开关运行该实用工具: aspnet_regiis /i 提示 您可以从命令的正确目录中直接打开该命令窗口。从 Windows 的“开始”菜单,指向“程序”、“Visual Studio .NET 2003”、“Visual Studio .NET 工具”,然后选择“Visual Studio .NET 命令提示”。在窗口打开后,键入 aspnet_regiis /i。
不需要吧,在程序的vs.net的vs.net tool 的 vs.net command prompt下 输入: aspnet_regiis -r
问题就可以解决了。 仔细的看看 aspnet_regiis 的参数的意义 查询参数 aspnet_regiis /all 会列出所有的参数
运行cmd,然后运行下面的两段命令也可以
C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\aspnet_regiis.exe -i C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\aspnet_regiis.exe -c
2006年2月21日
import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegexBean { Pattern p = null; Matcher m = null; String str1 = "^[0-9]{1,20}$"; //校验是否全由数字组成 String str2 = "^[a-zA-Z]{1}([a-zA-Z0-9]|[._]){4,19}$"; //校验登录名:只能输入5-20个以字母开头、可带数字、“_”、“.”的字串 //String str20="^([0-9]{1}[.]{0,1}[0-9]*)$"; String str3 = "^(\\w){6,20}$"; //校验密码:只能输入6-20个字母、数字、下划线 String str4 = "^[+]{0,1}(\\d){1,3}[ ]?([-]?((\\d)|[ ]){1,12})+$"; //校验普通电话、传真号码:可以“+”开头,除数字外,可含有“-” String str5 = "^[+]{0,1}(\\d){1,3}[ ]?([-]?((\\d)|[ ]){1,12})+$"; //校验手机号码 String str6 = "^[a-zA-Z0-9 ]{3,6}$"; //校验邮政编码 String str7 = "^[0-9.]{1,20}$"; //ip String str8 = "^\\d+$"; //非负整数 String str9 = "^[0-9]*[1-9][0-9]*$"; //正整数 String str10 = "^[A-Za-z]+$"; //由26个英文字母组成的字符串 String str11 = "^\\w+$"; //由数字、26个英文字母或者下划线组成的字符串 String str12 = "^[\\w-]+(\\.[\\w-]+)*@[\\w-]+(\\.[\\w-]+)+$"; //email String str13 = "^[a-zA-z]+://(\\w+(-\\w+)*)(\\.(\\w+(-\\w+)*))*(\\?\\S*)?$"; //url String str14 = "[0-9]{4}\\-[0-9]{1,2}\\-[0-9]{1,2}"; String str15 = "^((((19|20)(([02468][048])|([13579][26]))\\-02\\-29))|((20[0-9][0-9])|(19[0-9][0-9]))\\-((((0[1-9])|(1[0-2]))\\-((0[1-9])|(1\\d)|(2[0-8])))|((((0[13578])|(1[02]))\\-31)|(((01,3-9])|(1[0-2]))\\-(29|30)))))$"; //date 如2004-06-06,非常精确,如2004-06-32可以查出非法!! String str16 = "^(\\d{4})\\-(\\d{2})\\-(\\d{2}) (\\d{2}):(\\d{2}):(\\d{2})$"; //date and time 如2004-11-12 12:10:16 String str17 = "^([\u4e00-\u9fa5]*)";//汉字 public RegexBean() {} public boolean isDate(String str) { p = Pattern.compile(str15); m = p.matcher(str); boolean b = m.matches(); if (b) return true; else return false; } /*public boolean isfloat(String str) { p=Pattern.compile(str20); m=p.matcher(str); boolean b=m.matches(); if(b) return true; else return false; }*/ public boolean isEmail(String str) { p = Pattern.compile(str12); m = p.matcher(str); boolean b = m.matches(); if (b) return true; else return false; } public boolean isDateAndTime(String str) { p = Pattern.compile(str16); m = p.matcher(str); boolean b = m.matches(); if (b) return true; else return false; } public boolean isUserName(String str) { p = Pattern.compile(str2); m = p.matcher(str); boolean b = m.matches(); if (b) return true; else return false; } public boolean isPassword(String str) { p = Pattern.compile(str3); m = p.matcher(str); boolean b = m.matches(); if (b) return true; else return false; } public boolean isPhone(String str) { p = Pattern.compile(str4); m = p.matcher(str); boolean b = m.matches(); if (b) return true; else return false; } public boolean isMobile(String str) { p = Pattern.compile(str5); m = p.matcher(str); boolean b = m.matches(); if (b) return true; else return false; } public boolean isPost(String str) { p = Pattern.compile(str6); m = p.matcher(str); boolean b = m.matches(); if (b) return true; else return false; } public boolean isIP(String str) { p = Pattern.compile(str7); m = p.matcher(str); boolean b = m.matches(); if (b) return true; else return false; } public boolean isChinese(String str) { p = Pattern.compile(str17); m = p.matcher(str); boolean b = m.matches(); if (b) return true; else return false; } public boolean isURL(String str) { p = Pattern.compile(str13); m = p.matcher(str); boolean b = m.matches(); if (b) return true; else return false; } public boolean isDigit(String str) { p = Pattern.compile(str1); m = p.matcher(str); boolean b = m.matches(); if (b) return true; else return false; } public static void main(String[] args) { RegexBean bb = new RegexBean(); String str = "2005-11-01"; System.out.println(bb.isDate(str)); //String f="38700000000"; //System.out.println(bb.isMobile(f)); } }
2006年2月20日
最近做一个项目管理系统,有一个项目添加中使用到,需要选择部门然后得到部门的职员,还要选择这个部门中有哪些人需要参与这个项目,所以就使用到了3个控件,一个DropDownList和两个ListBox. 在博客园和CSDN中经常会看到有人发Ajax技术的文章,学习了一些,所以在此也简单的使用了一下,希望大家不要见笑。 一开始左边一个ListBox中显示的是公司的所有的员工,DropDownList则显示的是部门。最下面的一个TextBox是为了存储选中的职员的ID,多个之间使用逗号隔开的。 |
 |
|
这里使用到了两张表:部门表和员工表 SQL脚本如下: if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Emp]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table [dbo].[Emp] GO
CREATE TABLE [dbo].[Emp] ( [EmpID] [int] IDENTITY (1, 1) NOT NULL , [EmpName] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL , [Age] [int] NULL , [Dept] [int] NULL , [DelFlag] [bit] NULL ) ON [PRIMARY] GO
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Department]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table [dbo].[Department] GO
CREATE TABLE [dbo].[Department] ( [DeptID] [int] IDENTITY (1, 1) NOT NULL , [Name] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ) ON [PRIMARY] GO
前台代码:
<%@ Page language="c#" Codebehind="ListBoxToListBox.aspx.cs" AutoEventWireup="false" Inherits="NetTest.ListBoxTest.ListBoxToListBox" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <HTML> <HEAD> <title>ListBoxToListBox</title> <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1"> <meta name="CODE_LANGUAGE" Content="C#"> <meta name="vs_defaultClientScript" content="JavaScript"> <link href="../CSS/BasicLayout.css" rel="stylesheet" type="text/css"> <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5"> <style type="text/css"> .fsize { FONT-SIZE: 10pt } </style> </HEAD> <body MS_POSITIONING="GridLayout"> <script language="javascript"> function BindListEmp() { var DeptID=document.getElementById("ddlDept").value; var obj=AjaxMethod.GetEmpByDeptID(DeptID); if(obj.value!=null) { document.all("listEmployees").length=0; var ds=obj.value; if(ds != null && typeof(ds) == "object" && ds.Tables != null) { for(var i=0; i<ds.Tables[0].Rows.length; i++) { var name=ds.Tables[0].Rows[i].EmpName; var id=ds.Tables[0].Rows[i].EmpID; //alert(name); //alert(id); document.all("listEmployees").options.add(new Option(name,id)); } } else { } } else { } } </script> <script language="javascript"> function GetData() { listNewEmp = eval("document.FrmListBox.listNewEmp"); document.getElementById("txtEmpID").value=""; for(i=0;i<listNewEmp.length;i++) { document.FrmListBox.txtEmpID.value+=listNewEmp.options[i].value+","; } } function AddItem(ControlName) { Control = null; Control=eval("document.FrmListBox.listNewEmp"); var x=0; var i=0; var y=0; listEmployees=eval("document.FrmListBox.listEmployees"); listNewEmp=eval("document.FrmListBox.listNewEmp"); var j=listEmployees.length; for(i=0;i<j;i++) { if(listEmployees.options[i].selected==true) { //alert(Control.length); if(Control.length==0) { Control.add(new Option(listEmployees[i].text,listEmployees.options[i].value)); listNewEmp=eval("document.FrmListBox.listNewEmp"); continue; } else { for(x=0;x<listNewEmp.length;x++) { if(listEmployees.options[i].value==listNewEmp.options[x].value) { y++; } } } if(y==0) { Control.add(new Option(listEmployees[i].text,listEmployees.options[i].value)); listNewEmp=eval("document.FrmListBox.listNewEmp"); } } } } function RemoveItem(ControlName) { Control = null; Control=eval("document.FrmListBox.listNewEmp"); var j=Control.length; if(j==0) return; for(j;j>0;j--) { if(Control.options[j-1].selected==true) { Control.remove(j-1); } } } </script> <form id="FrmListBox" method="post" runat="server"> <table align="center" border="1" style="BORDER-COLLAPSE: collapse" borderColor="#ccccc" width="80%" class="fSize"> <TR> <TD style="WIDTH: 191px" align="right" width="191" height="30">公司部门:</TD> <TD height="30"><asp:dropdownlist id="ddlDept" runat="server" Width="112px"></asp:dropdownlist></TD> </TR> <TR> <TD style="WIDTH: 191px" align="right" width="191" height="30">项目成员:</TD> <TD height="30"> <TABLE id="Table3" cellSpacing="0" cellPadding="0" width="100%" border="0"> <TR align="center"> <TD style="WIDTH: 139px"> <asp:listbox id="listEmployees" runat="server" Width="141" Height="160" SelectionMode="Multiple"></asp:listbox></TD> <TD style="WIDTH: 33px"><INPUT class="buttoncss" style="WIDTH: 48px; HEIGHT: 24px" onclick="AddItem(this.name)" type="button" value=">>>>" name="btnReceSendToRight"><BR> <INPUT class="buttoncss" style="WIDTH: 48px; HEIGHT: 24px" onclick="RemoveItem(this.name)" type="button" value="<<<<" name="btnReceSendToLeft"> </TD> <TD align="left"> <asp:listbox id="listNewEmp" runat="server" Width="141" Height="160" SelectionMode="Multiple"></asp:listbox> </TD> </TR> </TABLE> </TD> </TR> <tr> <td height="30" align="right">存储listNew控件中所得到的值:</td> <td> <asp:TextBox id="txtEmpID" runat="server"></asp:TextBox></td> </tr> <TR> <TD align="center" colSpan="2" height="35"> <asp:button id="btnSubmit" runat="server" Width="64" Text="确定" CssClass="redButtonCss" Height="24"></asp:button> </TD> </TR> </table> </TD></TR></TABLE> </form> </body> </HTML>
| |
后台代码:
|
using System; using System.Collections; using System.ComponentModel; using System.Data; using System.Drawing; using System.Web; using System.Web.SessionState; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.HtmlControls; using System.Data.SqlClient; using Ajax; namespace NetTest.ListBoxTest { /// <summary> /// ListBoxToListBox 的摘要说明。 /// </summary> public class ListBoxToListBox : System.Web.UI.Page { protected System.Web.UI.WebControls.DropDownList ddlDept; protected System.Web.UI.WebControls.Button btnSubmit; protected System.Web.UI.WebControls.ListBox listEmployees; protected System.Web.UI.WebControls.ListBox listNewEmp; protected System.Web.UI.WebControls.TextBox txtEmpID; private string strConn=System.Configuration.ConfigurationSettings.AppSettings["ConnectionString"].ToString(); private void Page_Load(object sender, System.EventArgs e) { Ajax.Utility.RegisterTypeForAjax(typeof(NetTest.ListBoxTest.AjaxMethod));
if(!IsPostBack) { GetDepartment(); GetEmployees(); btnSubmit.Attributes.Add("onclick","GetData();"); } }
#region Web 窗体设计器生成的代码 override protected void OnInit(EventArgs e) { // // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。 // InitializeComponent(); base.OnInit(e); } /// <summary> /// 设计器支持所需的方法 - 不要使用代码编辑器修改 /// 此方法的内容。 /// </summary> private void InitializeComponent() { this.btnSubmit.Click += new System.EventHandler(this.btnSubmit_Click); this.Load += new System.EventHandler(this.Page_Load);
} #endregion
#region 得到部门 private void GetDepartment() { SqlConnection Conn=new SqlConnection(strConn); SqlCommand Cmd=new SqlCommand("Select * from Department",Conn); SqlDataAdapter da=new SqlDataAdapter(); da.SelectCommand=Cmd; DataSet ds=new DataSet(); Conn.Open(); da.Fill(ds); Conn.Close(); ddlDept.DataSource=ds.Tables[0].DefaultView; ddlDept.DataTextField="Name"; ddlDept.DataValueField="DeptID"; ddlDept.DataBind(); ddlDept.Attributes.Add("onChange","BindListEmp()"); } #endregion
#region 得到所有的员工 private void GetEmployees() { SqlConnection Conn=new SqlConnection(strConn); SqlCommand Cmd=new SqlCommand("Select * from Emp",Conn); SqlDataAdapter da=new SqlDataAdapter(); da.SelectCommand=Cmd; DataSet ds=new DataSet(); Conn.Open(); da.Fill(ds); Conn.Close(); listEmployees.DataSource=ds.Tables[0].DefaultView; listEmployees.DataTextField="EmpName"; listEmployees.DataValueField="EmpID"; listEmployees.DataBind(); } #endregion
private void btnSubmit_Click(object sender, System.EventArgs e) { Response.Write(txtEmpID.Text); }
} }
| 我想大家都知道使用AJAX技术,都是在javaScript中调用一个类里的方法,因此AjaxMothod中的方法如下
|
using System; using System.Data.SqlClient; using System.Data; namespace NetTest.ListBoxTest { /// <summary> /// AjaxTest 的摘要说明。 /// </summary> public class AjaxMethod { private string strConn=System.Configuration.ConfigurationSettings.AppSettings["ConnectionString"].ToString(); public AjaxMethod() { // // TODO: 在此处添加构造函数逻辑 // }
#region 根据部门编号得到部门员工 [Ajax.AjaxMethod] public DataSet GetEmpByDeptID(string DeptID) { try { int IntDeptID=int.Parse(DeptID); SqlConnection Conn=new SqlConnection(strConn); SqlCommand Cmd=new SqlCommand("Select * from Emp where Dept="+IntDeptID,Conn); SqlDataAdapter da=new SqlDataAdapter(); da.SelectCommand=Cmd; DataSet ds=new DataSet(); Conn.Open(); da.Fill(ds); Conn.Close(); return ds; } catch(Exception ex) { string str=ex.Message; return null; } } #endregion } }
| 还有webconfig中的设置 <httpHandlers> <add verb="POST,GET" path="ajax/*.ashx" type="Ajax.PageHandlerFactory, Ajax" /> </httpHandlers> 这些Ajax的初步使用可以参考一下小山的Blog(http://singlepine.cnblogs.com/articles/253393.html)。 | 注意一下关于两个ListBox之间所使用到的JavaScript代码和<form>标记的id有关,因为一般人生成一个页面之后,都不会去修改<form>的,所以特别提醒一下。 当我们选择好项目的开发人员之后,就需要进行数据库的录入操作了,但是第一步我们做的必须得到选中的职员的ID,所以在我们进行Button_Click事件之前,必须先得到选中的编号,所以在Page_Load中注册一个客户端的事件,btnSubmit.Attributes.Add("onclick","GetData();");这样选中的职员的编号就可以保存在TextBox,直接在代码里使用txtEmpID.Text得到值,如果需要分割,则使用Split(',')即可。 |
2006年1月7日
| 这里例子结合了DataList的分页和嵌套,还有点击显示相对内容的关联。 |
 |
HTML代码:
<%@ Page language="c#" Codebehind="DataListNews.aspx.cs" AutoEventWireup="false" Inherits="DataListNesting.DataListNews" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <HTML> <HEAD> <title>DataList嵌套,分页,点击标题显示内容</title> <meta content="Microsoft Visual Studio .NET 7.1" name="GENERATOR"> <meta content="C#" name="CODE_LANGUAGE"> <meta content="JavaScript" name="vs_defaultClientScript"> <meta content="http://schemas.microsoft.com/intellisense/ie5" name="vs_targetSchema"> <style>BODY { FONT-SIZE: 12px } A:link { TEXT-DECORATION: none } A:visited { TEXT-DECORATION: none } </style> <script language="JavaScript"> scores = new Array(20); var numTotal=0; NS4 = (document.layers) ? 1 : 0; IE4 = (document.all) ? 1 : 0; ver4 = (NS4 || IE4) ? 1 : 0;
/*if (ver4) { with (document) { write("<STYLE TYPE='text/css'>"); if (NS4) { write(".parent {position:absolute; visibility:visible}"); write(".child {position:absolute; visibility:visible}"); write(".regular {position:absolute; visibility:visible}") } else { write(".child {display:none}") } write("</STYLE>"); } }*/
function getIndex(el) { ind = null; for (i=0; i<document.layers.length; i++) { whichEl = document.layers[i]; if (whichEl.id == el) { ind = i; break; } } return ind; }
function arrange() { nextY = document.layers[firstInd].pageY+document.layers[firstInd].document.height; for (i=firstInd+1; i<document.layers.length; i++) { whichEl = document.layers[i]; if (whichEl.visibility != "hide") { whichEl.pageY = nextY; nextY += whichEl.document.height; } } }
function initIt() { if (!ver4) return; if (NS4) { for (i=0; i<document.layers.length; i++) { whichEl = document.layers[i]; if (whichEl.id.indexOf("Child") != -1) whichEl.visibility = "hide"; } arrange(); } else { divColl = document.all.tags("DIV"); for (i=0; i<divColl.length; i++) { whichEl = divColl(i); if (whichEl.className == "child") whichEl.style.display = "none"; } } }
function expandIt(el) { if (!ver4) return; if (IE4) { whichEl1 = eval(el + "Child"); for(i=0;i<=numTotal-1;i++) { whichEl = eval(scores[i] + "Child"); if(whichEl!=whichEl1) { whichEl.style.display = "none"; } } whichEl1 = eval(el + "Child"); if (whichEl1.style.display == "none") { whichEl1.style.display = "block"; } else { whichEl1.style.display = "none"; } } else { whichEl = eval("document." + el + "Child"); for(i=0;i<=numTotal-1;i++) { whichEl = eval("document." + scores[i] + "Child"); if(whichEl!=whichEl1) { whichEl.visibility = "hide"; } } if (whichEl.visibility == "hide") { whichEl.visibility = "show"; } else { whichEl.visibility = "hide"; } arrange(); } } onload = initIt; </script> </HEAD> <body MS_POSITIONING="GridLayout"> <form id="Form1" method="post" runat="server"> <table align="center" border="1" width="90%" style="BORDER-COLLAPSE: collapse" borderColor="#cccccc"> <tr> <td align="center" height="30"><font style="FONT-WEIGHT: bold; FONT-SIZE: 11pt">DataList嵌套,分页,点击标题显示内容</font></td> </tr> <TR> <TD style="HEIGHT: 15px" align="center"><font style="FONT-SIZE: 10pt">共</font> <asp:label id="lbTotalPage" runat="server"></asp:label><font style="FONT-SIZE: 10pt">页/共</font> <asp:label id="lbTotalCount" runat="server"></asp:label><font style="FONT-SIZE: 10pt">记录 当前</font> <asp:label id="lbCurrentPage" runat="server"></asp:label><font style="FONT-SIZE: 10pt">页</font> <font style="FONT-SIZE: 10pt">跳转到</font> <asp:dropdownlist id="ddlPage" runat="server" Width="65px" AutoPostBack="True"></asp:dropdownlist><font style="FONT-SIZE: 10pt">页</font></TD> </TR> <tr> <td align="center"> <asp:DataList id="dlParent" runat="server" DataKeyField="ClassId" Width="70%"> <AlternatingItemStyle Font-Size="X-Small"></AlternatingItemStyle> <ItemStyle Font-Size="X-Small" HorizontalAlign="Center"></ItemStyle> <ItemTemplate> <DIV id="KB1Parent" style="MARGIN-BOTTOM: 0px"><A id="aurl" onclick="expandIt('KB1');return false" href="javascript:void(0);" runat="server"><FONT style="FONT-SIZE: 14px"><%# DataBinder.Eval(Container.DataItem,"ClassName") %> <asp:Label id="lbCount" runat="server"></asp:Label></FONT></A></DIV> <DIV class="child" id="KBChild" runat="server"> <asp:DataList id="dlChild" runat="server" ShowHeader="False" ShowFooter="False" RepeatDirection="Horizontal" RepeatColumns="3"> <ItemTemplate> <a target=_blank href='<%# "ShowInfo.aspx?Id=" + DataBinder.Eval(Container.DataItem,"Id") %>'><FONT style="FONT-SIZE: 12px"><%# DataBinder.Eval(Container.DataItem,"Name") %></FONT></a> </ItemTemplate> </asp:DataList></DIV> </ItemTemplate> </asp:DataList> </td> </tr> <tr> <TD height="30" align="center"> <asp:linkbutton id="FirstPage" runat="server" CssClass="pageLinks" CommandName="First" Text="[First Page]" OnCommand="NavigationLink_Click"> <font style="FONT-SIZE: 10pt">第一页</font></asp:linkbutton> <asp:linkbutton id="PreviousPage" runat="server" CssClass="pageLinks" CommandName="Prev" Text="[Previous Page]" OnCommand="NavigationLink_Click"> <font style="FONT-SIZE: 10pt">上一页</font></asp:linkbutton> <asp:linkbutton id="NextPage" runat="server" CssClass="pageLinks" CommandName="Next" Text="[Next Page]" OnCommand="NavigationLink_Click"> <font style="FONT-SIZE: 10pt">下一页</font></asp:linkbutton> <asp:LinkButton id="LastPage" runat="server" CssClass="pageLinks" CommandName="Last" Text="[Last Page]" OnCommand="NavigationLink_Click"> <font style="FONT-SIZE: 10pt">末一页</font></asp:LinkButton></TD> </tr> </table> </form> </body> </HTML> | CS代码:
|
using System; using System.Collections; using System.ComponentModel; using System.Data; using System.Drawing; using System.Web; using System.Web.SessionState; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.HtmlControls; using System.Data.SqlClient; namespace DataListNesting { /// <summary> /// DataListNews 的摘要说明。 /// </summary> public class DataListNews : System.Web.UI.Page { protected System.Web.UI.WebControls.Label lbTotalPage; protected System.Web.UI.WebControls.Label lbTotalCount; protected System.Web.UI.WebControls.Label lbCurrentPage; protected System.Web.UI.WebControls.DropDownList ddlPage; protected System.Web.UI.WebControls.DataList dlParent; protected System.Web.UI.WebControls.LinkButton FirstPage; protected System.Web.UI.WebControls.LinkButton PreviousPage; protected System.Web.UI.WebControls.LinkButton NextPage; protected System.Web.UI.WebControls.LinkButton LastPage; private Int32 CurrentPageNumber=1; private int PageSize=5; private string strConn="server=localhost;uid=sa;pwd=;database=AspNetTest"; private void Page_Load(object sender, System.EventArgs e) { if(!IsPostBack) { BindData(); } }
#region Web 窗体设计器生成的代码 override protected void OnInit(EventArgs e) { // // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。 // InitializeComponent(); base.OnInit(e); } /// <summary> /// 设计器支持所需的方法 - 不要使用代码编辑器修改 /// 此方法的内容。 /// </summary> private void InitializeComponent() { this.dlParent.ItemDataBound += new System.Web.UI.WebControls.DataListItemEventHandler(this.dlParent_ItemDataBound); this.Load += new System.EventHandler(this.Page_Load);
} #endregion
private DataSet BindParent(int PageSize,int CurrentPageNumber) { SqlConnection Conn=new SqlConnection(strConn); SqlCommand Cmd=new SqlCommand(); Cmd.Connection=Conn; Cmd.CommandType=CommandType.StoredProcedure; Cmd.CommandText="BindNews"; SqlParameter pramsPageSize=new SqlParameter(); pramsPageSize.ParameterName="@PageSize"; pramsPageSize.Value=PageSize;
SqlParameter pramsCurrent=new SqlParameter(); pramsCurrent.ParameterName="@PageIndex"; pramsCurrent.Value=CurrentPageNumber;
SqlParameter pramsDocount=new SqlParameter(); pramsDocount.ParameterName="@Docount"; pramsDocount.Value=false;
Cmd.Parameters.Add(pramsCurrent); Cmd.Parameters.Add(pramsDocount); Cmd.Parameters.Add(pramsPageSize); SqlDataAdapter da=new SqlDataAdapter(); da.SelectCommand=Cmd; DataSet ds=new DataSet(); Conn.Open(); da.Fill(ds); Conn.Close(); ViewState["Count"]=ds.Tables[0].Rows.Count.ToString(); return ds; }
private void dlParent_ItemDataBound(object sender, System.Web.UI.WebControls.DataListItemEventArgs e) { if(e.Item.ItemIndex!=-1) { int ClassID=int.Parse(dlParent.DataKeys[e.Item.ItemIndex].ToString()); DataSet ds=BindChild(ClassID); Label lb=(Label)e.Item.FindControl("lbCount"); lb.Text=" (" + ds.Tables[0].Rows.Count.ToString() + ") "; DataList list=(DataList)e.Item.FindControl("dlChild"); list.DataSource=ds.Tables[0].DefaultView; list.DataBind(); HtmlAnchor hr=(HtmlAnchor)e.Item.FindControl("aurl"); HtmlGenericControl dv=(HtmlGenericControl)e.Item.FindControl("KBChild"); hr.ID="KB"; string ss="expandIt('dlParent__ctl"+e.Item.ItemIndex+"_"+hr.ID+"')"; hr.Attributes.Add("onclick",ss.ToString()); dv.ID=hr.ID+"Child"; string scripts="<script>numTotal=" + int.Parse(ViewState["Count"].ToString()) +";"; for(int i=0;i<int.Parse(ViewState["Count"].ToString());i++) { scripts +="scores[" + i + "]='dlParent__ctl" + i + "_" + hr.ID + "';"; } scripts +="</script>"; Page.RegisterStartupScript("scripts",scripts.ToString()); } }
private DataSet BindChild(int ClassID) { SqlConnection Conn=new SqlConnection(strConn); SqlCommand Cmd=new SqlCommand("select * from NewsInfo where ClassID="+ClassID+"",Conn); SqlDataAdapter da=new SqlDataAdapter(); da.SelectCommand=Cmd; DataSet ds=new DataSet(); Conn.Open(); da.Fill(ds); Conn.Close(); return ds; }
protected void NavigationLink_Click ( Object sender, CommandEventArgs e )//此事件为HTML代码里注册(事件为OnCommand) { switch ( e.CommandName )//根据设置的CommandName属性判断 { case "First": CurrentPageNumber = 1; break; case "Last": CurrentPageNumber = Int32.Parse ( lbTotalPage.Text ); break; case "Next": CurrentPageNumber = Int32.Parse ( lbCurrentPage.Text ) + 1; break; case "Prev": CurrentPageNumber = Int32.Parse ( lbCurrentPage.Text ) - 1; break; } BindData(); }
public Int32 GetPCount() { SqlConnection Conn=new SqlConnection(strConn); SqlCommand Cmd=new SqlCommand(); Cmd.Connection=Conn; Cmd.CommandType=CommandType.StoredProcedure; Cmd.CommandText="BindNews"; SqlParameter pramsPageSize=new SqlParameter(); pramsPageSize.ParameterName="@PageSize"; pramsPageSize.Value=1;
SqlParameter pramsCurrent=new SqlParameter(); pramsCurrent.ParameterName="@PageIndex"; pramsCurrent.Value=1;
SqlParameter pramsDocount=new SqlParameter(); pramsDocount.ParameterName="@Docount"; pramsDocount.Value=false;
Cmd.Parameters.Add(pramsCurrent); Cmd.Parameters.Add(pramsDocount); Cmd.Parameters.Add(pramsPageSize); Conn.Open(); Int32 Tcount=Int32.Parse(Cmd.ExecuteScalar().ToString()); Conn.Close(); return Tcount; }
public void BindData() { lbCurrentPage.Text = CurrentPageNumber.ToString(); //绑定DATAGRID DataSet ds=BindParent(PageSize,CurrentPageNumber); dlParent.DataSource=ds.Tables[0].DefaultView; dlParent.DataBind();
Double TotalPages = 1;//初始化,总页数为1 Double ModePages=0;//取模余数(判断总页数是否要加1) Int32 TotalRecords = GetPCount();//调用上面的得到总记录数的方法 TotalPages = TotalRecords / PageSize;//得到总页数(总记录数除以每页的记录数) ModePages=TotalRecords%PageSize;//得到取模的余数(总记录数取模每页的记录数) if(ModePages>0)//如果取模数不等于0,则把总页数加1 { TotalPages+=1; } if(ModePages==0)//如果取模数等于0,不做任何事(也可以不用判断) { } if(TotalPages==0) { TotalPages=1; } lbTotalPage.Text = TotalPages.ToString();//显示页面上的总页数 lbTotalCount.Text=TotalRecords.ToString();//显示页面上的总记录数
//以下为判断点击的按钮(第一页,上一页,下一页,末一页)是否可以用 if ( CurrentPageNumber == 1 ) { PreviousPage.Enabled = false; FirstPage.Enabled=false; if ( TotalPages > 1 ) { NextPage.Enabled = true; LastPage.Enabled=true; } else { NextPage.Enabled = false; LastPage.Enabled=false; } } else { PreviousPage.Enabled = true; FirstPage.Enabled=true;
if ( CurrentPageNumber == TotalPages ) { NextPage.Enabled = false; LastPage.Enabled=false; } else { NextPage.Enabled = true; LastPage.Enabled=true; } }
ddlPage.Items.Clear();//清楚跳转的页数(如果不清除,里面的记录将会循环增加) int PCount=int.Parse(lbTotalPage.Text);//得到总页数,为了循环 if(PCount==0) { PCount=1; } for(int i=1;i<=PCount;i++) { ddlPage.Items.Add(i.ToString()); } ddlPage.Items.FindByText(CurrentPageNumber.ToString()).Selected=true;//把当前页显示在列表框的第一个 }
private void ddlPage_SelectedIndexChanged(object sender, System.EventArgs e) { int PageSize=int.Parse(ddlPage.SelectedValue.ToString()); int PageCount=Int32.Parse(lbTotalPage.Text.Trim().ToString()); if(PageSize<1) { CurrentPageNumber=1; } else if(PageSize>PageCount) { CurrentPageNumber=PageCount; } else { CurrentPageNumber=PageSize; } BindData(); } } }
| 注意:在CS文件里开始设置PageSize为每页显示的记录,例子里设置的是5条,可以按照自己的要求修改, 下载例子里有一个DataBase文件夹,里面有数据库ACCESS,你可以导入到SQL中,然后运行文本文件里的分页存储过程,然后修改一下CS文件里的连接字符串即可运行 ,有什么不足的地方请大家指教。 例子下载:/Files/sunnystar365/DataListNesting.rar |
2005年12月14日
数据库设计
实现sql server数据库的优化,首先要有一个好的数据库设计方案。在实际工作中,许多sql server方案往往是由于数据库设计得不好导致性能很差。实现良好的数据库设计必须考虑这些问题:
1. 逻辑数据库规范化问题
一般来说,逻辑数据库设计会满足规范化的前3级标准:
第1规范:没有重复的组或多值的列;
第2规范: 每个非关键字段必须依赖于主关键字,不能依赖于一个组合式主关键字的某些组成部分;
第3规范: 一个非关键字段不能依赖于另一个非关键字段。
遵守这些规则的数据库设计会产生较少的列和更多的表,因而也就减少了数据冗余,也减少了用于存储数据的页。
2. 生成物理数据库
要想正确选择基本物理实现策略,必须了解和利用好数据库访问格式和硬件资源的操作特点,特别是内存和磁盘子系统i/o。以下是一些常用技巧:
与每个表列相关的数据类型应该反映数据所需的最小存储空间,特别是对于被索引的列更是如此。比如能使用smallint类型就不要用integer类型,这样索引字段可以被更快地读取,而且可以在一个数据页上放置更多的数据行,因而也就减少了i/o操作。
把一个表放在某个物理设备上,再通过sql server的段把它的不分簇索引放在一个不同的物理设备上,这样能提高性能。尤其是系统采用了多个智能型磁盘控制器和数据分离技术的情况下,这样做的好处更加明显。
用sql server段把一个频繁使用的大表分割开,并放在多个单独的智能型磁盘控制器的数据库设备上,这样也可以提高性能。因为有多个磁头在查找,所以数据分离也能提高性能。
用sql server段把文本或图像列的数据存放在一个单独的物理设备上可以提高性能。一个专用的智能型的控制器能进一步提高性能。
应用系统设计
在应用系统的设计中,要着重考虑以下几点:
1.合理使用索引
索引是数据库中重要的数据结构,它的根本目的就是提高查询效率。索引的使用要恰到好处,其使用原则如下:
在经常进行连接,但是没有指定为外键的列上建立索引,而不经常连接的字段则由优化器自动生成索引;在频繁进行排序或分组(即进行group by或order by操作)的列上建立索引;在条件表达式中经常用到的不同值较多的列上建立索引,在不同值少的列上不要建立索引。比如在雇员表的“性别”列上只有“男”与“女”两个不同值,因此就无必要建立索引。如果建立索引不但不会提高查询效率,反而会严重降低更新速度。 如果待排序的列有多个,可以在这些列上建立复合索引。
2. 避免或简化排序
应当尽量简化或避免对大型表进行重复的排序。当能够利用索引自动以适当的次序产生输出时,优化器就避免了排序这个步骤。为了避免不必要的排序,就要正确地增建索引,合理地合并数据库表(尽管有时可能影响表的规范化,但相对于效率的提高是值得的)。如果排序不可避免,那么应当试图简化它,如缩小排序的列的范围等。
3.消除对大型表行数据的顺序存取
在嵌套查询中,表的顺序存取对查询效率可能产生致命的影响。我们有时可以使用并集来避免顺序存取。尽管也许在所有的检查列上都有索引,但某些形式的where子句会强迫优化器使用顺序存取,这一点也应注意。
4. 避免相关子查询
如果一个列同时在主查询和where子句中出现,很可能当主查询中的列值改变之后,子查询必须重新查询一次。而且查询嵌套层次越多,效率越低,因此应当尽量避免子查询。如果子查询不可避免,那么要在子查询中过滤掉尽可能多的行。
5.避免困难的正规表达式
mathes和like关键字支持通配符匹配,但这种匹配特别耗时。例如:select * from customer where zipcode like “98_ _ _”,即使在zipcode字段上已建立了索引,在这种情况下也还是采用顺序扫描的方式。如果把语句改为:select * from customer where zipcode >“98000”,在执行查询时就会利用索引来查询,显然会大大提高速度。
6.使用临时表加速查询
把表的一个子集进行排序并创建临时表,有时能加速查询。它有助于避免多重排序操作,而且在其他方面还能简化优化器的工作。临时表中的行要比主表中的行少,而且物理顺序就是所要求的顺序,减少了磁盘i/o,所以查询工作量可以得到大幅减少。但要注意,临时表创建后不会反映主表的修改。在主表中数据频繁修改的情况下,注意不要丢失数据。
操作系统相关优化
操作系统性能的好坏直接影响数据库的使用性能,如果操作系统存在问题,如cpu过载、过度内存交换、磁盘i/o瓶颈等,在这种情况下,单纯进行数据库内部性能调整是不会改善系统性能的。我们可以通过windows nt的系统监视器(system monitor)来监控各种设备,发现性能瓶颈。
cpu 一种常见的性能问题就是缺乏处理能力。系统的处理能力是由系统的cpu数量、类型和速度决定的。如果系统没有足够的cpu处理能力,它就不能足够快地处理事务以满足需要。我们可以使用system monitor确定cpu的使用率,如果以75%或更高的速率长时间运行,就可能碰到了cpu瓶颈问题,这时应该升级cpu。但是升级前必须监视系统的其他特性,如果是因为sql语句效率非常低,优化语句就有助于解决较低的cpu利用率。而当确定需要更强的处理能力,可以添加cpu或者用更快的cpu 替换。
内存 sql server可使用的内存量是sql server性能最关键因素之一。而内存同i/o子系统的关系也是一个非常重要的因素。例如,在i/o操作频繁的系统中,sql server用来缓存数据的可用内存越多,必须执行的物理i/o也就越少。这是因为数据将从数据缓存中读取而不是从磁盘读取。同样,内存量的不足会引起明显的磁盘读写瓶颈,因为系统缓存能力不足会引起更多的物理磁盘i/o。
可以利用system monitor检查sql server的buffer cache hit ratio计数器,如果命中率经常低于90%,就应该添加更多的内存。
i/o子系统 由i/o子系统发生的瓶颈问题是数据库系统可能遇到的最常见的同硬件有关的问题。配置很差的i/o子系统引起性能问题的严重程度仅次于编写很差的sql语句。i/o子系统问题是这样产生的,一个磁盘驱动器能够执行的i/o操作是有限的,一般一个普通的磁盘驱动器每秒只能处理85次i/o操作,如果磁盘驱动器超载,到这些磁盘驱动器的i/o操作就要排队,sql的i/o延迟将很长。这可能会使锁持续的时间更长,或者使线程在等待资源的过程中保持空闲状态,其结果就是整个系统的性能受到影响。
解决i/o子系统有关的问题也许是最容易的,多数情况下,增加磁盘驱动器就可以解决这个性能问题。
当然,影响性能的因素很多,而应用又各不相同,找出一个通用的优化方案是很困难的,只能是在系统开发和维护的过程中针对运行的具体情况,不断加以调整。 [转载]
|
实现: 1.当鼠标移动到DataGrid的单元格时,单元格变色,并且单元格里的字体同时变色,鼠标变为手的形状.鼠标移出单元格,恢复原样. 2.当鼠标点击DataGrid的单元格时,单元格变色,单元格上的显示字体变色;当点击另一个单元格时,前一个单元格以及字体颜色恢复原样,此时的单元格变色,字体变色. 3.当双击DataGrid上单击时变色的单元格时,颜色取消,恢复原样. 4.DataGrid按顺序(ASC)和倒序(DESC)排序,并且DataGrid排序的列头显示排序标志. 排序必须注意:列头名必须和排序的字段名一致,否则将不会显示排序标志.
DataGrid点击变色的注册事件在dbOrders_ItemDataBound事件中注册. if(e.Item.ItemType==ListItemType.Item || e.Item.ItemType==ListItemType.AlternatingItem) { e.Item.Attributes.Add("onmouseover","tdOver(this)"); e.Item.Attributes.Add("onmouseout","tdOut(this)"); e.Item.Attributes.Add("onclick","tdColor(this)"); e.Item.Attributes.Add("ondblclick","tdColorDbl(this)"); } 而<script language="javascript"></script>之间的代码可以保存为JS文件,然后使用<script language="javascript" src="JS文件名"/>即可.
以下例子使用的是NorthWind数据库中的Orders表. |
|
Html代码:
<%@ Page language="c#" Codebehind="DataGridColor.aspx.cs" AutoEventWireup="false" Inherits="NetTest.DataGridExample.DataGridColor" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <HTML> <HEAD> <title>DataGrid移动,单击变色</title> <meta content="Microsoft Visual Studio .NET 7.1" name="GENERATOR"> <meta content="C#" name="CODE_LANGUAGE"> <meta content="JavaScript" name="vs_defaultClientScript"> <LINK href="../Css/BasicLayout.css" type="text/css" rel="stylesheet"> <meta content="http://schemas.microsoft.com/intellisense/ie5" name="vs_targetSchema"> </HEAD> <body MS_POSITIONING="GridLayout"> <script language="javascript"> <!-- var bColor='#ff3300'; //定义颜色,为单击时显示的颜色 var fColor='#fafafa'; //定义颜色,为单击时字体所显示的颜色 function tdOver(td) { if(td.style.backgroundColor!=bColor)//当这一列的背景颜色不为以上定义的颜色时 { td.setAttribute('DtBg',td.style.backgroundColor);//得到这列的背景颜色并且设置为DtBg td.setAttribute('DtCo',td.style.color);//得到这列的字体颜色并且设置为DtCo td.style.color='#ff66cc';//设置鼠标移上时列里的字体颜色为#ff99ff td.style.cursor='hand';//设置鼠标的形状为手状 td.style.backgroundColor='#66cc66';//设置该列的背景颜色为#66cc66 } } function tdOut(td) { if(td.style.backgroundColor!=bColor)//当这一列的背景颜色不为以上定义的颜色时 { td.style.backgroundColor=td.getAttribute('DtBg');//设置该列的背景颜色为以上得到的颜色,即DtBg td.style.color=td.getAttribute('DtCo');//设置该列的背景颜色为以上得到的颜色,即DtCo } } function clearTdColor(tdc) { var tdColl=document.all.tags('TR');//得到所有的行 bc=tdc.getAttribute('Dtbg');//得到该列的背景颜色(在tdOver方法中setAttribute) cc=tdc.getAttribute('DtCo');//得到该列的字体颜色(在tdOver方法中setAttribute) for(i=0;i<tdColl.length;i++)//循环行 { whichTD=tdColl(i);//得到当前的行 if(whichTD.style.backgroundColor==bColor)//如果该单元格为开始时设置的颜色,即bColor { //说明:如果你的DataGrid不分普通列和交替列,则使用以下代码,清除颜色 /*whichTD.style.backgroundColor=bc;//设置该单元格的颜色为得到的颜色 whichTD.style.color=cc;//设置该单元格的字体颜色为得到的颜色 whichTD.style.fontWeight=''; break;*/ //如果你的DataGrid分普通列和交替列,而且交替列有颜色,则使用以下代码,清除颜色 //提示:使用的时候注意一下以下的判断,根据自己的实际情况取模判断可能要交换一下. if(i%2!=0) //表示是普通列,因为没有颜色,所以下面的颜色为"" { whichTD.style.backgroundColor=""; whichTD.style.color=""; whichTD.style.fontWeight=''; break; } else //表示是交替列,根据你的DataGrid交替列的颜色而设置下面的backgroundColor { whichTD.style.backgroundColor="#CCFFFF"; //#CCFFFF为设置的DataGrid交替项的颜色(可以根据自己的需要修改) whichTD.style.color=""; whichTD.style.fontWeight=''; break; } } } } function tdColor(tdc) { clearTdColor(tdc);//首先清楚所有的颜色 bc=tdc.getAttribute('Dtbg');//得到该列的背景颜色(在tdOver方法中setAttribute) cc=tdc.getAttribute('DtCo');//得到该列的字体颜色(在tdOver方法中setAttribute) tdcs=tdc.style.backgroundColor;//得到该列当前的颜色(即鼠标移至单元格时的颜色) if(event.srcElement.tagName!='A')//event.srcElement.tagName就是触发的单元格的名称,即TD { if(tdcs!=bColor)//如果该列的当前颜色不等于开始是定义的颜色时 { tdc.style.backgroundColor=bColor;//设置背景颜色为开始定义的颜色 tdc.style.color=fColor;//设置背景颜色为开始定义的字体颜色 tdc.style.fontWeight='500'; } else { tdc.style.backgroundColor=bc;//设置背景颜色(为在tdOver方法中setAttribute) tdc.style.color=cc;//设置背景颜色为(在tdOver方法中setAttribute) tdc.style.fontWeight=''; } } } function tdColorDbl(tdc)//清除该列的颜色 { clearTdColor(tdc); } --> </script> <form id="Form1" method="post" runat="server"> <table width="70%" align="center" border="0"> <tr> <td align="center" height="25"><font style="FONT-WEIGHT: bold; FONT-SIZE: 11pt">DataGrid移动,单击变色</font></td> </tr> <tr> <td><asp:datagrid id="dbOrders" runat="server" Width="100%" AllowSorting="True" BorderColor="#93BEE2" BorderStyle="None" AutoGenerateColumns="False" AllowPaging="True"> <AlternatingItemStyle HorizontalAlign="Center" BackColor="#CCFFFF"></AlternatingItemStyle> <ItemStyle Font-Size="X-Small" HorizontalAlign="Center" Height="25px"></ItemStyle> <HeaderStyle Font-Size="X-Small" Font-Bold="True" HorizontalAlign="Center" Height="25px" BackColor="#6699FF"></HeaderStyle> <Columns> <asp:BoundColumn DataField="OrderID" ReadOnly="True" HeaderText="订单编号"></asp:BoundColumn> <asp:BoundColumn DataField="CustomerID" SortExpression="CustomerID" HeaderText="CustomerID"></asp:BoundColumn> <asp:BoundColumn DataField="OrderDate" SortExpression="OrderDate" HeaderText="OrderDate"></asp:BoundColumn> <asp:BoundColumn DataField="ShipCity" HeaderText="运输城市"></asp:BoundColumn> <asp:BoundColumn DataField="ShipCountry" HeaderText="运输国家"></asp:BoundColumn> <asp:BoundColumn DataField="ShipRegion" HeaderText="运输区域"></asp:BoundColumn> </Columns> <PagerStyle HorizontalAlign="Center" Mode="NumericPages"></PagerStyle> </asp:datagrid></td> </tr> </table> </form> </body> </HTML>
| CS代码:
|
using System; using System.Collections; using System.ComponentModel; using System.Data; using System.Drawing; using System.Web; using System.Web.SessionState; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.HtmlControls; using System.Data.SqlClient; namespace NetTest.DataGridExample { /// <summary> /// DataGridColor 的摘要说明。 /// </summary> public class DataGridColor : System.Web.UI.Page { protected System.Web.UI.WebControls.DataGrid dbOrders; private string strConn=System.Configuration.ConfigurationSettings.AppSettings["ConnectionString"].ToString(); private void Page_Load(object sender, System.EventArgs e) { if(!IsPostBack) { ViewState["SortExpression"]=""; ViewState["sort"]="desc"; } BindData(); }
#region Web 窗体设计器生成的代码 override protected void OnInit(EventArgs e) { // // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。 // InitializeComponent(); base.OnInit(e); } /// <summary> /// 设计器支持所需的方法 - 不要使用代码编辑器修改 /// 此方法的内容。 /// </summary> private void InitializeComponent() { this.dbOrders.ItemCreated += new System.Web.UI.WebControls.DataGridItemEventHandler(this.dbOrders_ItemCreated); this.dbOrders.PageIndexChanged += new System.Web.UI.WebControls.DataGridPageChangedEventHandler(this.dbOrders_PageIndexChanged); this.dbOrders.SortCommand += new System.Web.UI.WebControls.DataGridSortCommandEventHandler(this.dbOrders_SortCommand); this.dbOrders.ItemDataBound += new System.Web.UI.WebControls.DataGridItemEventHandler(this.dbOrders_ItemDataBound); this.Load += new System.EventHandler(this.Page_Load);
} #endregion
private void BindData() { SqlConnection Conn=new SqlConnection(strConn); SqlCommand Cmd=new SqlCommand("select * from Orders",Conn); SqlDataAdapter da=new SqlDataAdapter(); da.SelectCommand=Cmd; DataSet ds=new DataSet(); Conn.Open(); da.Fill(ds); Conn.Close(); DataTable dt=ds.Tables[0]; if(ViewState["SortExpression"].ToString()!="") { dt.DefaultView.Sort=ViewState["SortExpression"].ToString()+" "+ViewState["sort"].ToString(); } dbOrders.DataSource=dt; dbOrders.DataBind(); }
private void dbOrders_SortCommand(object source, System.Web.UI.WebControls.DataGridSortCommandEventArgs e) { string sort=string.Empty; if(ViewState["SortExpression"].ToString()==e.SortExpression.ToString()) { if(ViewState["sort"].ToString()=="asc") { sort="desc"; } else { sort="asc"; } } else { if(ViewState["sort"].ToString()=="asc") { sort="desc"; } else { sort="asc"; } } ViewState["sort"]=sort; ViewState["SortExpression"]=e.SortExpression; BindData(); }
private void dbOrders_ItemCreated(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e) { if (e.Item.ItemType==ListItemType.Header) { //排序 foreach(TableCell c in e.Item.Cells) {
if (c.Controls.Count >0 && c.Controls[0].GetType().ToString()=="System.Web.UI.WebControls.DataGridLinkButton") { if (((LinkButton)c.Controls[0]).Text==(string)ViewState["SortExpression"]) { Label l=new Label(); l.Font.Name="Webdings"; if ((string)ViewState["sort"]=="asc") l.Text="5"; else l.Text="6"; c.Controls.Add(l); } } } } }
private void dbOrders_PageIndexChanged(object source, System.Web.UI.WebControls.DataGridPageChangedEventArgs e) { dbOrders.CurrentPageIndex=e.NewPageIndex; DataBind(); }
private void dbOrders_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e) { if(e.Item.ItemType==ListItemType.Item || e.Item.ItemType==ListItemType.AlternatingItem) { e.Item.Attributes.Add("onmouseover","tdOver(this)"); e.Item.Attributes.Add("onmouseout","tdOut(this)"); e.Item.Attributes.Add("onclick","tdColor(this)"); e.Item.Attributes.Add("ondblclick","tdColorDbl(this)"); } } } } | 实例下载:DataGridColor.rar |
2005年11月19日
摘要: 使用TreeView和listView控件查看本机磁盘文件夹及文件 在页面上放TreeView,listView,splitter,imageList四个控件,在imageList中添加两个小图片,然后设置一下 treeview控件的checkboxex=true,Dock=left,ImageList=ImageList1(控件名)ImageIndex=1,SelectedImageIndex=... 阅读全文
2005年11月17日
摘要: 关于文件的一些创建,删除,查看等操作 前台代码: <%@ Page language="c#" Codebehind="FileTest.aspx.cs" AutoEventWireup="false" Inherits="NetTest.FileTest" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//... 阅读全文
2005年11月3日
摘要: 有的时候我们需要隔一段时间做一些处理,可以在Web.Config中使用线程来处理(书中学习,整理了一下,以下是过5分钟删除一张表的记录)using System;using System.Collections;using System.ComponentModel;using System.Web;using System.Web.SessionState;using DataBase;usin... 阅读全文
2005年10月25日
摘要: 最近做一个关于三级联动的例子。想在页面上显示像树形控件一样的效果,每一个大类下面有各自的子类。所以使用了Relations建立了表之间的关系(Relations是获取用于将表链接起来并允许从父表浏览到子表的关系的集合) 并却使用了PagedDataSource对DataList进行了分页(PagedDataSource封装 DataGrid 控件的属性,这些属性使该控件可以执行分页).DataGr... 阅读全文
|