C#学习过程中解决的问题
来源:互联网 发布:飞凡 嵌入式淘宝网 编辑:程序博客网 时间:2024/05/19 21:41
C#学习过程中解决的问题
1、不用数据库,如何存储少量数据
(1)可以使用XML文件
比如说存储一个学生信息表,可以命名为student.xml,读取和写入xml,可以用dom4j。
存储格式如下:
<root> <classInfo> <studentInfo> <name>Tom</name> <age>21</age> </studentInfo> <studentInfo> <name>Tom</name> <age>21</age> </studentInfo> <studentInfo> <name>Tom</name> <age>21</age> </studentInfo> </classInfo></root>
(2)使用txt文件
比如说一个医疗保险管理系统,需要存储职工的医疗保险信息,此时可以用txt的一行来代表一个职工的信息,存储格式如下:
小明,1990417,123456,3450,激活,128319170419,123456
每个数据间用‘,’或者‘|’隔开就可以了。
2、写入、读出txt文件
(1)写入txt文件
- 使用System.IO.File.WriteAllLines,如果文件不存在则创建
string[] line={"first","second","3","4"};System.IO.File.WriteAllLines(@"path",line,Encoding.UTF8);
这时txt文件中会写入4行数据,如果文件不存在,会创建;如果存在会覆盖文件。代码中的path是需要存储数据的文件的路径。
- 使用System.IO.StreamWriter,可以选择是否覆盖
为了方便,可以在程序文件开始加上using System.IO
, 对命名空间IO进行引用,使用时直接用StreamWriter就行了。
public string[] data_txt = new string[11];this.data_txt[0] = textBox1.Text;//姓名this.data_txt[1] = number2.ToString();//医保卡号this.data_txt[2] = textBox3.Text;//医保密码this.data_txt[3] = textBox4.Text;//医保账上余额this.data_txt[4] = textBox5.Text;//医保卡状态this.data_txt[5] = number1.ToString();//工资卡号this.data_txt[6] = textBox6.Text;//工资卡密码this.data_txt[7] = textBox7.Text;//工资账上余额this.data_txt[8] = textBox8.Text;//工资卡状态this.data_txt[9] = textBox9.Text;//工资情况this.data_txt[10] = textBox10.Text;//单位//字符串拼接string str1 = null;for( int i = 0; i < 10; i++ ){ str1 += this.data_txt[i]; str1 = str1 + ','; } str1 += this.data_txt[10];//保存到txt文档中,直接追加到文件末尾并换行string path = System.Windows.Forms.Application.StartupPath;path = path + '\\' + "文件.txt";StreamWriter file = new StreamWriter( @path, true );file.WriteLine( str1 );
这段代码主要是先将文本框中读取到的数据存到一个字符串数组中,然后将字符串数组拼接成一个字符串,每个数据间加上‘,’分隔符,最后使用StreamWriter把数据存到txt文件中。
此处StreamWriter第二个参数为false覆盖现有文件,为true则把文本追加到文件末尾,并且使用file.WriteLine( str1 );
是追加到文件末尾并换行,而file.Write( str1 );
是追加到文件末尾不换行。
(2)读出txt文件
- 使用System.IO.File.ReadAllText读取成一个字符串
把整个文件读取成一个字符串,如下:
string str=System.IO.File.ReadAllText(@"path");
- 使用System.IO.File.ReadAllLines按行读取成一个字符串数组
string[] lines=System.IO.File.ReadAllLines(@"path");foreach(string line in lines){ Console.WriteLine(line);}
- 使用System.IO.StreamReader按流的方式一行行读取
using System.IO;StreamReader sr=new StreamReader(@"path");string str;while((str=sr.ReadLine())!=null){ Console.WriteLine(str);}Console.Read();
3、如何从txt文件中读取格式数据
如果将数据存到txt文件中,管理数据不如数据库方便,但是数据量较小的话,使用数据库又太麻烦,所以可以选用txt存储数据,那么如何从txt文件中读取格式数据呢?
首先我们可以将txt文件数据按行读取到字符串数组中,然后针对每个字符串,也就是txt文件中的每行数据,使用String.Split()进行数据处理,String.Split()是将字符串按照字符进行分割,存取数据时,对每个数据项之间用‘,’隔开。代码如下:
string[] lines = System.IO.File.ReadAllLines( @path );int line_num = lines.Length;for( int i = 0; i < line_num; i++ ){ string[] columns = lines[i].Split( ',' );//将每行的数据按照‘,’进行读取 //将读取的数据存入到字符串数组data数组中 for( int j = 0; j < 11; j++ ) { data[i, j] = columns[j]; }}
4、String.Split()用法
参考自http://www.cnblogs.com/mingforyou/p/3952357.html
- 第一种–单字符分割
string s="abcdeabcdeabcde";string[] sArray=s.Split('c') ;
分割结果:
ab deab deab de
- 第二种–多字符分割
string s="abcdeabcdeabcde";string[] sArray1=s.Split(new char[3]{'c','d','e'}) ;
分割结果:
ab ab ab ab
- 第三种–正则表达式
新建一个控制台项目。
然后先添加 using System.Text.RegularExpressions;
string content=agcsmallmacsmallgggsmallytx;string[]resultString=Regex.Split(content,small,RegexOptions.IgnoreCase)
分割结果:
agc mac ggg ytx
- 第四种–替换法
string str1=我*****是*****一*****个*****教*****师;string[] str2;str1=str1.Replace(*****,*);str2=str1.Split(*);foreach(string i in str2) Console.WriteLine(i.ToString());
分割结果:
我是一个教师
- 第五种–另一种正则表达式
string str1=我**是*****一*****个*****教*****师;
我希望显示的结果为:我是一个教师。
我如果采用上面的第四种方法来做就会产生下面的错误,我 是一个教师。中间有空格输出,所以输出结果并不是希望的结果,这就又回到了正则表达式了
这时可以采用下面的方法:
string str1="我**是*****一*****个*****教*****师";string[]str2=System.Text.RegularExpressions.Regex.Split(str1,@[*]+); foreach(string i in str2) Console.WriteLine(i.ToString());
这里通过[*]+ 巧妙的完成了我们的目标。
5、如何获取程序所在当前路径
参考自http://www.bianceng.cn/Programming/csharp/201107/27547.htm
- 获取和设置当前目录的完全限定路径
string str = System.Environment.CurrentDirectory;
- 获取启动了应用程序的可执行文件的路径,不包括可执行文件的名称
string str = System.Windows.Forms.Application.StartupPath;
- 获取新的 Process 组件并将其与当前活动的进程关联的主模块的完整路径,包含文件名
string str=System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName;
- 获取当前 Thread 的当前应用程序域的基目录,它由程序集冲突解决程序用来探测程序集
string str = System.AppDomain.CurrentDomain.BaseDirectory;
- 获取应用程序的当前工作目录
string str = System.IO.Directory.GetCurrentDirectory();
- 获取和设置包含该应用程序的目录的名称
string str=System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
- 获取当前进程的完整路径,包含文件名
string str = this.GetType().Assembly.Location;
- 获取启动了应用程序的可执行文件的路径,包括可执行文件的名称
string str =System.Windows.Forms.Application.ExecutablePath;
6、如何在Winform程序中弹出新的窗体
首先新建一个窗体类,如Form1,然后再点击button创建事件处理函数,在函数中添加代码:
Form1 form= new Form1();form.ShowDialog();
7、定义一个全局数组
首先在一个类如Test中定义数组public static int[] data=new int[10];
,然后如果要在其它地方使用数组的话,必须用类名调用,如Test.data[0]
;
8、ViewList控件的使用
参考自http://www.cnblogs.com/rosesmall/p/5533667.html
- 定义
把控件拖进来,系统会自动在Designer.cs里添加一个this.listView1 = new System.Windows.Forms.ListView();
初始化,确定模式,确定列
InitializeComponent()里系统首先自动完成对它的初始化操作。
而用户自定义的初始化操作最好写在Form构造函数里跟在InitializeComponent()后面。原因是一旦listView有变动,系统自动调整InitializeComponent()内容,可能会自动删除掉用户写的部分。
下面,首先确定列名,如:this.listView1.Columns.Add( "姓名",70 );this.listView1.Columns.Add( "医保卡号",120 );this.listView1.Columns.Add( "医保账上余额",90 );this.listView1.View = System.Windows.Forms.View.Details;
这就添加了3列,想要添加几列就加几行代码。并且最后添加代码
this.listView1.View=System.Windows.Forms.View.Details
若不加这句,那么加的列压根显示不出来。必须写。
其中Details是View的属性,View还有其它属性,如:- LargeIcon 每个项都显示为一个最大化图标,在它的下面有一个标签。
- Details 每个项显示在不同的行上,并带有关于列中所排列的各项的进一步信息。最左边的列包含一个小图标和标签,后面的列包含应用程序指定的子项。列显示一个标头,它可以显示列的标题。用户可以在运行时调整各列的大小。
- SmallIcon 每个项都显示为一个小图标,在它的右边带一个标签。
- List 每个项都显示为一个小图标,在它的右边带一个标签。各项排列在列中,没有列标头。
- Tile 每个项都显示为一个完整大小的图标,在它的右边带项标签和子项信息。显示的子项信息由应用程序指定。此视图仅在下面的平台上受支持:Windows XP 和 Windows Server 2003 系列。在之前的操作系统上,此值被忽略,并且 ListView 控件在 LargeIcon 视图中显示。
另外,添加列名的时候,可以设置列宽,即第二个参数。
增加行
首先创建ListViewItem的对象,再通过对象进行增加行的操作。最后加上this.listView1.Items.Add(li);
代码如下:ListViewItem li = new ListViewItem();li.Text = Program.data[i, 0];//第一列li.SubItems.Add( Program.data[i, 1] );//第二列li.SubItems.Add( Program.data[i, 3] );//第三列li.SubItems.Add( Program.data[i, 4] );//第四列li.SubItems.Add( Program.data[i, 5] );//第五列li.SubItems.Add( Program.data[i, 7] );//第六列li.SubItems.Add( Program.data[i, 8] );//第七列li.SubItems.Add( Program.data[i, 9] );//第八列li.SubItems.Add( Program.data[i, 10] );//第九列this.listView1.Items.Add( li );
注意第一列与第二列有差别,注意区分!
- 关于项的选取
主要分为两类:左键选取,适用的方法是SelectedItems和SelectedIndices与通过复选框勾选的选取CheckedItems。
主要是左键选取:- 首先要判断有没有项被选中变蓝,如果不判断那么用到SelectedItem[i]时会因为没有合适结果报错。
if (this.listView1.SelectedItems.Count > 0) - SelectedItems是获取选中的行的集合,也就是说支持多行选择,它是多行的集合。
this.textBox2.Text = this.listView1.SelectedItems[0].Text;
这里的索引[0]并不是指原列表的第一行,而是将全体被选中行当做一个集合,在被选中行中的第一被选行。
此时返回的是该行第一列的单元格内容。
this.textBox2.Text = this.listView1.SelectedItems[0].SubItems[0].Text;
用SubItems[0]两者得到的结果是一样的,也是第一被选行的第一列。
this.textBox2.Text = this.listView1.SelectedItems[0].SubItems1.Text;
上面是第一被选行的第二列,以此类推。 - SelectedIndices是返回选中行的索引值int
this.listView1.SelectedIndices[i]也是将选中行当做整体,用i去定位。
- 首先要判断有没有项被选中变蓝,如果不判断那么用到SelectedItem[i]时会因为没有合适结果报错。
- 清空ListView中的内容
listView1.Items.Clear();//清空ListView控件中的所有数据
- C#学习过程中解决的问题
- maven学习过程中问题的解决
- C#学习过程中遇到的问题
- opengl 学习过程中遇到的问题与解决
- 学习Linux C过程中要解决的问题
- 开发过程中待解决的问题
- androidstdio安装过程中解决的问题
- 《orange's:一个操作系统的实现》学习过程中问题的解决(持续更新)
- JavaWeb学习之注册登录功能实现过程中出现的问题及解决
- selenium学习过程中所遇各种问题及解决
- 在学习过程中遇到的问题
- Makefile学习过程中遇到的问题
- Selenium学习过程中碰到的问题
- 学习过程中碰到的问题集锦
- allegro 学习过程中遇到的问题
- WKWebView学习过程中碰到的问题
- thinkphp学习过程中遇到的问题
- 线程学习过程中遇到的问题
- 使用ZooKeeper实现软负载均衡(原理)
- IPC
- 欢迎使用CSDN-markdown编辑器
- 基于processing的简单音频可视化
- 【深度学习:CNN】Batch Normalization解析(1)
- C#学习过程中解决的问题
- 机器学习 周志华 读书笔记 第1章 绪论
- 了解lucene的基本概念
- Java工厂模式的三种设计方式
- ORA-08002: sequence CURRVAL is not yet defined in this session
- jquery获取radio和select
- Struts2 + Spring3 + MyBatis3 动态切换 多数据源
- 机器学习之常用算法总结
- macOS Sierra系统偏好设置->安全性和隐私->通用中的“任何来源” 选项开与关