版本:v2.0
摘要
本文主要介绍了C#中的一些学习心得,包括但不限于Regex,TreeView,字典类型变量,spritf,UrlEncode等
2013-08-20
修订历史 | ||
---|---|---|
修订 2.0 | 2013-08-20 | crl |
| ||
修订 1.0 | 2012-11-06 | crl |
|
版权 © 2013 Crifan, http://crifan.com
目录
C#中也有类似于Python中的字典类型的变量
参考代码如下:
Dictionary<String, int> dicPicIdx; Dictionary<string, int>.KeyCollection dicKeys; dicPicIdx = new Dictionary<string, int>(); dicPicIdx.Add("EmptyDocumentFolder", 1); dicPicIdx.Add("NonEmptyDocumentFolder", 1); dicPicIdx.Add("NonEmptyAlbum", 3); dicPicIdx.Add("EmptyAlbum", 3); dicPicIdx.Add("NonEmptyFavoriteFolder", 4); dicPicIdx.Add("EmptyFavoriteFolder", 4); dicPicIdx.Add("Photo", 6); dicPicIdx.Add("Audio", 7); dicPicIdx.Add("Video", 8); dicKeys = dicPicIdx.Keys;
C#中,类似于C中常用的spritf函数,是String.Format函数。
最简单的用法举例如下:
string spritfTestStr = String.Format("Test sprintf in C#, number={0:D}, string=\"{1:s}\", float={2:0.000}", 100, "crifan", Math.PI); //spritfTestStr = Test sprintf in C#, number=100, string="crifan", float=3.142
关于Format函数的更多的示例,可以参考微软官方文档:String.Format Method (String, Object)
关于其他更多不同类型的参数,比如日期,数值,枚举等,如何指定对应的格式,可以参考:
- For more information about the composite formatting feature supported by methods such as Format, AppendFormat, and some overloads of WriteLine, see Composite Formatting.
- For more information about numeric format specifiers, see Standard Numeric Format Strings and Custom Numeric Format Strings.
- For more information about date and time format specifiers, see Standard DateTime Format Strings and Custom DateTime Format Strings.
- For more information about enumeration format specifiers, see Enumeration Format Strings.
- For more information about formatting, see Formatting Types and Formatting Overview.
代码:
//input: [4] Valid: B0009IQZFM //output: ============================ [4] Valid: B0009IQZFM ============================= public string formatString(string strToFormat, char cPaddingChar = '*', int iTotalWidth = 80) { //auto added space strToFormat = " " + strToFormat + " "; //" [4] Valid: B0009IQZFM " //1. padding left int iPaddingLen = (iTotalWidth - strToFormat.Length)/2; int iLefTotalLen = iPaddingLen + strToFormat.Length; string strLefPadded = strToFormat.PadLeft(iLefTotalLen, cPaddingChar); //"============================ [4] Valid: B0009IQZFM " //2. padding right string strFormatted = strLefPadded.PadRight(iTotalWidth, cPaddingChar); //"============================ [4] Valid: B0009IQZFM =============================" return strFormatted; }
主要包含三步:
private struct keyValueList { public string Key{get;set;} // key public List<string> ValueStrList{get;set;} // the string value list for the key }
List<keyValueList> gFootprintTypeSelList; // footprint type gFootprintTypeSelList = new List<keyValueList>(); //1. option1: Guest Blogging keyValueList keyValueListGuestBlogging = new keyValueList(); keyValueListGuestBlogging.Key = "Guest Blogging"; keyValueListGuestBlogging.ValueStrList = new List<string>(); //keyValueListGuestBlogging.ValueStrList.Add("Specify Footprint"); keyValueListGuestBlogging.ValueStrList.Add("Guest Blogging"); keyValueListGuestBlogging.ValueStrList.Add("Contribute"); keyValueListGuestBlogging.ValueStrList.Add("Write for us"); keyValueListGuestBlogging.ValueStrList.Add("Guest Category"); keyValueListGuestBlogging.ValueStrList.Add("Submit Content"); gFootprintTypeSelList.Add(keyValueListGuestBlogging);
cmbFootprintType.DataSource = gFootprintTypeSelList; cmbFootprintType.DisplayMember = "key";
目录
当你处理http时,返回的html的header中包含:
Content-Encoding: deflate
或
Content-Encoding: gzip
时,说明是返回的是压缩的HTML。
想要支持压缩的html的话,C#中,在发送HttpWebRequest之前,设置AutomaticDecompression为对应的参数即可:
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url); ...... req.Headers["Accept-Encoding"] = "gzip, deflate"; //req.AutomaticDecompression = DecompressionMethods.GZip; req.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
更多解释详见:
示例代码:
using System.Net; WebProxy gProxy = new WebProxy("127.0.0.1", 8087); HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url); req.Proxy = gProxy;
在用C#的GetResponseStream,常会遇到,ReadLine或ReadToEnd会无限期挂掉,所以,需要去加上对应的超时(timeout)设置:
C#中,关于解析SetCookie,前后遇到多个bug,详见:
【经验记录】C#中,库函数有bug,会将http所返回的response响应中的headers头信息中的Set-Cookie值,解析错误,丢失部分cookie
默认的HttpUtility.UrlEncode会把空格编码为加号,而不是很多人所期望的%20,导致很多人以为函数出了问题呢。其实,微软官方文档HttpUtility.UrlEncode方法中,已经解释了此问题:
您可以使用 UrlEncode 方法或 UrlPathEncode 方法对 URL 编码。
但是,方法返回不同的结果。UrlEncode 方法将每个空格字符转换为加号 (+) 字符。
UrlPathEncode 方法将每个空格字符转换为字符串 "%20",它表示一个用十六进制表示法表示的空格。
在对 URL 的路径部分编码时使用 UrlPathEncode 方法,以保证一致的已解码 URL,与执行解码的平台或浏览器无关。
所以,想要把空格编码为%20,用 UrlPathEncode 即可。
C#中使用WebBrowser,相对还是很简单的,比如,打开网页,直接用uri即可:
wbsChaseFootprint.Url = new Uri(strEncodedFullFootprintUrl);
详见:【记录】C#中使用WebBrowser浏览google页面
目前的解决办法,在DocumentCompleted中加上:
if (!e.Url.Equals(wbsChaseFootprint.Url)) { //not actually complete, do nothing return; }
目录
全选所有列再调用AutoFit:
//auto adjust column width (according to content) Range allColumn = xlWorkSheet.Columns; allColumn.AutoFit();
核心逻辑:
获得对应的列的Range,再去AutoFit
Range firstColumn = xlWorkSheet.get_Range("A1"); firstColumn.EntireColumn.AutoFit();
使用C#操作Excel常会出现类似错误:
Could not load file or assembly ‘Microsoft.Office.Interop.Excel, Version=14.0.0.0
其可能原因,现总结如下:
C#的exe用到了excel的话,希望拿到别人的地方也正常运行不报错的话,
其中,别的地方:
那么有几种选择:
关于,集成dll到exe中,简述为:
比如别人已装的excel,即Office是Office12
那么你也就不要去引用Office14==Office2010:
C:\Program Files (x86)\Microsoft Visual Studio 10.0\Visual Studio Tools for Office\PIA\Office14\Microsoft.Office.Interop.Excel.dll
了,而去引用Office12==Office2007:
C:\Program Files (x86)\Microsoft Visual Studio 10.0\Visual Studio Tools for Office\PIA\Office12\Microsoft.Office.Interop.Excel.dll
当然,最好确认一下,对方的电脑中装了哪个版本的Office(的excel)
比如是Office 2010==Office14,那么你也就去引用对应的Office14:
C:\Program Files (x86)\Microsoft Visual Studio 10.0\Visual Studio Tools for Office\PIA\Office14\Microsoft.Office.Interop.Excel.dll
就好了。
Microsoft.Vbe.Interop.dll和office.dll,与Microsoft.Office.Interop.Excel.dll,一起,都是属于“Microsoft Office system 的可用程序集”
所以,最好也是要在集成,Microsoft.Office.Interop.Excel.dll,时,连带的一起把:Microsoft.Vbe.Interop.dll和office.dll都集成进来。
这样,才可以避免,别人在使用exe时,内部用到excel的dll时,完整的所需要的函数,都可以自带的找到了。
不会再对于Microsoft.Vbe.Interop.dll或office.dll报错说找不到。
当前已有一个TreeView控件trvFolder,添加节点的代码如下:
TreeNode curNode = new TreeNode(name); trvFolder.Nodes.Add(curNode);
先拖拽出来一个ImageList控件iglIcons,然后手动编辑ImageList的Images属性Collection,添加几个小图片。
对应的index分别是0,1,2,。。。,然后用:
trvFolder.ImageList = iglIcons;
将其关联到当前TreeView控件trvFolder。
最后,每次添加TreeNode的时候,多加一句:
curNode.ImageIndex = 0;
即为:
TreeNode curNode = new TreeNode(name); curNode.ImageIndex = 0; trvFolder.Nodes.Add(curNode);
其中0为图片的index,可根据自己的实际情况改为对应的index。
这样就可以实现给不同的TreeNode添加对应的图标了。
选择的是别的节点,对着另外一个节点右击,要获得被右击的节点,主要代码是:
private void trvCategoryTree_MouseUp(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Right) { // Select the clicked node trvCategoryTree.SelectedNode = trvCategoryTree.GetNodeAt(e.X, e.Y); } }
之后通过cmsSelection_ItemClicked也就可以通过SelectedNode得到当前右击的那个TreeNode了。
给TreeNode添加右键的总体的思路是:
TreeNode加入到TreeView但是不显示名字,是因为加入的TreeNode没有设置Text
(虽然设置了TreeNode的Name,但是实际上用于显示的是Text而不是Name)
所以,在把TreeNode加入TreeView之前,设置好对应的Text即可正常显示。