關於PagedDataSource分頁屬性與DataSet和DataTable詳解


Asp.net提供了三個功能強大的列表控件:DataGrid、DataList和Repeater控件,但其中只有DataGrid控件提供分頁功能。相對DataGrid,DataList和Repeater控件具有更高的樣式自定義性,所以很多時候我們喜歡使用DataList或Repeater控件來顯示數據。

PagedDataSource 類封裝 DataGrid 控件的屬性,這些屬性使 DataGrid 可以執行分頁。
PagedDataSource 類的部分公共屬性:

 AllowCustomPaging  獲取或設置指示是否啟用自定義分頁的值。 
 AllowPaging   獲取或設置指示是否啟用分頁的值。 
 Count    獲取要從數據源使用的項數。 
 CurrentPageIndex   獲取或設置當前頁的索引。 
 DataSource   獲取或設置數據源。 
 DataSourceCount   獲取數據源中的項數。 
 FirstIndexInPage   獲取頁中的第一個索引。 
 IsCustomPagingEnabled  獲取一個值,該值指示是否啟用自定義分頁。 
 IsFirstPage   獲取一個值,該值指示當前頁是否是首頁。 
 IsLastPage   獲取一個值,該值指示當前頁是否是最后一頁。 
 IsPagingEnabled   獲取一個值,該值指示是否啟用分頁。 
 IsReadOnly   獲取一個值,該值指示數據源是否是只讀的。 
 IsSynchronized   獲取一個值,該值指示是否同步對數據源的訪問(線程安全)。 
 PageCount   獲取顯示數據源中的所有項所需要的總頁數。 
 PageSize   獲取或設置要在單頁上顯示的項數。 
 VirtualCount   獲取或設置在使用自定義分頁時數據源中的實際項數。 

DataGrid控件就是使用PagedDataSource類來實現數據分頁顯示的,所以DataList和Repeater也同樣可以使用PagedDataSource來顯示分頁。

private void BindData()
{
    //ds填充代碼
    DataView dv = ds.Tables[0].DefaultView;
    PagedDataSource Pds = new PagedDataSource();
    Pds.DataSource = dv;
    Pds.AllowPaging = true;
    Pds.PageSize = 10;
    int TotalCount = Pds.PageCount;
    int CurrPage;
    //這里就可以通過各種方式遞交頁面索引
    CurrPage = Request.QueryString["Page"];
    //最后再綁定
    //DataList和Repeater都可
    DataList1.DataSource = Pds;
    DataList1.DataBind();
}

 

 

1、創建DataSet對象:
DataSet ds = new DataSet("DataSetName");

 2、查看調用SqlDataAdapter.Fill創建的結構 
     da.Fill(ds,"Orders");

     DataTable tbl = ds.Table[0];

     foreach(DataColumn col in tbl.Columns)

         Console.WriteLine(col.ColumnName);

3、查看SqlDataAdapter返回的數據 
①、DataRow對象
     DataTable tbl = ds.Table[0];

     DataRow row = tbl.Row[0];

     Console.WriteLine(ros["OrderID"]);

②、檢查存儲在DataRow中的數據 
     DataTable tbl = row.Table;

     foreach(DataColumn col in tbl.Columns)

         Console.WriteLine(row[col]);

③、檢查DatTable中的DataRow對象 
             foreach(DataRow row in tbl.Rows)

                 DisplayRow(row);

4、校驗DataSet中的數據 
①、校驗DataColumn的屬性:ReadOnly,AllowDBNull,MaxLength,Unique

②、DataTable對象的Constrains集合:UiqueConstraints,Primarykey,ForeignkeyConstraints

通常不必刻意去創建ForeignkeyConstraints,因為當在DataSet的兩個DataTable對象之間創建關系時會創建一個。

③、用SqlDataAdapter.Fill模式來檢索模式信息

5、編寫代碼創建DataTable對象

①、創建DataTable對象:DataTable tbl = new DataTable("TableName");

②、將DataTable添加到DataSet對象的Table集合

     DataSet ds = new DataSet();

     DataTable tbl = new DataTable("Customers");

     ds.Tables.Add(tbl);

 

     DataSet ds = new DataSet();

     DataTable tbl = ds.Tables.Add("Customers");

DataTable對象只能存在於至多一個DataSet對象中。如果希望將DataTable添加到多個DataSet中,就必須使用Copy方法或Clone方法。Copy方法創建一個與原DataTable結構相同並且包含相同行的新DataTable;Clone方法創建一個與原 DataTable結構相同,但沒有包含任何行的新DataTable。

③、為DataTable添加列

     DataTable tbl = ds.Tables.Add("Orders");

     DataColumn col =tbl.Columns.Add("OrderID",typeof(int));

     col.AllowDBNull = false;

     col.MaxLength = 5;

     col.Unique = true;

     tbl.PrimaryKey = new DataColumn[]{tbl.Columns["CustomersID"]};

     當設置主鍵時,AllowDBNull自動設置為False;

④、處理自動增量列

     DataSet ds = new DataSet();

     DataTable tbl = ds.Tables.Add("Orders");

     DataColumn col = tbl.Columns.Add("OrderID",typeof(int));

     col.AutoIncrement = true;

     col.AutoIncrementSeed = -1;

     col.AutoIncrementStep = -1;

     col.ReadOnly = true;

⑤、添加基於表達式的列

     tbl.Columns.Add("ItemTotal",typeof(Decimal),"Quantity*UnitPrice");

6、修改DataTable內容 
①、添加新DataRow

     DataRow row = ds.Tables["Customers"].NewRow();

     row["CustomerID"] = "ALFKI";

     ds.Tables["Customers"].Rows.Add(row);

 

     object[] aValues ={"ALFKI","Alfreds","Anders","030-22222"};

     da.Tables["Customers"].LoadDataRow(aValues,false);


②、修改當前行

修改行的內容逼供內不會自動修改數據庫中相應的內容,對行所做的修改被視為是隨后將使用SqlDataAdapter對象來提交交給數據庫的待定的更改。

DataRow rowCustomer;

rowCustomer = ds.Tables["Custoemrs"].Rows.Find("ANTON");

if(rowCustomer == null)

//沒有查找客戶

else

{

rowCustomer["CompanyName"] ="NewCompanyName";

rowCustomer["ContactName"] ="NewContactName";

}

//推薦使用這種方式

DataRow rowCustomer;

rowCustomer = ds.Tables["Custoemrs"].Rows.Find("ANTON");

if(rowCustomer == null)

//沒有查找客戶

else

{

rowCustomer.BeginEdit();

rowCustomer["CompanyName"] ="NewCompanyName";

rowCustomer["ContactName"] ="NewContactName";

rowCustomer.EndEdit();

}

//null表示不修改該列的數據

obejct[] aCustomer ={null,"NewCompanyName","NewContactName",null}

DataRow rowCustomer;

rowCustomer = ds.Tables["Customers"].Rows.Find("ALFKI");

rowCustomer.ItemArray = aCustomer;

③、處理DataRow的空值

//查看是否為空

DataRow rowCustomer;

rowCustomer = ds.Tables["Customers"].Rows.Find("ALFKI");

if(rowCustomer.IsNull("Phone"))

Console.WriteLine("It's Null");

else

Console.WriteLine("It's not Null");

//賦予空值

rowCustomer["Phone"] = DBNull.Value;

④、刪除DataRow

DataRow rowCustomer;

rowCustomer = ds.Tables["Customers"].Rows.Find("ALFKI");

rowCustomer.Delete();

⑤、清除DataRow

DataRow rowCustomer = ds.Tables["Customers"].Rows.Find("ALFKI");

rowCustomer.ItemArray = aCustomer;

da.Tables["Customers"].Remove(rowCustomer);

或者

ds.Tables["Customers"].RemoveAt(intIndex);

⑥、使用DataRow.RowState屬性 :Unchanged,Detached,Added,Modified,Deleted

private void DemonstrateRowState()

{ // Run a function to create a DataTable with one column. DataTable myTable = MakeTable();DataRow myRow;

// Create a new DataRow. myRow = myTable.NewRow();// Detached row. Console.WriteLine("New Row " + myRow.RowState);

myTable.Rows.Add(myRow);// New row. Console.WriteLine("AddRow " + myRow.RowState);

myTable.AcceptChanges();// Unchanged row. Console.WriteLine("AcceptChanges " + myRow.RowState);

myRow["FirstName"] = "Scott";// Modified row. Console.WriteLine("Modified " + myRow.RowState);

myRow.Delete();// Deleted row. Console.WriteLine("Deleted " + myRow.RowState);}

⑦、檢查DataRow中的掛起更改

DataRow rowCustomer;

rowCustomer = ds.Tables["Customers"].Rows.Find("ALFKI");

rowCustomer["CompanyName"] = "NewCompanyName";

string strNewCompanyName,strOldCompanyName;

Console.WriteLine(rowCustomer["CompanyName",DataRowVersion.Current]);

Console.WriteLine(rowCustomer["CompanyName",DataRowVersion.Original]);

1、DataSet
①、屬性
 CaseSensitive:用於控制DataTable中的字符串比較是否區分大小寫。

DataSetName:當前DataSet的名稱。如果不指定,則該屬性值設置為"NewDataSet".如果將DataSet內容寫入XML文件,DataSetName是XML文件的根節點名稱。 
DesignMode:如果在設計時使用組件中的DataSet,DesignMode返回True,否則返回False.

HasErrors:表示DataSet中的DataRow對象是否包含錯誤。如果將一批更改提交給數據庫並將DataAdapter對象的 ContinueUpdateOnError屬性設置為True,則在提交更改后必須檢查DataSet的HasErrors屬性,以確定是否有更新失敗。

NameSpace和Prefix:指定XML命名空間和前綴

Relations:返回一個DataRelationCollection對象。

Tables:檢查現有的DataTable對象。通過索引訪問DataTable有更好的性能。

②、方法
AcceptChanges和RejectChanges:接受或放棄DataSet中所有掛起更改。調用 AcceptChanges時,RowState屬性值為Added或Modified的所有行的RowState屬性都將被設置為UnChanged. 任何標記為Deleted的DataRow對象將從DataSet中刪除。調用RejectChanges時,任何標記為Added的DataRow對象將會被從DataSet中刪除,其他修改過的DatRow對象將返回前一狀態。

Clear:清除DataSet中所有DataRow對象。該方法比釋放一個DataSet然后再創建一個相同結構的新DataSet要快。

Clone和Copy:使用Copy方法會創建與原DataSet具有相同結構和相同行的新DataSet.使用Clone方法會創建具有相同結構的新DataSet,但不包含任何行。

GetChanges:返回與原DataSet對象具有相同結構的新DataSet,並且還包含原DataSet中所有掛起更改的行。

GetXml和GetXmlSchema:使用GetXml方法得到由DataSet的內容與她的架構信息轉換為XML格式后的字符串。如果只希望返回架構信息,可以使用GetXmlSchema.

HasChange:表示DataSet中是否包含掛起更改的DataRow對象。

Merge:從另一個DataSet、DataTable或現有DataSet中的一組DataRow對象載入數據。

ReadXml和WriteXml:使用ReadXml方法從文件、TextReader、數據流或者XmlReader中將XML數據載入DataSet中。

Reset:將DataSet返回為未初始化狀態。如果想放棄現有DataSet並且開始處理新的DataSet,使用Reset方法比創建一個DataSet的新實例好。

③、事件
MergeFailed:在DataSet的Merge方法發生一個異常時觸發。

 2、DataTable
①、屬性

②、方法

③、事件

ColumnChanged:在列的內容被改變之后觸發

ColumnChangding:在列的內容被改變之前觸發

RowChanged,RowChanging,RowDeleted,RowDeleting.

3、DataColumn

①、屬性

4、DataRow

①、屬性

HasError:確定行是否包含錯誤。

Item:通過指定行的列數,列的名稱或DataColumn對象本身,訪問列的內容。

ItemArray:獲取或設置行中所有列的值。

RowError:返回一個包含行錯誤信息的字符串。

RowState:返回DataRowState枚舉中的值來表示行的當前狀態。

Table:返回DataRow對象所在的DataTable.

②、方法

AcceptChanges和RejectChanges:提交和放棄掛起更改。

BeginEdit、CancelEdit、EndEdit

ClearErrors:清除DataRow中所有的錯誤。

Delete:Delete方法實際上並不從DataRow表的Row集合中刪除該DataRow.當調用DataRow對象的Delete方法時,ADO.NET將該行標記為刪除,之后調用SqlDataAdapter對象的Update方法來刪除其在數據庫中對應的行。

如果希望徹底刪除DataRow,可以調用Delete方法,接着再調用它的AccepteChanges方法,還可以使用DataRowCollection對象的Remove方法完成相同的任務。

3 如何遍歷DataSet
foreach(DataTable dt in dataSet.Tables) 
foreach(DataRow dr in dt.Rows) 
foreach(DataColumn dc in dr.Table.Columns) 
Console.WriteLine(dr[dc]);


淺談DataSet 的用法 
DataSet是ADO.NET開發人員為方便數據處理開發出來的,是數據的集合,是為解決 DataReader的缺陷設計的,DataReader數據處理速度快,但它是只讀的, 而且一旦移到下一行,就不能查看上一行的數據,DataSet 則可以自由移動指針。DataSet的數據是與數據庫斷開的。DataSet還可用於多層應用程序中,如果應用程序運行在中間層的業務對象中來訪問數據庫,則業務對象需將脫機數據結構傳遞給客戶應用程序。

  DataSet的功能:瀏覽、排序、搜索、過濾、處理分級數據、緩存更改等。還可以與XML數據互換。DataSet中可包括多個 DataTable,可將多個查詢結構存到一個DataSet中,方便操作,而DataTable中又包括多個DataRow、DataColumn,可通過這些DataRow、DataColumn來查看、操作其中的數據,而需將操作結果返回給數據庫的話,則可以調用DataAdapter的 Update方法。

  DataSet的操作:

DataSet ds=new DataSet(); 
DataTable dt=new DataTable("newTable"); 
ds.Tables.Add(dt);

DataSet ds=new DataSet(); 
DataTable dt=ds.Tables.Add("newTable"); 
上述兩種方法都可以在DataSet中添加一個DataTable,看需要而進行選擇。添加DataTable后,需向其中添加行和列。

DataSet ds=new DataSet(); 
DataTable dt=ds.Tables.Add("newTables"); 
DataColumn col=dt.Columns.Add("newColumn",typeof(int)); 
col.AllowDBNull=false; 
col.MaxLength=4; 
col.Unique=true;

上述代碼向DataSet中的DataTable中添加名為”newColumn”,類型為int且不為空,最大長度為4和唯一性為真的列。

dt.PrimaryKey=new DataColumn[]{dt.Columns["ID"]} 
這段代碼是繼續上面代碼的,為一個DataTable中添加一個主鍵列,主鍵列是一個數據組,如有多個主鍵,只需在數組中添加一個列即可。如下:

dt.PrimaryKey=new DataColumns[]{dt.Columns["OrderID"],dt.Columns["ProductID"]} 
添加外鍵:

ForeignKeyConstraint fk; 
fk=new ForeignKeyConstraint(ds.Tables["Customers"].Columns["CustomerID"],ds.Tables["Orders"].Columns["CustomerID"]); 
ds.Tables["Orders"].Constraints.Add(fk); 
//上述代碼假如已經為Cusomers表和Orders創建了主鍵,

此句為添加外鍵約束。 
上述是根據Customers表和Orders表的CustomerID來創建約束。

下面介紹修改DataRow中的內容:

DataRow dr=ds.Tables["Customer"].Rows.Find("ANTON"); 
if(dr==null)

else 

dr.BeginEdit(); 
dr["CompanyName"]="newValue"; 
dr["ContactName"]="newValue2"; 
dr.EndEdit(); 

// 上面代碼通過Row集合的Find方法來在DataTable中的行進行定位,找到"ANTON"行,再修改"ANTON"行中CompanyName列和ContactName列的值。通過BeginEdit和EndEdit來緩存對行的修改,還可調用 CancelEdit為取消修改。 
判斷某列是否為空值:

 

DataRow dr=ds.Tables["Customers"].Rows.Find("aaa"); 
if(dr.IsNull("ContactName"); 
.. 
else 
dr["ContactName"]=DBNull.Value 
//這里判斷ContactName列是否為空,如果不是則為其賦空值,呵,很無厘頭的做法,這里只為演示為列賦空值的做法。 
刪除DataRow:

有兩種方法可以刪除DataRow,Delete方法和Remove方法和RemoveAt方法。其區別是Delete方法實際上不是從 DataTable中刪除掉一行,而是將其標志為刪除,僅僅是做個記號,而Remove方法則是真正的從DataRow中刪除一行,RemoveAt方法是根本行的索引來刪除。列:

DataRow dr=ds.Tables["table"].Rows.Find("a"); 
ds.Tables["table"].Remove(dr); 
或 
ds.Tables["table"].Remove(index); 
//dr 為"a"所在的行,查出后將其刪除,index為 "a"所在的索引號。關於DataSet中的其用法,參照MSDN

 

DataRow dr=ds.Tables["Customers"].Rows.Find("aaa"); 
if(dr.IsNull("ContactName"); 
.. 
else 
dr["ContactName"]=DBNull.Value 
//這里判斷ContactName列是否為空,如果不是則為其賦空值,呵,很無厘頭的做法,這里只為演示為列賦空值的做法。

using System.Data; 
using System; 
using System.Windows.Forms; 
class DataT{ 
static DataTable dt;// = new DataTable(); 
static DataSet ds; 
static void method1(){ 
dt = new DataTable("Name"); 
ds = new DataSet(); 
dt.Columns.Add(new DataColumn("ID", typeof(Int32))); 
dt.Columns.Add(new DataColumn("Name", typeof(string))); 
dt.Columns.Add(new DataColumn("Sex", typeof(string))); 
dt.Columns.Add(new DataColumn("Addr", typeof(string))); 

static void add(int id,string name,string sex,string addr){ 
DataRow dr = dt.NewRow(); 
dr["id"] = id; 
dr["Name"] = name; 
dr["Sex"] = sex; 
dr["Addr"] = addr; 
dt.Rows.Add(dr);



static void Main(){ 
DataT DT = new DataT(); 
method1(); 
add(100,"Join","Male","北京"); 
add(101,"Lily","feMale","北京"); 
add(102,"JIM","Male","北京"); 
ds.Tables.Add(dt); 
foreach(DataRow dr in dt.Rows){ 
//MessageBox.Show(dr["ID"].ToString() + " " + dr["Name"].ToString() + " " + dr["Sex"].ToString() + " " + 
// dr["Addr"].ToString(),"Message"); 
Console.WriteLine(dr["ID"].ToString() + " " + dr["Name"].ToString() + " " + dr["Sex"].ToString() + " " + 
dr["Addr"].ToString());


try{ 
foreach(DataTable dt2 in ds.Tables) 
foreach(DataRow dr in dt2.Rows) 
Console.WriteLine(dr["ID"].ToString() + " " + dr["Name"].ToString() + " " + dr["Sex"].ToString() + " " + 
dr["Addr"].ToString()); 
}catch(Exception ex){ 
Console.WriteLine("dkfjksdjfk"); 


}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM