技巧C#
1. 在CallBack之后保持滚动条的位置:
在Asp.Net1.1中,CallBack之后保持滚动条的位置是一件非常痛苦的事情,特别是页中有一个Grid并且想要编辑特定的行。为了不停留在想要得行,页面会重新加载并且必须在顶部向下滚动。在ASP2.0中,只需要简单的在页面的属性中加入MaintainScrollPostionOnPostBack属性即可
<%@ Page Language="C#"
MaintainScrollPositionOnPostback="true" AutoEventWireup="true"
CodeFile="" Inherits=""%>
2. 匿名委托实现自定义排序
public void SortByCommentCount(List<Article>
articleList, bool ascending)
{
articleList.Sort(delegate(Article
a, Article b)
{
return
(a.CommentCount - b.CommentCount) * (ascending ? 1 : -1);
});
}
3. Readonly是运行时常量,Const是编译时常量;前者灵活,后者高效;前者可以用于任何类型,后者只能用于数字和字符串
4. 获得客户端计算机名称
System.Net.Dns.GetHostEntry(Request.UserHostName).HostName;
5. 常用集合:
CollectionsUtil 创建忽略字符串大小写的集合。
HybridDictionary 在集合较小时,使用 ListDictionary 来实现 IDictionary,然后当集合变大时,切换到 Hashtable。
ListDictionary 使用单链接列表实现 IDictionary。建议用于通常包含 10 个或 10 个以下项的集合。
NameObjectCollectionBase 为关联的 String 键和 Object 值的集合(可通过键或索引来访问它)提供 abstract 基类。
NameObjectCollectionBase.KeysCollection 表示集合的 String 键的集合。
NameValueCollection 表示可通过键或索引访问的关联 String 键和 String 值的集合。
OrderedDictionary 表示根据键/索引排序的键/值对的集合。
StringCollection 表示字符串集合。
StringDictionary 将键和值强类型化为字符串而不是对象来实现哈希表。
6. ListDictionary、Hashtable、HybridDictionary
小数据量: ListDictionary优于Hashtable,10个或10个以下
大数据量: Hashtable优于ListDictionary,10个以上为大
不确定数据量:HybridDictionary,能化的决定你的数据该用ListDictionary存储还是Hashtable存储
以上三个,都属hashtable,那Dictionary与他们有什么不同呢?
Dictionary<>:单线程程序中推荐使用,有泛型优势, 且读取速度较快, 容量利用更充分,有按插入顺序排列数据的特性 (注: 但当调用 Remove() 删除过节点后顺序被打乱), 因此在需要体现顺序的情境中使用 Dictionary 能获得一定方便
Hashtable:默认的 Hashtable 允许单线程写入,
多线程读取, 对 Hashtable 进一步调用 Synchronized() 方法可以获得完全线程安全的类型. 而 Dictionary 非线程安全, 必须人为使用 lock 语句进行保护, 效率大减
7. volatile 修饰符通常用于由多个线程访问而不使用 lock 语句
8. implicit 关键字用于声明隐式的用户定义类型转换运算符,如A+B
9. as 运算符类似于强制转换操作;但是,如果转换不可行,as 会返回 null 而不是引发异常。注意,as 运算符只执行引用转换和装箱转换。as 运算符无法执行其他转换,如用户定义的转换,这类转换应使用 cast 表达式来执行。
10. 控件之间传值Item只是HttpContext的一个属性。 HttpContext.Item
也就是说这个属性是针对一次请求而言的,每个用户每次发出的请求都会建立一个HttpContext的实例,所以不存在什么用户共享的问题。
一般,Item只是用于控件开发的时候存储一些共有的值,在下一次请求到来的时候item中的值又会重新建立的.
11. 以下对象是按引用传递:
Hashtable[包括从session里面取出来之后不用再塞回去]
SqlDataReader
StringBuilder
Dictionary<T, T>
12. NameValueCollection用法
NameValueCollection myCol = new NameValueCollection();
myCol.Add( "red", "rojo" );
myCol.Add( "green", "verde"
);
myCol.Add( "blue", "azul" );
myCol.Add( "red", "rouge" );
myCol.Add( "red", "bbb");
print: red rojo,rouge,bbb
green verde
blue azul
13. HttpCookie注意事项
cookie.Values.Add 如果key存在,则在该key之上累加
如Add前是010,如果继续对该键值Add 则变成010,010
cookie.Values[key] 该key不存在也可以添加,推荐
14. File.Exists(fileName); 文件是否存在
Directory.Exists(folderName); 目录(文件夹)是否存在
15. 绑定DropDownList绑定之后设置默认值
ddlBranch.Items.FindByText("总公司").Selected =
true;
16. 绑定到简单属性:<%#UserName%>
绑定到集合:<asp:ListBox id="ListBox1"
datasource='<%# myArray%>' runat="server">
绑定到表达式:<%#(class1.property1.ToString() +
"," + class1.property2.ToString())%>
绑定到方法返回值:<%# GetSafestring(str) %>
绑定到Hashtable:<%#
((DictionaryEntry)Container.DataItem).Key%>
绑定到ArrayList:<%#Container.DataItem %>
17. ASP.NET服务器控件
Name用this.UniqueID.ToString()获得
ID用this.ClientID.ToString()获得
18. ASP.NET 执行父控件的方法
Page p = this.Parent.Page;
Type pageType = p.GetType();
MethodInfo mi = pageType.GetMethod("Loading");
string sqlwhere = GetWhere(hsr);
mi.Invoke(p, new object[] { sqlwhere });
19. 服务器端FileUpload上传控件如何禁止手动输入
<asp:FileUpload ID="FileUpload1" runat="server" Height="22px" Width="412px" onkeydown="event.returnValue=false;" onpaste="return false" />
20. 数据连接关闭问题
1.DataReader的关闭:if not
dr.isclosed then dr.closed() ,如果不关闭dr,直接关闭cn,那么dr自动关闭.
2.DataSet不存在关闭与否的问题
3.DataTable存在关闭与否的问题,而.net缺省设为,当使用dt.fill(ds)时,它自动打开,填充完后自动关闭
21. 巧妙截取日期dateString.Split(' ')[0]
22. 不要用 + 来连接两个 路径字符串
用Path.Combine( "字符串1
", "字符串2 ")
比如
Path.Combine(@ "C:\AAA\BBB ", "CCC
") //
C:\AAA\BBB\CCC --自动补上一个斜杠
Path.Combine(@ "C:\AAA\BBB\ ",@ "\CCC ") //相同结果,自动去掉一个斜杆
Path.Combine(@ "C:\AAA\BBB ",@ "..\CCC ")
//C:\AAA\CCC
- Access数据库中多参数
string sql = "update tb_type
set typename=@typename,describe2=@describe2
where id=@id";
OleDbParameter[]
parameters = {
new OleDbParameter("@typename", OleDbType.VarChar,50),
new OleDbParameter("@describe2", OleDbType.VarChar,50),
new OleDbParameter("@id", OleDbType.Integer,4)};
parameters[0].Value = model.typename;
parameters[1].Value = model.describe2;
parameters[2].Value = model.id;
在access中居然要求顺序依次对应。
-----------------------------------------