2013年9月10日 星期二

[轉貼] 如何使用 DataView 物件(一) / 搜尋 過濾 資料

出處:http://www.dotblogs.com.tw/yc421206/archive/2009/10/18/11095.aspx

1.DataView 是用來展現DataTable的物件,你可以將 DataView 想成是一張經過條件定義好的檢視表。
DataView myDataView = new DataView(myDataTable);
快照-2009101861644 
2.一個 DataTable 可以有很多不同條件的 DataView。(也就是可以有不同的定義)

3.DataView 的 RowFilter 屬性用來過濾資料用,使用語法類型SQL中的Where。
myDataView.RowFilter = "EmployeeID<" + textBox2.Text;
4.DataView 的 Sort 屬性用來控制資料的排序方式,降冪用DESC;昇羃用ASC,使用語法類似SQL中的Order By。
//昇冪
myDataView.Sort = textBox5.Text + " DESC";
//昇冪
myDataView.Sort = textBox6.Text + " ASC";
5.DataViewFind 方法用來搜尋資料,使用 Find 時必須先指定 SortFind 方法會傳回整數,若為-1表示找不到資料。
用Find找到的資料,會回傳一個整數,找到的資料用以下方式表示:
myDataView[i]["LastName"].ToString();
6.DataViewApplyDefaultSort 屬性決定使用預設方式排序,若設為true則表示衣主鍵排序。
//定義Primary Key
myDataTable.PrimaryKey = new DataColumn[] { myDataTable.Columns[Convert.ToInt16(textBox1.Text)] };
//使用預設排序
myDataView.ApplyDefaultSort = true;
7.當 DataView 的屬性(SortRowFilter)被修改了,就必須要再重新建立 DataView
8.在開始以下範例時,必須先引用以下兩個命名空間
System.Data

取得北風資料庫中的Employees資料表,並建立一個DataTable,myDataTable就是我的 DataTable
private void Form1_Load(object sender, EventArgs e)
{
    cs = "Data Source=localhost;Initial Catalog=Northwind;Integrated Security=True";
    qs = "SELECT * FROM Employees";
    //資料庫連結,建立DataTable
    using (SqlConnection cn = new SqlConnection(cs))
    {
        cn.Open();
        using (SqlCommand cmd = new SqlCommand(qs, cn))
        {
            using (SqlDataReader dr = cmd.ExecuteReader())
            {
                using (DataTable dt = new DataTable())
                {
                    dt.Load(dr);
                    myDataTable = dt;
                }
            }
        }
    }
}
如何使用主鍵排序
//依Primary Key排序
private void button1_Click(object sender, EventArgs e)
{
    //1.定義DataView
    myDataView = new DataView(myDataTable);
    //2.定義Primary Key
    myDataTable.PrimaryKey = new DataColumn[] { myDataTable.Columns[Convert.ToInt16(textBox1.Text)] };
    //3.使用預設排序
    myDataView.ApplyDefaultSort = true;
    this.dataGridView1.DataSource = myDataView;
}
如何使用使用RowFilter篩選
//使用RowFilter篩選
private void button2_Click(object sender, EventArgs e)
{
    //1.定義DataView 
    myDataView = new DataView(myDataTable);
    //2.過濾數字
    myDataView.RowFilter = "EmployeeID<" + textBox2.Text;
    this.dataGridView1.DataSource = myDataView;
}
private void button3_Click(object sender, EventArgs e)
{
    //1.定義DataView 
    myDataView = new DataView(myDataTable);
    //2.過濾字串需用''
    myDataView.RowFilter = "LastName='" + this.textBox3.Text + "'";
    this.dataGridView1.DataSource = myDataView;
}
private void button4_Click(object sender, EventArgs e)
{
    //1.定義DataView 
    myDataView = new DataView(myDataTable);
    //2.找出字首以D開頭的
    myDataView.RowFilter = "LastName like '" + textBox4.Text + "%'";
    this.dataGridView1.DataSource = myDataView;
}
如何使用Sort排序
//昇冪
myDataView.Sort = textBox5.Text + " DESC";
this.dataGridView1.DataSource = myDataView;
//昇冪
myDataView.Sort = textBox6.Text + " ASC";
this.dataGridView1.DataSource = myDataView;
如何使用Find方法找資料
myDataView = new DataView(myDataTable);
//使用Find必須先指定Sort為DataTable欄位
myDataView.Sort = textBox7.Text;
//Find方法會傳回整數,若為-1表示找不到資料
int i = myDataView.Find(textBox8.Text);
if (i == -1)
{
    MessageBox.Show(textBox7.Text + "欄位" + " , " + "找不到 " + textBox8.Text + " 資料");
}
else
{
    //將找到的資料傳到DataTable中,以下是手動建立DataTable的步驟
    DataTable dt = new DataTable(); 

    //1.手動建立欄位,抄別人的比較快 ^.^!
    foreach (DataColumn item in myDataTable.Columns)
    {
        dt.Columns.Add(item.ToString());
    }
    DataRow dr = dt.NewRow();
    //2.手動建立已搜尋到的資料(再抄一次欄位 :P)
    foreach (DataColumn item in myDataTable.Columns)
    {
        dr[item.ToString()] = myDataView[i][item.ToString()].ToString();
    }
    dt.Rows.Add(dr);
    this.dataGridView1.DataSource = dt;
}
範例下載
VB_UseDataView.rar
*******************************************************************************************************************************


使用DataView的方式做Distinct的方法
    因需從某一個Table中找到distinct的資料.可是其資料已抓至DataTable中,又不想再從DB中抓一次相同的資料,故找了大神的幫忙才得知此方法.

這個方法是.NET Framework 2.0版的新功能

根據現有DataView中的資料列,建立並傳回新的DataTable

語法:
    DataView.ToTable(bool distinct, params string[] columnNames)

參數

distinct
    如果是 true, 則傳回DataTable會包含在所有資料中具有相異值的資料列,default : false。

columnNames
字串陣列,包含要加入傳回的DataTable中資料行名稱之清單。DataTable會包含指定之資料行,且其順序是根據出現在這個陣列中的順序。

傳回值
新的DataTable執行個體,其中包含所要求的資料列和資料行。


Example : 

    DataTable table = sourceTable.DefaultView.ToTable(true, "Column1", "Column2");
    Console.WriteLine("Distinct Column1, Column2 total count : " + table.rows.count.ToString());

沒有留言:

張貼留言