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去定位。
  • 清空ListView中的内容
    listView1.Items.Clear();//清空ListView控件中的所有数据
1 0
原创粉丝点击