Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58

<asp:Button ID=”btnConfirm” runat=”server” Text=”保存确认结果” onClientClick=”return chekCancel();” OnClick=”btnConfirm_Click” />
要加上return, 当返回为true时,才执行服务器上的OnClick

注:用onClick, onClientClick看控件是否拥有服务器上的onClick,若有,则onClick在服务器上运行,若没有,onClick在客户端上运行。具体看html源文件,看生成的控件是什么类型。


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58

Session默认存在服务器的内存上,易丢失。可存在别的当前服务器之外的电脑上,或存入sql server这样即使服务器重启也不会丢失。

Asp.net 默认配置下,Session莫名丢失的原因及解决办法
正常操作情况下Session会无故丢失。因为程序是在不停的被操作,排除Session超时的可能。另外,Session超时时间被设定成60分钟,不会这么快就超时的。

这次到CSDN上搜了一下帖子,发现好多人在讨论这个问题,然后我又google了一下,发现微软网站上也有类似的内容。

现在我就把原因和解决办法写出来。


原因:
由于Asp.net程序是默认配置,所以Web.Config文件中关于Session的设定如下:
<sessionState mode=’InProc’ stateConnectionString=’tcpip=127.0.0.1:42424‘ sqlConnectionString=’data source=127.0.0.1;Trusted_Connection=yes’ cookieless=’true’ timeout=’60’/>

我们会发现sessionState标签中有个属性mode,它可以有3种取值:InProc、StateServer?SQLServer(大小写敏感) 。默认情况下是InProc,也就是将Session保存在进程内(IIS5是aspnet_wp.exe,而IIS6是W3wp.exe),这个进程不稳定,在某些事件发生时,进程会重起,所以造成了存储在该进程内的Session丢失。

哪些情况下该进程会重起呢?微软的一篇文章告诉了我们:
1、配置文件中processModel标签的memoryLimit属性
2、Global.asax或者Web.config文件被更改
3、Bin文件夹中的Web程序(DLL)被修改
4、杀毒软件扫描了一些.config文件。
更多的信息请参考PRB: Session variables are lost intermittently in ASP.NET applications

解决办法:
前面说到的sessionState标签中mode属性可以有三个取值,除了InProc之外,还可以为StateServer、SQLServer。这两种存Session的方法都是进程外的,所以当aspnet_wp.exe重起的时候,不会影响到Session。

现在请将mode设定为StateServer。StateServer是本机的一个服务,可以在系统服务里看到服务名为ASP.NET State Service的服务,默认情况是不启动的。当我们设定mode为StateServer之后,请手工将该服务启动。

这样,我们就能利用本机的StateService来存储Session了,除非电脑重启或者StateService崩掉,否则Session是不会丢的(因Session超时被丢弃是正常的)。

除此之外,我们还可以将Session通过其他电脑的StateService来保存。具体的修改是这样的。同样还在sessionState标签中,有个stateConnectionString=’tcpip=127.0.0.1:42424’属性,其中有个ip地址,默认为本机(127.0.0.1),你可以将其改成你所知的运行了StateService服务的电脑IP,这样就可以实现位于不同电脑上的Asp.net程序互通Session了。

如果你有更高的要求,需要在服务期重启时Session也不丢失,可以考虑将mode设定成SQLServer,同样需要修改sqlConnectionString属性。关于使用SQLServer保存Session的操作,请访问这里。

在使用StateServer或者SQLServer存储Session时,所有需要保存到Session的对象除了基本数据类型(默认的数据类型,如int、string等)外,都必须序列化。只需将[Serializable]标签放到要序列化的类前就可以了。
如:
[Serializable]
public class MyClass
{
??? ……
}
具体的序列化相关的知识请参这里。

至此,问题解决。
关于asp.net Session丢失问题的总结
asp中Session的工作原理:
asp的Session是具有进程依赖性的。ASP Session状态存于IIS的进程中,也就是inetinfo.exe这个程序。所以当inetinfo.exe进程崩溃时,这些信息也就丢失。另外,重起或者关闭IIS服务都会造成信息的丢失。

asp.net Session的实现
asp.net的Session是基于HttpModule技术做的,HttpModule可以在请求被处理之前,对请求进行状态控制,由于Session本身就是用来做状态维护的,因此用HttpModule做Session是再合适不过了。

原因1:
bin目录中的文件被改写,asp.net有一种机制,为了保证dll重新编译之后,系统正常运行,它会重新启动一次网站进程,这时就会导致Session丢失,所以如果有access数据库位于bin目录,或者有其他文件被系统改写,就会导致Session丢失

原因2:
文件夹选项中,如果没有打开“在单独的进程中打开文件夹窗口”,一旦新建一个窗口,系统可能认为是新的Session会话,而无法访问原来的Session,所以需要打开该选项,否则会导致Session丢失

原因3:
似乎大部分的Session丢失是客户端引起的,所以要从客户端下手,看看cookie有没有打开

原因4:
Session的时间设置是不是有问题,会不会因为超时造成丢失

原因5:
IE中的cookie数量限制(每个域20个cookie)可能导致session丢失

原因6:
使用web garden模式,且使用了InProc mode作为保存session的方式

解决丢失的经验
1. 判断是不是原因1造成的,可以在每次刷新页面的时候,跟踪bin中某个文件的修改时间
2. 做Session读写日志,每次读写Session都要记录下来,并且要记录SessionID、Session值、所在页面、当前函数、函数中的第几次Session操作,这样找丢失的原因会方便很多
3. 如果允许的话,建议使用state server或sql server保存session,这样不容易丢失
4. 在global.asa中加入代码记录Session的创建时间和结束时间,超时造成的Session丢失是可以在SessionEnd中记录下来的。
5. 如果有些代码中使用客户端脚本,如javascript维护Session状态,就要尝试调试脚本,是不是因为脚本错误引起Session丢失


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58

1, string cc = @”http://www.baidu.com/s?wd=“;
?? cc = cc+ HttpUtility.UrlEncode(“郑雪松”, System.Text.UnicodeEncoding.GetEncoding(“GB2312”));
?
2,解出url: System.Web.HttpUtility.UrlDecode(url, System.Text.UnicodeEncoding.GetEncoding(“GB2312”));
?? google用:System.Web.HttpUtility.UrlDecode(bb);? 不指定编码格式

UrlEncode 加密 UrlDecode解密就可防止页面按自己设置的编码格式转换,出现乱码问题
3,

百度搜索命令中的参数

必备参数:

wd??查询的关键词(Keyword)

oq??上一次查询的关键词(Keyword)

pn??显示结果的页数(Page Number)

cl??搜索类型(Class),cl=3为网页搜索

可选参数:

rn??搜索结果显示条数(Record Number),取值范围在10–100条之间,缺省设置rn=10

ie??查询输入文字的编码(Input Encoding),缺省设置ie=gb2312,即为简体中文

tn??提交搜索请求的来源站点

tn=baidulocal 表示百度站内搜索,返回的结果很干净,无广告干扰.

tn=baiducnnic 想把百度放在框架中吗?试试这个参数就可以了,是百度为Cnnic定制的

si??在限定的域名中搜索,比如想在sofuc.com的站内搜索可使用参数si=sofuc.com,要使这个参数有效必须结合ct参数一起使用.

ct??此参数的值一般是一串数字,估计应该是搜索请求的验证码

si和ct参数结合使用,比如在sofuc.com中搜索”wordpress”,可用:http://www.baidu.com/s?q=& amp;ct=2097152&si=sofuc.com&ie=gb2312&cl=3&wd=wordpress

bs??上一次搜索的关键词(Before Search),估计与相关搜索有关


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58

右键点 Microsoft Visual SourceSafe 启动的快捷方式,属性,修改目标栏

  用 -y 参数输入用户名和密码(无密码的可以只输入和用户名,在-y之前加个空格)
 如:
“C:\Program Files\Microsoft Visual SourceSafe\ssexp.exe” -yMyName,MyPassword


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58

1,传参与调用:
?SqlParameter[] storedParams = {
????????????????????????????????????????????? new SqlParameter(“@TranType”, “INSERT”),
??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ? new SqlParameter(“@RoleName”, _RoleEntity.RoleName),
????????????????????????????????????????????? new SqlParameter(“@description”, _RoleEntity.Description),
????????????????????????????????????????????? new SqlParameter(“@CreateBy”, _RoleEntity.CreateBy),
????????????????????????????????????????????? new SqlParameter(“@isValid”, _RoleEntity.IsValid),
??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ? new SqlParameter(“@isSystem”, _RoleEntity.IsSystem),???????????????????????????????????????????????????????????????????????????????????????????
????????????????????????????????????????????? //new SqlParameter(“@LastEditBy”, _RoleEntity.LastEditBy),
?????????????????????????????????????????????
????????????????????????????????????????? };

??????????????? _RoleEntity.ID = int.Parse(SqlHelper.ExecuteScalar(HelpConstant.DBCONN_STRING,
??????????????????? CommandType.StoredProcedure,?????? //指定按存储过程执行
??????????????????? “frmRole_save”,?????????????????????????????? //存储过程名称
??????????????????? storedParams).ToString());
传的参数小于等于存储过程指定的参数个数,不能有存储过程不存在的参数。

2,存储过程技巧
????? 1,AND OrderNo LIKE ISNULL(@OrderNo, ”) + ‘%’? // 有则查,无查全部
????? 2, AND CONVERT(varchar(10), OrderDate, 20) =, //AND 语句中加入选择!
??? ??? CASE(ISNULL(@OrderDate, ”))
??? ??? ??? WHEN ” THEN? CONVERT(varchar(10), OrderDate, 20)
??? ??? ??? ELSE @OrderDate END
上面的可直接换成下面方式:先计算出值再查询
?IF ( @CustomerName IS NULL )
??? BEGIN
??? ??? SET @CustomerName = ”
??? END
?IF ( @ShipDateEnd IS NULL OR @ShipDateEnd = ” )
??? BEGIN
??? ??? SET @ShipDateEnd = ‘2999-01-01′
??? END???

3, 右连接对指定的条件进行聚合
SELECT DISTINCT ACCOUNT, a.departmentid,sum(a.amount) as amount FROM bdOrder a
RIGHT JOIN permUserDepartment p
on a.SalesStaff = p.Account
AND a.orderstatus = ’07’
where?? a.DepartmentID is null or a.DepartmentID IN (SELECT DepartmentID FROM permUserDepartment(NOLOCK)??? WHERE Account = ‘sa’)? — 销售部门
group by account,a.departmentid
order by account,a.departmentid


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58

1,aspx文件:
<asp:UpdatePanel ID=”UpdatePanel2″ runat=”server”>
??????????????????????? <ContentTemplate>
??????????????????????????? <asp:TextBox ID=”txtModel” Text=”” runat=”server” Width=”130px” CssClass=”MustInputText”></asp:TextBox>
?????????????????????????? <asp:Panel CssClass=”ContainPanel” ID=”Panel2″ runat=”server”? Width=”130px”
??????????????????????????????? Style=”visibility: hidden” >
??????????????????????????????? <asp:GridView ID=”gdModel” runat=”server” ShowHeader=”False” BorderWidth=”0px” OnRowCreated=”gdModel_RowCreated”>
??????????????????????????????? </asp:GridView> //当可选时用GridView获取数据库数据,用来显示下拉框
??????????????????????????? </asp:Panel>
??????????????????????????
??????????????????????????? <cc1:DropDownExtender ID=”DropDownExtender2″ runat=”server” DropDownControlID=”Panel2″
??????????????????????????????? TargetControlID=”txtModel” Enabled=”true”>
??????????????????????????? </cc1:DropDownExtender>
??????????????????????????? <cc1:AutoCompleteExtender ID=”AutoCompleteExtender3″ runat=”server” TargetControlID=”txtModel”? CompletionInterval=”100″? //触发时间
??????????????????????????????? CompletionSetCount=”10″ EnableCaching=”true” MinimumPrefixLength=”1″ ServiceMethod=”GetModelList1″
??????????????????????????????? ServicePath=”~/WebService/AutoCompleteService.asmx”>
??????????????????????????? </cc1:AutoCompleteExtender>? //AutoComplete用来自动填充功能
??????????????????????? </ContentTemplate>
??????????????????? </asp:UpdatePanel>

注:DropDownExtender :用来在下拉时填充。主要是为TxtBox增加下拉功能,显示的内容来自 DropDownControlID, DropDownControlID用来指向用什么块显示,TargetControlID用来指向哪个控件触发,事件为点击。

?????? AutoCompleteExtender :用来输入时自动带出数据库中的相关提示。TargetControlID指向哪个控件触发,事件为输入。当输入时,调用webservice,执行ServiceMethod方法,返回string[]数组,用来显示下拉的内容如:
public string[] GetModelList1(string prefixText, int count)??????? //prefixText名称保持不变
??? {
??????? ProductBL _ProductBL = new ProductBL();
??????? SqlDataReader dr = _ProductBL.GetModelsByCategory(“乐知购”);
??????? DataTable dt = new DataTable();
??????? dt.Load( dr );
??????? List<String> Models = new List<string>(dt.Rows.Count);
??????? for (int i = 0; i < dt.Rows.Count; i++)
??????? {
??????????? Models.Add(dt.Rows[i][“Model”].ToString());
??????? }

??????? List<String> returnlist = new List<string>();
??????? foreach( string s in Models ){
??????????? if ( s.IndexOf(prefixText)!= -1 ){
??????????????? returnlist.Add(s);
??????????? }
??????? }
???????
??????
??????? return returnlist.ToArray();
??? }

注:(1)要想用此控件,要引入AjaxControlToolkit.dll
?????? (2)页面上放置: <asp:ScriptManager ID=”ScriptManager1″ runat=”server”>? </asp:ScriptManager>

2, 两个控件都启作用时会乱,一般进行控制,当一定条件时enabled = false;


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58

DateTime.Now.ToString(“yyyy-MM-dd”);??????????????? //2009-08-14
DateTime.Now.ToString(“yyyy/MM/dd HH:mm:ss”); //2009-08-14 15:57:12″

ToString 按指定形式转换 DateTime.Now.ToString(“aaaaa”) ; 输出aaaaa 除非在参数中指定了特定的格式。如:
年:yyyy 2009, yyy 2009, yy 09, y 9
月: MM 08 (不是mm的原因是mm代表时间中的分钟)
日:dd: 14
时:HH: 16 (以24小时制) hh:04 (12小时制)
分:mm
秒:ss

即时间控制都用小写,除非是重合的MM与mm, 及小时。

//2009年09月18 17时55分48秒
? System.DateTime.Now.ToString(“yyyy年MM月dd HH时mm分ss秒”);

??? 12345.ToString(“n”); //生成 12,345.00
??? 12345.ToString(“C”); //生成 ¥12,345.00
??? 12345.ToString(“p”); “1,234,500.00%”


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58

DataAdapter:? 获取数据库中的数据
DataSet, SqlDateReader, DataTable存储DataAdapter得来的数据。

1,通过 DataAdapter 使用数据源中的数据生成和填充 DataSet 中的每个 DataTable。
??? SqlDataAdapter da = new SqlDataAdapter(cmd);
??? DataSet ds = new DataSet(); da.Fill(ds);

2, SqlDataReader的创建必须调用 SqlCommand 对象的 ExecuteReader方法,而不是用new

DataSet与DataReader区别:

  • DataReader使用时始终占用SqlConnection,在线操作数据库.DataSet则是将数据一次性加载在内存 中.支持数据库访问的断开连接模型.
  • DataReader每次只在内存中加载一条数据,节约内存.DataSet将数据全部加载在内存中.比较消耗内存.
  • DataReader单向只读.DataSet支持查询\修改\删除等操作,比较灵活.
  • DataReader提供了快速向前的游标风格的数据访问,故不能用来分页,分页时要转为DataTable
  • DataReader从名称就可看出数据是只读的
  • DataReader与 SqlCommand搭配.DataSet与DataAdapter 结合使用.

3,DataSet, DataReader数据的读取
??? (1)
????? DataSet利用DataTable读取
???????? DataTable dt =DataSet1Tables[0];
????????
??????????? foreach (DataRow row in dt.Rows)
??????????? {
??????????????? Console.wirte(row[“Name”] );
??????????? }

??? (2)
? ? ?? MySqlDataReader dr = _newsDA.GetData(1, 3, 0);
???????? while (dr.Read()){
? ? ? ? ? ? Console.wirte(dr[“Name”]);
???????????????????????? // 或者dr[“0”], dr.GetInt32(0);指定类型返回
???? }?
???? (3)
? ? ?? DataReader也可用DataTable读取
???? ? DataTable dt = new DataTable();
?????? dt.Load( DataReader1 );
???? load:用DataReader数据源的值填充 DataTable。如果 DataTable 已经包含行,则从数据源传入的数据将与现有的行合并。

4, DataTable 与 DataView
利用DataView可对数据进行排序,筛选,并保存结果视图。
?DataView DV = dt.DefaultView;
?DV.Sort = “department, amount desc”;

5, GridView 的DataSource 可以是DataSet, DataReader, DataTable, DataView


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58

1,DataTable dt = GetData(iPageSize, iPageIndex).Tables[0];? //GetData(iPageSize, iPageIndex)返回DataSet
? dt.Columns.Add(“Detail”);? //增加栏位? 注意的一点是dt的列名大小写不敏感,源于sql语句大小写不敏感
??????????? foreach (DataRow row in dt.Rows)
??????????? {
??????????????? row[“Detail”] =”123″
??????????? }
??????????? return dt;
GridView1DataSource = dt;? //gridview datasource可以是dataset, 也可以是datatable
? //dt.Columns.Add(“Detail”); Detail默认为string类型,指定类型可用:
? ? ?? DataColumn column = new DataColumn(“pageBy”);
??????? column.DataType = System.Type.GetType(“System.Int32”);
??????? column.AutoIncrement = true;
??????? column.AutoIncrementSeed = 0;
??????? column.AutoIncrementStep = 1;
?????? column.DefaultValue = 0;
??????? dt.Columns.Add(column);

加列
?DataRow srow = dt.NewRow();
??????????????? row[“OrderStatus”] = row[“OrderStatus”].ToString();
??????????????? row[“OrderNums”] = 1;
??????????????? row[“OrderAmounts”] = row[“Amount”].ToString();
?????????????? sdt.Rows.Add(srow);
2,排序
?DataView DV = dt.DefaultView;
?DV.Sort = “department, amount desc”;
//排序时注意的一点是列的类型,如amount若是string型,就不会按数字排序

//datatable是内存中的表,这个表可以增加,删除,update记录的,而dataview只是相当于视图,基本上是用来显示数据的,? 用于排序、筛选、搜索、编辑和导航的 DataTable 的可绑定数据的自定义视图。

?执行聚合函数:如sum,count
dt.Compute(“Sum(Total)”, “EmpID = 5”);
dt.Compute(“Sum(fenshu)”,”1=1″);?
注意没有count(*) count(1) 要指定具体的列
Sum(expression)中expression要注意的是:
1,expression这个参数中的列名不能是数字开头,否则就会报这个错。(这个很难排查出来。。。)
2,expression参数中字段的数据类型问题,例如Sum(字符类型)就会报这个错。

3,查询,取部分数据集
?? ?string expression = “Date > ‘1/1/00′”;
?? ?string sortOrder = “CompanyName DESC”;
?? ?DataRow[] foundRows = table.Select(expression, sortOrder); //查询带排序
?? (1)取部分行
?DataView davTemp = new DataView(datSource, “过滤条件”, “排序字段”, DataViewRowState.各种 状态);
//把过滤后的表赋给新表
DataTable datNew = davTemp.ToTable();
(2)取部分列
DataTable dat = YourDataTable.DefaultView.ToTable(false, new string[] { “你要的列名”, “你要的列名” });
false : 不去掉重复行
(3)删除列
YourDataTable.Columns.Remove(“列名”);

4,设主键
?? DataTable dt = new DataTable();
??????? dt.Columns.Add(“id”);
??????? dt.Columns.Add(“PartName”);
??????? dt.Columns.Add(“Style”);
??????? dt.Columns.Add(“quantity”);
??????? dt.Columns.Add(“Unit”);
??????? DataColumn dc1 = new DataColumn(“Amount”,typeof(float));
??????? dtAll.Columns.Add(dc1);
??????? //增加主键
??????? DataColumn[] columns = new DataColumn[2];
??????? columns[0] = dt.Columns[“id”];
??????? columns[1] = dt.Columns[“Style”];
??????? dt.PrimaryKey = columns;

按主键查询:
? object[] findTheseVals = new object[2];
?? findTheseVals[0] = id;
?? findTheseVals[1] = Style;
?? DataRow dr = dt.Rows.Find(findTheseVals);

两个DataTable合并: merge
dt1.Merge(dt2,true);
//true指示当dt2存在与dt1相同的主键值时dt1是否不修改,当为false时用dt2更新dt1, 要牢记的是同一个table中主键必须要保持唯一,若只想两个table简单的合在一起,那要在merge之前将两个DataTable的主键去掉,如:dt1.PrimaryKey = null;

DISTINCT

DataTable dataTable;

DataView dataView = dataTable.DefaultView;

DataTable dataTableDistinct = dataView.ToTable(true,”FieldName1″,”FieldName2″,”…”);

//注:其中ToTable()的第一个参数为是否DISTINCT
1,DataTable dt = GetData(iPageSize, iPageIndex).Tables[0];? //GetData(iPageSize, iPageIndex)返回DataSet
? dt.Columns.Add(“Detail”);? //增加栏位? 注意的一点是dt的列名大小写不敏感,源于sql语句大小写不敏感
??????????? foreach (DataRow row in dt.Rows)
??????????? {
??????????????? row[“Detail”] =”123″
??????????? }
??????????? return dt;
GridView1DataSource = dt;? //gridview datasource可以是dataset, 也可以是datatable
? //dt.Columns.Add(“Detail”); Detail默认为string类型,指定类型可用:
? ? ?? DataColumn column = new DataColumn(“pageBy”);
??????? column.DataType = System.Type.GetType(“System.Int32”);
??????? column.AutoIncrement = true;
??????? column.AutoIncrementSeed = 0;
??????? column.AutoIncrementStep = 1;
?????? column.DefaultValue = 0;
??????? dt.Columns.Add(column);

加列
?DataRow srow = dt.NewRow();
??????????????? row[“OrderStatus”] = row[“OrderStatus”].ToString();
??????????????? row[“OrderNums”] = 1;
??????????????? row[“OrderAmounts”] = row[“Amount”].ToString();
?????????????? sdt.Rows.Add(srow);
2,排序
?DataView DV = dt.DefaultView;
?DV.Sort = “department, amount desc”;
//排序时注意的一点是列的类型,如amount若是string型,就不会按数字排序

//datatable是内存中的表,这个表可以增加,删除,update记录的,而dataview只是相当于视图,基本上是用来显示数据的,? 用于排序、筛选、搜索、编辑和导航的 DataTable 的可绑定数据的自定义视图。

?执行聚合函数:如sum,count
dt.Compute(“Sum(Total)”, “EmpID = 5”);
dt.Compute(“Sum(fenshu)”,”1=1″);?
注意没有count(*) count(1) 要指定具体的列
Sum(expression)中expression要注意的是:
1,expression这个参数中的列名不能是数字开头,否则就会报这个错。(这个很难排查出来。。。)
2,expression参数中字段的数据类型问题,例如Sum(字符类型)就会报这个错。

3,查询,取部分数据集
?? ?string expression = “Date > ‘1/1/00′”;
?? ?string sortOrder = “CompanyName DESC”;
?? ?DataRow[] foundRows = table.Select(expression, sortOrder); //查询带排序
?? (1)取部分行
?DataView davTemp = new DataView(datSource, “过滤条件”, “排序字段”, DataViewRowState.各种 状态);
//把过滤后的表赋给新表
DataTable datNew = davTemp.ToTable();
(2)取部分列
DataTable dat = YourDataTable.DefaultView.ToTable(false, new string[] { “你要的列名”, “你要的列名” });
false : 不去掉重复行
(3)删除列
YourDataTable.Columns.Remove(“列名”);

4,设主键
?? DataTable dt = new DataTable();
??????? dt.Columns.Add(“id”);
??????? dt.Columns.Add(“PartName”);
??????? dt.Columns.Add(“Style”);
??????? dt.Columns.Add(“quantity”);
??????? dt.Columns.Add(“Unit”);
??????? DataColumn dc1 = new DataColumn(“Amount”,typeof(float));
??????? dtAll.Columns.Add(dc1);
??????? //增加主键
??????? DataColumn[] columns = new DataColumn[2];
??????? columns[0] = dt.Columns[“id”];
??????? columns[1] = dt.Columns[“Style”];
??????? dt.PrimaryKey = columns;

按主键查询:
? object[] findTheseVals = new object[2];
?? findTheseVals[0] = id;
?? findTheseVals[1] = Style;
?? DataRow dr = dt.Rows.Find(findTheseVals);

两个DataTable合并: merge
dt1.Merge(dt2,true);
//true指示当dt2存在与dt1相同的主键值时dt1是否不修改,当为false时用dt2更新dt1, 要牢记的是同一个table中主键必须要保持唯一,若只想两个table简单的合在一起,那要在merge之前将两个DataTable的主键去掉,如:dt1.PrimaryKey = null;

DISTINCT

DataTable dataTable;

DataView dataView = dataTable.DefaultView;

DataTable dataTableDistinct = dataView.ToTable(true,”FieldName1″,”FieldName2″,”…”);

//注:其中ToTable()的第一个参数为是否DISTINCT


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58
原理:在DataTable中构造一个pageBy 自增字段,, 根据页面传来的值查出当前行对应的pageBy,那么减1就是上一条,加1就是上一条, 实际是为DataTable的Row实现索引。
1,构造索引:pageBy
        DataTable pd = dt.Clone();  //dt为数据表
        DataColumn column = new DataColumn("pageBy");
        column.DataType = System.Type.GetType("System.Int32");
        column.AutoIncrement = true;
        column.AutoIncrementSeed = 1;
        column.AutoIncrementStep = 1;
        pd.Columns.Add(column);
        DataColumn[] columns = new DataColumn[1];
        columns[0] = column;
        pd.PrimaryKey = columns;
        
        foreach (DataRow dr in dt.Rows) {
            pd.ImportRow(dr);  //引入数据
        }
  Session["pageData"] = pd; //存入Session中,以便查询

2,列表页面传来选中行的实际id, 查出pageBy
        DataTable dt = (DataTable)Session["pageData"];
        DataRow[] drs = new DataRow[1];
        drs = dt.Select("id=" + allocateid);   //根据页面传来的id查出pageBy
        if (drs.Length > 0)
        {
            int pageIndex = int.Parse(drs[0]["pageBy"].ToString());
            //上一页Callback.aspx?allocateid=226&customerid=67
            drs = dt.Select("pageBy=" + (pageIndex -1).ToString() );
            if (drs.Length <= 0)
            {
                hlPrevious.Text = "上一条:没有了";
            }
            else {
                hlPrevious.Text = "上一条:" + drs[0]["CustomerName"].ToString();
                hlPrevious.NavigateUrl = "Callback.aspx?allocateid=" + drs[0]["id"] + "&customerid=" + drs[0]["CustomerID"];
            }
            //下一页
            drs = dt.Select("pageBy=" + (pageIndex + 1).ToString());
            if (drs.Length <= 0)
            {
                hlNext.Text = "下一条:没有了";
            }
            else
            {
                hlNext.Text = "下一条:" + drs[0]["CustomerName"].ToString();
                hlNext.NavigateUrl = "Callback.aspx?allocateid=" + drs[0]["id"] + "&customerid=" + drs[0]["CustomerID"];
            }


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58

<% # Eval(“Name”) %>
<% # Bind(“Name”) %>

eval:。在运行时,Eval 方法调用 DataBinder 对象的 Eval 方法,等同于:DataBinder.Eval(Container.DataItem, “Address”)
方法在运行时使用反射执行后期绑定计算,因此与标准的ASP.NET数据绑定方法bind相比,会导致性能明显下降。它一般用在绑定时需要格式化字符串的情况下。多数情况尽量少用此方法

Eval?方法是静态(只读)方法,该方法采用数据字段的值作为参数并将其作为字符串返回。、Bind?方法支持读/写功能,可以检索数据绑定控件的值并将任何更改提交回数据库。

比较:
<asp:LinkButton ID=”lbnReturnToday” runat=”server”
Enabled? = ‘<%#? Eval( “account” ).Equals(“lichong”)?false:true %>’ CommandName=”returnAllocateToday” CommandArgument='<%# Eval(“account”) %>’>回收当天分配</asp:LinkButton>


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58

1,  <asp:HyperLinkField DataTextField="CustomerName" DataNavigateUrlFields="id,CustomerName" DataNavigateUrlFormatString="~/Customer/CustomerDetail.aspx?CustomerID={0}&CustomerName={1}"                             HeaderText="顾客姓名" /> 生成带超连接的一行信息, id, CustomerName为数据源中的字段,它们将分别填充到{0},{1}位置,DataTextField:指定链接显示的字段 带修改之类的可加button  <asp:LinkButton ID="lbtnEdit" runat="server" Text="修改" CommandName="Edit" CommandArgument='<%# Eval("orderno") %>'>                                                                                           </asp:LinkButton> CommandName  为要执行的方法。

2,LinkButton  传多个参数:                   <asp:TemplateField HeaderText="销售人员" ItemStyle-HorizontalAlign="Left" ItemStyle-Width="12%">                     <ItemTemplate>                         <asp:LinkButton ID="lbtnCConfirm" runat="server" Text='<%# Eval("SalesStaff") %>'                             CommandName="StaffShow" CommandArgument=<%# Eval("id")+","+Eval("SalesStaff") %> >                                                                                   </asp:LinkButton>                     </ItemTemplate>                 </asp:TemplateField>      <asp:Button ID="btnSave" runat="server" Text="保存" CssClass="btn2" /> 后台在gvTotal_RowCommand方法中通过e.CommandArgument.ToString().Split(',')来分开。 asp:Button 与上类似,若想用CommandArgument传参,可在其onCommand中接收,而不是在onClick事件中。 利用onCommand的原因是:页面中有许多button,想在同一个方法中处理其点击事件,可令每个按纽的onCommnad指向同一个方法,并设置CommandArgument参数,这样在onCommnad中就可依据此参数来对不同的按纽做相应的操作,达到集中处理的目的。 注:若是在GridView中,多个onCommand可指向同一个自定义事件,或者利用GridView提供的gvTotal_RowCommand方法也可,其实是同一个。 Eval:  CommandArgument=<%# Eval("OrderNo") + "," + Container.DataItemIndex %> /> DataItemIndex 传当前行号 注:HyperLink传参为: <asp:HyperLink ID="hlDetail" runat="server" NavigateUrl='<%# "followhistoryrecord.aspx?allocateid="+ Eval("id")%>'>明细..</asp:HyperLink>

3, 利用TemplateField引用非数据源控件   (1) <asp:GridView ID="gdCancel" runat="server" AutoGenerateColumns="False"             CssClass="grid" onrowcreated="gdCancel_RowCreated" DataKeyNames="id" Height="80%">         <HeaderStyle CssClass="gridHeader"></HeaderStyle>         <RowStyle CssClass="gridItem" />         <Columns>               <asp:TemplateField HeaderText="选择" >                  <ItemStyle Width="25%" HorizontalAlign="Center" />                   <ItemTemplate>                     <asp:CheckBox ID="chkItem" runat="server" onclick="Select(this);"/>                   </ItemTemplate>      </asp:TemplateField>   </Columns>         </asp:GridView> 注:也可加在标题处         <asp:TemplateField ItemStyle-BorderColor="Black" ItemStyle-BorderWidth="1" HeaderStyle-BorderWidth="1" HeaderStyle-BorderColor="Black">                                         <ItemStyle Width="5%" HorizontalAlign="Center" />                                         <HeaderTemplate>                                           <%–  <input type="checkbox" id="chkAll1" onclick="CheckAll( this );" />–%>                                           选择                                         </HeaderTemplate>                                         <ItemTemplate >                                             <asp:CheckBox ID="chkItem" runat="server" />                                         </ItemTemplate>                                     </asp:TemplateField>. /*选择所有 checkbox */ function CheckAll(chkAll)     {           var obj = document.aspnetForm.getElementsByTagName("input");         // var chck1 = document.getElementById( "chkAll1" );         // var chck2 = document.getElementById( "chkAll2" );         // chck1.checked = chkAll.checked;         // chck2.checked = chck1.checked;                            for (var i=0;i<obj.length;i++)             {                             var e = obj[i];                 if (e.id.indexOf("chkItem")>=0 && e.type=="checkbox")                     e.checked = chkAll.checked;             }                                 } (2) 在类文件中操作此控件可用:   CheckBox ck  = (CheckBox)gdCancel.Rows[i].FindControl("chkItem"); 得到每行数据的主键可用:gdCancel.DataKeys[i].Value.ToString())            DataKeys 用DataKeyNames指定 (3) //遍历   foreach (GridViewRow vr in gdCustomer.Rows) {                 foreach( TableCell tc in vr.Cells ){                     Console.Write(tc.Text);        //此时的Cell为控件,可设置背景等属性                 }                 }                }           //GridView只是一个数据显示控件,不是数据存储控件如:DataSet,故它可抓取的数据是它所能显示的数据。 (4) 获取当前行的数据:   if (e.Row.RowType == DataControlRowType.DataRow) {                //e:GridViewRowEventArgs      gdCancel.Rows[gdCancel.SelectedIndex].Cells[1].Text } 注:DataControlRowType:数据控件中行的类型,只有DataRow才会有数据  Header 数据控件的标题行。标题行不能绑定数据。  Footer 数据控件的脚注行。脚注行不能绑定数据。  DataRow 数据控件的数据行。只有 DataRow 行能绑定数据。  Separator 行分隔符。行分隔符不能绑定数据。  Pager 显示页按钮或页导航控件的行。页导航行不能绑定数据。  EmptyDataRow 显示页按钮或页导航控件的行。页导航行不能绑定数据。

4, 为行增加动作。如鼠标经过时变色:  protected void gdCancel_RowCreated(object sender, GridViewRowEventArgs e)     {         if (e.Row.RowType == DataControlRowType.DataRow) {             e.Row.Attributes.Add("onmouseover", "c=this.style.backgroundColor;d=this.style.color;this.style.backgroundColor='#348E37';this.style.color='#ffffff';");             e.Row.Attributes.Add("onmouseout", "this.style.backgroundColor=c;this.style.color=d;");            //e.Row.Attributes.Add("style", "background-color:red");         }     }

5,根据逻辑在数据绑定时做一些事情  protected void gdCustomer_RowDataBound(object sender, GridViewRowEventArgs e)     {         if (e.Row.RowType == DataControlRowType.DataRow)         {             LinkButton lbtnEdit = (LinkButton)e.Row.FindControl("lbtnEdit");             if (OperateType == "FIRST" && ddlCustomerType.SelectedItem.Value.Trim().IndexOf("distribute") < 0)             {                 lbtnEdit.Enabled = false;             }         }     } 注:在页面级处理的方法为:<%# DataBinder.Eval(Container.DataItem, "DepartmentId").ToString() == "6" ? "增值服务部" : "客户发展部    "%> 控制日期显示长度:<%# DataBinder.Eval(Container.DataItem, "OrderDate", "{0:yyyy-MM-dd}")%>       等同于<% # Eval(“OrderDate”, “{0:yyyy-MM-dd}” ) %> 控制字符串长度  <ItemStyle HorizontalAlign="Left" Width="15%"></ItemStyle>                                 <ItemTemplate>                                     <%# MySubString(DataBinder.Eval(Container.DataItem, "Address"),10)%>                                                                             </ItemTemplate>                             </asp:TemplateField> 在程序中定义MySubString方法进行处理 <%# DataBinder.Eval(Container.DataItem, "DepartmentId").ToString() == "6" ? "增值服务部" : "客户发展部    "%> 等同于<%# Eval("DepartmentId")%>  控制字段显示与否   gdCustomer.Columns[8].Visible = false;

6,GridView存额外数据,以备后用 当数据源绑定GridView时提供的数据只是GridView用DataField,或Eval指定的数据,若想存其它数据变通的方法是:   <asp:TemplateField HeaderText="广告来源">                 <ItemStyle Width="10%"></ItemStyle>                 <ItemTemplate>                  <asp:HiddenField Value=<%# Eval( "ADSource" ) %> runat=server ID="ADSource"/>                   <asp:DropDownList ID="ddlADSource" runat="server"></asp:DropDownList>                 </ItemTemplate>             </asp:TemplateField> 利用HiddenField存储数据, 在程序中通过((HiddenField)e.Row.FindControl("ADSource")).Value 来得到数据。 注:指定一BoundField,将其Visible设为false的方式是不行的,不会存储起数据。

7, 分页 GridView在分页状态下显示的数据条数为pagesize,而不是整个数据

8,根据逻辑显示若隐藏一列:dgOrder.Columns[9].Visible = false;隐藏之后无论查询的数据集中有没有相应的字段,都不会出错。 即:当将GridView的某一数据感应控件设为Visible之后,此控件将不参与GridView的DataBind方法。

9,编辑更新数据 (1)在gridview:AutoGenerateEditButton="True" 会自动生成编辑按纽,点编辑之后会将一行变成txtbox可编辑状态,编辑按纽变成取消与更新两个按纽,要添加相应的事件  //自动产生的按纽格式不要调整,可将AutoGenerateEditButton="False",同样为gridview增加OnRowEditing,OnRowCancelingEdit,OnRowUpdating事件,同时在每一行中增加<asp:TemplateField><ItemTemplate><asp:LinkButtonID="btnEdit" runat="server" CommandName="Edit" Text="修改" />         <asp:LinkButtonID="btnSave" runat="server" CommandName="Update" Text="保存" /></ItemTemplate></asp:TemplateField>   只要CommandName为对应的edit,update,cancel那么它们就会自动调用相应的 OnRowEditing,OnRowCancelingEdit,OnRowUpdating方法,同自动产生的按纽一样,不过更加灵活!

10,  OnClientClick传值时要将js函数写在Eval内: OnClientClick='<%# Eval("name","alert(\"{0}\")") %>' >   protected void gdCustomer_RowEditing(object sender, GridViewEditEventArgs e)     {    //编辑         gdCustomer.EditIndex = e.NewEditIndex;         BindGrid();     } protected void gdCustomer_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)     {         //取消编辑状态         gdCustomer.EditIndex = -1;         BindGrid();     } protected void gdCustomer_RowUpdating(object sender, GridViewUpdateEventArgs e)     {         //更新        sqlcon = new SqlConnection(strCon);         string sqlstr = "update 表 set 字段1='"             + ((TextBox)(GridView1.Rows[e.RowIndex].Cells[1].Controls[0])).Text.ToString().Trim() + "',字段2='"             + ((TextBox)(GridView1.Rows[e.RowIndex].Cells[2].Controls[0])).Text.ToString().Trim() + "',字段3='"             + ((TextBox)(GridView1.Rows[e.RowIndex].Cells[3].Controls[0])).Text.ToString().Trim() + "' where id='"             + GridView1.DataKeys[e.RowIndex].Value.ToString() + "'";         sqlcom=new SqlCommand(sqlstr,sqlcon);         sqlcon.Open();         sqlcom.ExecuteNonQuery();         sqlcon.Close();         gdCustomer.EditIndex = -1;         BindGrid();     } 注:若想指定某几行不可编辑可采用如下方式: (1)对指定的不可编辑的行做处理  protected void gdCustomer_RowDataBount(object sender, GridViewRowEventArgs e) {         if (e.Row.RowType == DataControlRowType.DataRow) {             if ("回访完毕".Equals(e.Row.Cells[2].Text))             {                 e.Row.Attributes.Add("disabled", "true"); //disabled这个属性会将一行设置成灰色             }         }     } (2)获取处理的方式:  protected void gdCustomer_RowEditing(object sender, GridViewEditEventArgs e)     {         foreach (string s in gdCustomer.Rows[e.NewEditIndex].Attributes.Keys)         {             if ("disabled".Equals(s)) {                 return;             }         }         gdCustomer.EditIndex = e.NewEditIndex;         BindGrid();     }

11. 加汇总 1)指定显示foot (ShowFooter="true" ),2)计算汇总数据 protected void gvEmployee_RowDataBound(object sender, GridViewRowEventArgs e) if (e.Row.RowType == DataControlRowType.Footer) { e.Row.Cells[0].Text = "统计:"; e.Row.Cells[8].Text = dt.Compute("sum(Quantity)", "").ToString(); e.Row.Cells[9].Text = dt.Compute("sum(PresentPrice2)", "").ToString(); //e.Row.Cells[3].Text = dt.Compute("sum(InPrice)", "").ToString(); //e.Row.Cells[4].Text = dt.Compute("sum(cbPrice)", "").ToString(); //e.Row.Cells[5].Text = dt.Compute("sum(OutPrice)", "").ToString(); //e.Row.Cells[6].Text = dt.Compute("sum(salePrice)", "").ToString(); } }

12 空数据时显示提示-EmptyDataText属性
dgOrder.EmptyDataText = string.Format("{0}不存在!", txtPackageNo.Text.Trim());


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58

1,aspx是界面,其上控件可直接在.aspx.cs上直接用,前提是有 runat=”server”
如:, 那么在.cs这个类文件中可直接用txtCustomer来操作此控件
如:txtCustomer.value = “asong”

2, .cs内编写的函数可直接在aspx上应用。如.cs有一个取格式化数据的方法,FormatingStr, 则可在界面上用如下方式:
<%# FormatString(Eval("customer"), 4)%>: