对于DataSet中的问题真是郁闷啊
生活随笔
收集整理的這篇文章主要介紹了
对于DataSet中的问题真是郁闷啊
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
我將一個DataSet放到一個Session中,將Session中的一個表綁定到一個DataGrid中,在DataGrid中我加入了模板列。
DataSet表的示例:
當用戶通過DataGrid模板列刪除第一條記錄后,此時數據并未保存到數據庫中,只是在第一條記錄中做了一個刪除標記。但在DataGrid中用戶看到的第一條記錄已經沒有了,模板列綁定的第一條記錄實際上是DataSet中的第二條記錄,當用戶再次執行刪除DataGrid中的第一條記錄時,通過參數獲得的仍然是已經刪除的第一條記錄的rownumber,所以執行后不會在DataGrid中刪除。
具體代碼如下:
namespace?Human.WebUI.Persons.modules
{
????using?System;
????using?System.Data;
????using?System.Drawing;
????using?System.Web;
????using?System.Web.UI;
????using?System.Web.UI.WebControls;
????using?System.Web.UI.HtmlControls;
????using?Human.Common.Data;
????/**////?<summary>
????///????????ExperienceListModule?的摘要說明。
????///?</summary>
????public?class?ExperienceListModule?:?ModuleBase
????{
????????protected?System.Web.UI.WebControls.DataGrid?ExperienceDataGrid;
????????private?void?Page_Load(object?sender,?System.EventArgs?e)
????????{
????????????InitializeDataGrid();
????????????ExperienceDataGrid.DataSource=Person.Tables[PersonData.EXPERIENCE_ITEM_TABLE].DefaultView;
????????????ExperienceDataGrid.DataBind();
????????}
????????private?void?InitializeDataGrid()
????????{
????????????ExperienceDataGrid.AutoGenerateColumns=false;
????????????TemplateColumn?tcStartYear=new?TemplateColumn();
????????????tcStartYear.HeaderTemplate=new?DataGridTempleteColumn(ListItemType.Header,"開始時間");
????????????tcStartYear.ItemTemplate=new?DataGridTempleteColumn(ListItemType.Item,"StartYear");
????????????ExperienceDataGrid.Columns.Add(tcStartYear);
????????????TemplateColumn?tcEndYear=new?TemplateColumn();
????????????tcEndYear.HeaderTemplate=new?DataGridTempleteColumn(ListItemType.Header,"結束時間");
????????????tcEndYear.ItemTemplate=new?DataGridTempleteColumn(ListItemType.Item,"EndYear");
????????????ExperienceDataGrid.Columns.Add(tcEndYear);
????????????BoundColumn?CorporationCol=new?BoundColumn();
????????????CorporationCol.HeaderText="單位名稱";
????????????CorporationCol.DataField=PersonData.EXPERIENCE_CORPORATION_FIELD;
????????????ExperienceDataGrid.Columns.Add(CorporationCol);
????????????BoundColumn?DepartmentCol=new?BoundColumn();
????????????DepartmentCol.HeaderText="部門名稱";
????????????DepartmentCol.DataField=PersonData.EXPERIENCE_DEPARTMENT_FIELD;
????????????ExperienceDataGrid.Columns.Add(DepartmentCol);
????????????TemplateColumn?tcEdit=new?TemplateColumn();
????????????tcEdit.HeaderTemplate=new?DataGridTempleteColumn(ListItemType.Header,"修改");
????????????tcEdit.ItemTemplate=new?DataGridTempleteColumn(ListItemType.Item,"Edit");
????????????
????????????ExperienceDataGrid.Columns.Add(tcEdit);
????????????ButtonColumn?tcDelete=new?ButtonColumn();
????????????tcDelete.Text="刪除";
????????????tcDelete.ButtonType=ButtonColumnType.LinkButton;
????????????tcDelete.HeaderText="刪除";
????????????tcDelete.CommandName="Delete";
????????????ExperienceDataGrid.Columns.Add(tcDelete);
????????}
????????
????????Web?窗體設計器生成的代碼#region?Web?窗體設計器生成的代碼
????????override?protected?void?OnInit(EventArgs?e)
????????{
????????????//
????????????//?CODEGEN:?該調用是?ASP.NET?Web?窗體設計器所必需的。
????????????//
????????????InitializeComponent();
????????????base.OnInit(e);
????????}
????????
????????/**////?<summary>
????????///????????設計器支持所需的方法?-?不要使用代碼編輯器
????????///????????修改此方法的內容。
????????///?</summary>
????????private?void?InitializeComponent()
????????{
????????????this.ExperienceDataGrid.DeleteCommand?+=?new?System.Web.UI.WebControls.DataGridCommandEventHandler(this.ExperienceDataGrid_DeleteCommand);
????????????this.ExperienceDataGrid.ItemDataBound?+=?new?System.Web.UI.WebControls.DataGridItemEventHandler(this.ExperienceDataGrid_ItemDataBound);
????????????this.ExperienceDataGrid.SelectedIndexChanged?+=?new?System.EventHandler(this.ExperienceDataGrid_SelectedIndexChanged);
????????????this.Load?+=?new?System.EventHandler(this.Page_Load);
????????}
????????#endregion
????????private?void?ExperienceDataGrid_DeleteCommand(object?source,?System.Web.UI.WebControls.DataGridCommandEventArgs?e)
????????{
????????????if?(((LinkButton)e.CommandSource).CommandName?==?"Delete")
????????????{
????????????????try
????????????????{
????????????????????DataTable?ExperienceTable=Person.Tables[PersonData.EXPERIENCE_ITEM_TABLE];
????????????????????DataRow?row=ExperienceTable.Rows[e.Item.ItemIndex];
????????????????????row.Delete();
????????????????}
????????????????catch(Exception?ex)
????????????????{
????????????????????string?s=ex.Message.ToString();
????????????????}
????????????}
????????}
????????private?void?ExperienceDataGrid_SelectedIndexChanged(object?sender,?System.EventArgs?e)
????????{
????????
????????}
????????private?void?ExperienceDataGrid_ItemDataBound(object?sender,?System.Web.UI.WebControls.DataGridItemEventArgs?e)
????????{
????????????if((e.Item.ItemType!=?ListItemType.Header)?&?(?e.Item.ItemType?!=?ListItemType.Footer))
????????????{
????????????????LinkButton?oDeleteButton??=?(LinkButton)e.Item.Cells[5].Controls[0];
????????????????oDeleteButton.Attributes.Add("onclick","Javascript:return?confirm('您是否確認要刪除此記錄?');");
????????????}
????????}
????}
????class?DataGridTempleteColumn:ITemplate
????{
????????ListItemType?templateType;
????????string?columnName;
???
????????public?DataGridTempleteColumn(ListItemType?type,?string?colname)
????????{
????????????templateType?=?type;
????????????columnName?=?colname;
????????}
????????public?void?InstantiateIn(System.Web.UI.Control?container)
????????{
????????????Literal?lc?=?new?Literal();
????????????switch(templateType)
????????????{
????????????????case?ListItemType.Header:
????????????????????lc.Text?=?columnName;
????????????????????container.Controls.Add(lc);
????????????????????break;
????????????????case?ListItemType.Item:
????????????????????lc.DataBinding+=new?EventHandler(TemplateControl_DataBinding);
????????????????????container.Controls.Add(lc);
????????????????????break;
????????????????case?ListItemType.EditItem:
????????????????????TextBox?tb?=?new?TextBox();
????????????????????tb.Text?=?"";
????????????????????container.Controls.Add(tb);
????????????????????break;
????????????????case?ListItemType.Footer:
????????????????????lc.Text?=?"<I>"?+?columnName?+?"</I>";
????????????????????container.Controls.Add(lc);
????????????????????break;
????????????}
????????}
????
????????private?void?TemplateControl_DataBinding(object?sender,
????????????System.EventArgs?e)
????????{
????????????Literal?lc;
????????????lc?=?(Literal)?sender;
????????????DataGridItem?container=(DataGridItem)lc.NamingContainer;
????????????if(columnName=="StartYear")
????????????{
????????????????lc.Text+=DataBinder.Eval(container.DataItem,?"StartYear");
????????????????lc.Text+="年";
????????????????lc.Text+=DataBinder.Eval(container.DataItem,?"StartMonth");
????????????????lc.Text+="月";
????????????}
????????????if(columnName=="EndYear")
????????????{
????????????????if(Convert.ToString(DataBinder.Eval(container.DataItem,?"EndYear"))!="")
????????????????{
????????????????????lc.Text+=DataBinder.Eval(container.DataItem,?"EndYear");
????????????????????lc.Text+="年";
????????????????????lc.Text+=DataBinder.Eval(container.DataItem,?"EndMonth");
????????????????????lc.Text+="月";
????????????????}
????????????????else
????????????????{
????????????????????lc.Text+="至今";
????????????????}
????????????}
????????????if(columnName=="Edit")
????????????{
????????????????lc.Text+="<a?href=#?οnclick='EditExperience("+container.DataSetIndex+")'>修改</a>";
????????????}
????????}
????}
}
問題終于解決了,由于我是使用Row.Delete()函數,數據并未從數據集中刪除,只是做了一個刪除標記,所以在提取數據時,需要計算DataGrid中要刪除行中數據在DataSet中具體是對應的那條。函數如下:
??private?int?GetFactRowItem(DataTable?table,int?ItemIndex)
??{
???int?FactRowItem=0;
???int?UnDeleteRowCount=-1;
???while(UnDeleteRowCount<ItemIndex)
???{
????if(table.Rows[FactRowItem].RowState==DataRowState.Deleted)
????{
?????FactRowItem++;
????}
????else
????{
?????FactRowItem++;
?????UnDeleteRowCount++;
????}
???}
???return?FactRowItem-1;
??}?
DataSet表的示例:
| 字段1 | 字段2 | 字段3 | 刪除標記 |
| ID1 | 姓名1 | 地址1 | 已經刪除 |
| ID2 | 姓名2 | 地址2 | |
| ID3 | 姓名3 | 地址3 |
具體代碼如下:
namespace?Human.WebUI.Persons.modules
{
????using?System;
????using?System.Data;
????using?System.Drawing;
????using?System.Web;
????using?System.Web.UI;
????using?System.Web.UI.WebControls;
????using?System.Web.UI.HtmlControls;
????using?Human.Common.Data;
????/**////?<summary>
????///????????ExperienceListModule?的摘要說明。
????///?</summary>
????public?class?ExperienceListModule?:?ModuleBase
????{
????????protected?System.Web.UI.WebControls.DataGrid?ExperienceDataGrid;
????????private?void?Page_Load(object?sender,?System.EventArgs?e)
????????{
????????????InitializeDataGrid();
????????????ExperienceDataGrid.DataSource=Person.Tables[PersonData.EXPERIENCE_ITEM_TABLE].DefaultView;
????????????ExperienceDataGrid.DataBind();
????????}
????????private?void?InitializeDataGrid()
????????{
????????????ExperienceDataGrid.AutoGenerateColumns=false;
????????????TemplateColumn?tcStartYear=new?TemplateColumn();
????????????tcStartYear.HeaderTemplate=new?DataGridTempleteColumn(ListItemType.Header,"開始時間");
????????????tcStartYear.ItemTemplate=new?DataGridTempleteColumn(ListItemType.Item,"StartYear");
????????????ExperienceDataGrid.Columns.Add(tcStartYear);
????????????TemplateColumn?tcEndYear=new?TemplateColumn();
????????????tcEndYear.HeaderTemplate=new?DataGridTempleteColumn(ListItemType.Header,"結束時間");
????????????tcEndYear.ItemTemplate=new?DataGridTempleteColumn(ListItemType.Item,"EndYear");
????????????ExperienceDataGrid.Columns.Add(tcEndYear);
????????????BoundColumn?CorporationCol=new?BoundColumn();
????????????CorporationCol.HeaderText="單位名稱";
????????????CorporationCol.DataField=PersonData.EXPERIENCE_CORPORATION_FIELD;
????????????ExperienceDataGrid.Columns.Add(CorporationCol);
????????????BoundColumn?DepartmentCol=new?BoundColumn();
????????????DepartmentCol.HeaderText="部門名稱";
????????????DepartmentCol.DataField=PersonData.EXPERIENCE_DEPARTMENT_FIELD;
????????????ExperienceDataGrid.Columns.Add(DepartmentCol);
????????????TemplateColumn?tcEdit=new?TemplateColumn();
????????????tcEdit.HeaderTemplate=new?DataGridTempleteColumn(ListItemType.Header,"修改");
????????????tcEdit.ItemTemplate=new?DataGridTempleteColumn(ListItemType.Item,"Edit");
????????????
????????????ExperienceDataGrid.Columns.Add(tcEdit);
????????????ButtonColumn?tcDelete=new?ButtonColumn();
????????????tcDelete.Text="刪除";
????????????tcDelete.ButtonType=ButtonColumnType.LinkButton;
????????????tcDelete.HeaderText="刪除";
????????????tcDelete.CommandName="Delete";
????????????ExperienceDataGrid.Columns.Add(tcDelete);
????????}
????????
????????Web?窗體設計器生成的代碼#region?Web?窗體設計器生成的代碼
????????override?protected?void?OnInit(EventArgs?e)
????????{
????????????//
????????????//?CODEGEN:?該調用是?ASP.NET?Web?窗體設計器所必需的。
????????????//
????????????InitializeComponent();
????????????base.OnInit(e);
????????}
????????
????????/**////?<summary>
????????///????????設計器支持所需的方法?-?不要使用代碼編輯器
????????///????????修改此方法的內容。
????????///?</summary>
????????private?void?InitializeComponent()
????????{
????????????this.ExperienceDataGrid.DeleteCommand?+=?new?System.Web.UI.WebControls.DataGridCommandEventHandler(this.ExperienceDataGrid_DeleteCommand);
????????????this.ExperienceDataGrid.ItemDataBound?+=?new?System.Web.UI.WebControls.DataGridItemEventHandler(this.ExperienceDataGrid_ItemDataBound);
????????????this.ExperienceDataGrid.SelectedIndexChanged?+=?new?System.EventHandler(this.ExperienceDataGrid_SelectedIndexChanged);
????????????this.Load?+=?new?System.EventHandler(this.Page_Load);
????????}
????????#endregion
????????private?void?ExperienceDataGrid_DeleteCommand(object?source,?System.Web.UI.WebControls.DataGridCommandEventArgs?e)
????????{
????????????if?(((LinkButton)e.CommandSource).CommandName?==?"Delete")
????????????{
????????????????try
????????????????{
????????????????????DataTable?ExperienceTable=Person.Tables[PersonData.EXPERIENCE_ITEM_TABLE];
????????????????????DataRow?row=ExperienceTable.Rows[e.Item.ItemIndex];
????????????????????row.Delete();
????????????????}
????????????????catch(Exception?ex)
????????????????{
????????????????????string?s=ex.Message.ToString();
????????????????}
????????????}
????????}
????????private?void?ExperienceDataGrid_SelectedIndexChanged(object?sender,?System.EventArgs?e)
????????{
????????
????????}
????????private?void?ExperienceDataGrid_ItemDataBound(object?sender,?System.Web.UI.WebControls.DataGridItemEventArgs?e)
????????{
????????????if((e.Item.ItemType!=?ListItemType.Header)?&?(?e.Item.ItemType?!=?ListItemType.Footer))
????????????{
????????????????LinkButton?oDeleteButton??=?(LinkButton)e.Item.Cells[5].Controls[0];
????????????????oDeleteButton.Attributes.Add("onclick","Javascript:return?confirm('您是否確認要刪除此記錄?');");
????????????}
????????}
????}
????class?DataGridTempleteColumn:ITemplate
????{
????????ListItemType?templateType;
????????string?columnName;
???
????????public?DataGridTempleteColumn(ListItemType?type,?string?colname)
????????{
????????????templateType?=?type;
????????????columnName?=?colname;
????????}
????????public?void?InstantiateIn(System.Web.UI.Control?container)
????????{
????????????Literal?lc?=?new?Literal();
????????????switch(templateType)
????????????{
????????????????case?ListItemType.Header:
????????????????????lc.Text?=?columnName;
????????????????????container.Controls.Add(lc);
????????????????????break;
????????????????case?ListItemType.Item:
????????????????????lc.DataBinding+=new?EventHandler(TemplateControl_DataBinding);
????????????????????container.Controls.Add(lc);
????????????????????break;
????????????????case?ListItemType.EditItem:
????????????????????TextBox?tb?=?new?TextBox();
????????????????????tb.Text?=?"";
????????????????????container.Controls.Add(tb);
????????????????????break;
????????????????case?ListItemType.Footer:
????????????????????lc.Text?=?"<I>"?+?columnName?+?"</I>";
????????????????????container.Controls.Add(lc);
????????????????????break;
????????????}
????????}
????
????????private?void?TemplateControl_DataBinding(object?sender,
????????????System.EventArgs?e)
????????{
????????????Literal?lc;
????????????lc?=?(Literal)?sender;
????????????DataGridItem?container=(DataGridItem)lc.NamingContainer;
????????????if(columnName=="StartYear")
????????????{
????????????????lc.Text+=DataBinder.Eval(container.DataItem,?"StartYear");
????????????????lc.Text+="年";
????????????????lc.Text+=DataBinder.Eval(container.DataItem,?"StartMonth");
????????????????lc.Text+="月";
????????????}
????????????if(columnName=="EndYear")
????????????{
????????????????if(Convert.ToString(DataBinder.Eval(container.DataItem,?"EndYear"))!="")
????????????????{
????????????????????lc.Text+=DataBinder.Eval(container.DataItem,?"EndYear");
????????????????????lc.Text+="年";
????????????????????lc.Text+=DataBinder.Eval(container.DataItem,?"EndMonth");
????????????????????lc.Text+="月";
????????????????}
????????????????else
????????????????{
????????????????????lc.Text+="至今";
????????????????}
????????????}
????????????if(columnName=="Edit")
????????????{
????????????????lc.Text+="<a?href=#?οnclick='EditExperience("+container.DataSetIndex+")'>修改</a>";
????????????}
????????}
????}
}
問題終于解決了,由于我是使用Row.Delete()函數,數據并未從數據集中刪除,只是做了一個刪除標記,所以在提取數據時,需要計算DataGrid中要刪除行中數據在DataSet中具體是對應的那條。函數如下:
??private?int?GetFactRowItem(DataTable?table,int?ItemIndex)
??{
???int?FactRowItem=0;
???int?UnDeleteRowCount=-1;
???while(UnDeleteRowCount<ItemIndex)
???{
????if(table.Rows[FactRowItem].RowState==DataRowState.Deleted)
????{
?????FactRowItem++;
????}
????else
????{
?????FactRowItem++;
?????UnDeleteRowCount++;
????}
???}
???return?FactRowItem-1;
??}?
轉載于:https://www.cnblogs.com/landina/archive/2005/12/24/304064.html
總結
以上是生活随笔為你收集整理的对于DataSet中的问题真是郁闷啊的全部內容,希望文章能夠幫你解決所遇到的問題。