2013年11月22日星期五

listview中分列展示数据

listview控件就像windows资源管理器右边的内容视图,有大图标、小图标、列表、平铺、详细信息几种展示方式,我这次做的需要看目录下的文件夹和文件以及更新时间,另外再加个文件类型和大小,所以就使用详细信息的方式,具体做法如下:
1 在listview的属性窗口的View属性选择Details
2 Colomns属性中,添加需要的几列,并将Text改成要展示的列名字
3 代码中添加方法
[csharp] view plaincopy
  1. //获取文件夹和文件列表  
  2. public void GetDirectorysAndFiles(int index)  
  3. {  
  4.     string path = datatable_folders.Rows[index]["Folder"].ToString();  
  5.     string protocol = datatable_folders.Rows[index]["Protocol"].ToString();  
  6.     string username = datatable_folders.Rows[index]["Username"].ToString();  
  7.     string password = datatable_folders.Rows[index]["Password"].ToString();  
  8.     if (protocol == "local")  
  9.     {  
  10.         DirectoryInfo dirs = new DirectoryInfo(path);  
  11.         foreach (DirectoryInfo dir in dirs.GetDirectories())  
  12.         {  
  13.             ListViewItem item = new ListViewItem();  
  14.             item.Text = dir.Name;  
  15.             //item.ImageIndex =   
  16.             item.SubItems.Add(dir.LastWriteTime.ToString("yyyy-MM-dd HH:mm"));  
  17.             item.SubItems.Add("文件夹");  
  18.             item.SubItems.Add("");  
  19.             listView1.Items.Add(item);  
  20.         }  
  21.         foreach (FileInfo file in dirs.GetFiles())  
  22.         {  
  23.             ListViewItem item = new ListViewItem();  
  24.             item.Text = file.Name;  
  25.             item.SubItems.Add(file.LastWriteTime.ToString("yyyy-MM-dd HH:mm"));  
  26.             item.SubItems.Add(file.Extension);  
  27.             item.SubItems.Add(file.Length.ToString());  
  28.             listView1.Items.Add(item);  
  29.         }  
  30.     }  
  31. }  
4 在对应的事件调用此方法,我的是鼠标双击listbox中的某个Item
[csharp] view plaincopy
  1. //listbox双击事件  
  2. private void listBox_folders_MouseDoubleClick(object sender, MouseEventArgs e)  
  3. {  
  4.     int index = listBox_folders.IndexFromPoint(e.Location);  
  5.     if (index != System.Windows.Forms.ListBox.NoMatches)  
  6.     {  
  7.         GetDirectorysAndFiles(index);  
  8.     }  
  9. }  

listview的第一列可以展示图片加文字,像文件夹和文件的图标,这个可以通过文件的后缀名去注册表中取对应的图标,具体比较麻烦,我暂时先不做了,对我无关紧要的。后面的每列都是SubItem,使用SubItems.Add方法添加,注意顺序对应就好了。

2013年11月20日星期三

从文本文件中的表读取到二维数组与DataTable并在listbox中展示其中的一列



自己做的一个winform小工具中,有一个listbox,我想在每次程序启动时从本地一个文件中读出数据,将其中的一列展示在listbox中,而且数据要保存在内存中,供之后的功能调用。查论坛说filestream方式读取文件比较好,而且可以每次只读一行,对于很大的文件也可以轻松应付,虽然我的文件不可能那么大,但是为了练习也采用了这种办法。filestream中的ReadLine()方法也可以得出文件的行数,以下是源代码:
[csharp] view plaincopy
  1. StreamReader streamreader = new StreamReader(FileOperation.folderfile);  
  2. string line;  
  3. while ((line = streamreader.ReadLine()) != null)  
  4. {  
  5.     string[] readrow = line.Split(new char[] { '\t' });  
  6.     int m = 1;  
  7.     int n = readrow.Length;  
  8.     string[,] fields = new string[m, n];  
  9.     for (int i = 0; i < n; i++)  
  10.         fields[i / n, i % n] = readrow[i];  
  11.     listBox_folders.Items.Add(fields[m-1, 0]);  
  12.     m++;  
  13. }  
具体的办法是通过循环将文件的每行都读出存入一个一维数组,再用一个for循环将这个一维数组的数据存入一个二维数组的一行,二维数组的列数由一维数组的长度取得,行数则随着ReadLine()的循环自增,最后listbox展示的是这个二维数组的第1列。

补:
随后的操作过程中,需要多次对该数组进行增删改操作,发现数组的操作很麻烦,于是只好重新来过,将数组改为DataTable类型,DataTable获取行数列数,索引,增删改操作都相当便利,而且我也熟悉,代码如下:
[csharp] view plaincopy
  1. StreamReader streamreader = new StreamReader(FileOperation.folderfile);  
  2. string line;  
  3. DataTable dt_folders = new DataTable();  
  4. DataColumn name = new DataColumn("Name", Type.GetType("System.String"));  
  5. DataColumn folder = new DataColumn("Folder", Type.GetType("System.String"));  
  6. DataColumn username = new DataColumn("UserName", Type.GetType("System.String"));  
  7. DataColumn password = new DataColumn("Password", Type.GetType("System.String"));  
  8. DataColumn protocol = new DataColumn("Protocol", Type.GetType("System.String"));  
  9. DataColumn port = new DataColumn("Port", Type.GetType("System.String"));  
  10. dt_folders.Columns.Add(name);  
  11. dt_folders.Columns.Add(folder);  
  12. dt_folders.Columns.Add(username);  
  13. dt_folders.Columns.Add(password);  
  14. dt_folders.Columns.Add(protocol);  
  15. dt_folders.Columns.Add(port);  
  16. DataRow row;  
  17. while ((line = streamreader.ReadLine()) != null)  
  18. {  
  19.     row = dt_folders.NewRow();  
  20.     string[] readrow = line.Split(new char[] { '\t' });  
  21.     row["Name"] = readrow[0].ToString();  
  22.     row["Folder"] = readrow[1].ToString();  
  23.     row["UserName"] = readrow[2].ToString();  
  24.     row["Password"] = readrow[3].ToString();  
  25.     row["Protocol"] = readrow[4].ToString();  
  26.     row["Port"] = readrow[5].ToString();  
  27.     dt_folders.Rows.Add(row);  
  28.     listBox_folders.Items.Add(row["Name"]);  
  29. }  
  30. datatable_folders = dt_folders.Copy();  
最后是复制给一个全局变量供全局使用。

2013年11月19日星期二

王八蛋态度

可能大家在生活中都遇到过这种情况,早高峰时间,本来就不通畅的马路比以往更加拥挤,大家狂按喇叭拼命加塞,好不容易挪到队伍前面,发现是有个施工中的车挡住了一根车道,而车上的所谓施工人员根本就没施工,而是笑眯眯悠然的欣赏着车流;还有,一条刚刚修好的路,今天挖条沟说是埋管线,明天挖条沟说埋下水道,后天挖条沟说是埋钢筋加固,好不容易该埋的都埋好了,几经折腾的路面也变得不平整,有关单位说那么我们开始修路吧,当然不能大修,那费钱,而且几年之内都不能再做文章,只能小修,先堵住半边路面挖掉表层,然后一个月不见人影,一个月后继续修,历时几个月总算修好了,用不了多久又要开始下一次折腾了。
这种不干人事的态度我自己称之为王八蛋态度,这种态度的人如果法律不管我真想把他们拉出去枪毙500回。我亲眼见过最高效的铺路团队是我家那边的罪犯铺人行路地砖团队和薄熙来在大连时的铺马路团队。罪犯团队因为一天之内要铺好比较长的一条路,没人每次拿四块地砖,基本上十几秒铺好,而且铺好之后非常平整,效率之高令专业人士汗颜;以前大连的铺路团队更是将机械化配合发挥到了极致,从拦路到铺好只用几个小时,通常拦路之后一个车队开始作业,第一辆是铲地皮车,后面跟着辆大卡车,铲起来的地皮直接通过传送带送入卡车翻斗,后面跟着洒柏油的车,洒的绝对细致平整,最后跟着压路机,一趟下来就铺好了一根车道,来回几趟一条路就全部铺好了,区区几个小时的时间,去年过年去了一趟大连,路面不平破旧,人行路地砖也很久没有换过了,就算人走茶凉但是希望这种作业方法不要就此尘封。
相对于那些操蛋行业,互联网行业真的算是太高效纯洁的行业了,因为互联网相对开放,而且门槛低所以竞争激烈,没有形成行业垄断,想单凭关系混下去也很容易曝光,如果你的速度创意质量不如别人,那只有被淘汰的结果。前些年我自己预测了一些未来几年会比较火的行业,前几天我又重新思考了这个问题,除去极度垄断行业外,一般人可以从事的我只得出了互联网和相关的软硬件行业,未来几年拼的是创意,其实真实的技术差距真的看起来没那么夸张,所以谁的产品有新意,能够吸引眼球,谁就能够领先别人,所以我还是在这个行业里慢慢混着吧,虽然一事无成,但总算还有点想法。
我理想中的工作团队应该是工作上分享一切,每个人都有工作侧重点并且能够独当一面,团队人员一定要精简,不能养懒人,团队有明确的目标和计划,每个成员都为之努力,如果待遇和福利一定要与付出成正比,如果暂时不能提供好的,那么将来的回报一定要丰盛,毕竟不是每个人都信教的,高回报才是真正的动力,此外越是优秀的团队对优秀人才的吸引力就越大,所以坚持优秀才是更加优秀的前提。
现在我所在的公司确实基本上与优秀相去甚远,老板去旅游一次就转变了世界观,现在逼着员工每天跳舞被弟子规,自己谎话连篇极度小气还每天教育别人忘我利他,身边一堆拍马屁的,导致公司效率极度低下,基本上从对老板的态度就可以区分出来员工类型,尽量远离小人做好自己吧,总不能因为有小人就自己也使出王八蛋态度。

2013年11月18日星期一

正则表达式学习

只是点皮毛,先凑合用着了,顺便鄙视一下SQLServer,居然不支持正则。

\b 元字符,代表着单词的开头或结尾,也就是单词的分界处。
\d 数字
\s 任意的空白符,包括空格,制表符(Tab),换行符,中文全角空格等
\w 字母或数字或下划线或汉字等
^ 匹配字符串的开始
$ 匹配字符串的结束
\ 转义符
. 除换行符以外的任意字符
? 重复零次或一次
+ 所有(从1次开始)
* 所有(从0次开始)
| 或条件
{n} 连续匹配n次
{n,} 连续匹配多于n次
{m,n} 连续匹配多于m少于n次
[] 集合,需要匹配的都列出来

反义:
\B 不是单词开头或结束的位置
\D 任意非数字的字符
\S 任意不是空白符的字符
\W 任意不是字母,数字,下划线,汉字的字符
[^x] 除了x以外的任意字符
[^aeiou] 除了aeiou这几个字母以外的任意字符