C#學習過程中解決的問題

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控件中的所有數據
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章