2013-08-06 56 views
0

我有一個可編輯的GridView,它的數據存儲在XML文件中,當我試圖插入/更新/在GridView刪除數據/,我得到以下錯誤:C#.NET錯誤:無法強制轉換'System.Data.DataTable'類型的對象來鍵入'System.Data.DataSet'

Unable to cast object of type 'System.Data.DataTable' to type 'System.Data.DataSet

GridView的成功顯示存儲在XML文件中的數據,但如果出現錯誤,當我試圖插入/更新/刪除行。

我可以得到一些方向,我在這裏失蹤了嗎?

XML文件

<root> 
<pos> 
    <partNumbers> 
    <partid>0</partid> 
    <partnumber>796542</partnumber> 
    </partNumbers> 
    <partNumbers> 
    <partid>1</partid> 
    <partnumber>225614</partnumber> 
    </partNumbers> 
    <partNumbers> 
    <partid>2</partid> 
    <partnumber>123457</partnumber> 
    </partNumbers> 
</pos> 
</root> 

我的C#代碼:

//Bind Data 
protected void BindGridView() 
{ 
     DataSet dsgvPartNumber = new DataSet(); 
     dsgvPartNumber.ReadXml(Server.MapPath("~/xml/storeUserInfo.xml")); 
     gvPartNumber.DataSource = dsgvPartNumber.Tables["partNumbers"]; 
     gvPartNumber.DataBind(); 
     gvPartNumber.ShowFooter = true; 
} 

// Delete Row 
protected void gvPartNumber_RowDeleting(object sender, GridViewDeleteEventArgs e) 
{ 
     BindGridView(); 
     DataSet dsgvPartNumberDelete = (DataSet)gvPartNumber.DataSource; 
     dsgvPartNumberDelete.Tables[0].Rows[gvPartNumber.Rows[e.RowIndex].DataItemIndex].Delete(); 
     dsgvPartNumberDelete.WriteXml(Server.MapPath("~/xml/storeUserInfo.xml")); 
     BindGridView(); 
} 

// EditGridView 
protected void gvPartNumber_RowEditing(object sender, GridViewEditEventArgs e) 
{ 
     gvPartNumber.ShowFooter = false; 
     gvPartNumber.EditIndex = e.NewEditIndex; 
     BindGridView(); 
} 

// Update GridView 
protected void gvPartNumber_RowUpdating(object sender, GridViewUpdateEventArgs e) 
{ 
     int index = gvPartNumber.Rows[e.RowIndex].DataItemIndex; 
     string partId = ((TextBox)gvPartNumber.Rows[e.RowIndex].FindControl("txtPartID")).Text; 
     string partNumber = ((TextBox)gvPartNumber.Rows[e.RowIndex].FindControl("txtPartNumber")).Text; 
     gvPartNumber.EditIndex = -1; 
     BindGridView(); 
     DataSet dsUpdateXMLFile = (DataSet)gvPartNumber.DataSource; 
     dsUpdateXMLFile.Tables[0].Rows[index]["partid"] = partId; 
     dsUpdateXMLFile.Tables[0].Rows[index]["partnumber"] = partNumber; 
     dsUpdateXMLFile.WriteXml(Server.MapPath("~/xml/storeUserInfo.xml")); 
     BindGridView(); 
} 

// Insert New Row 
protected void gvPartNumber_RowCommand(object sender, GridViewCommandEventArgs e) 
{ 
     if (e.CommandName == "insertXMLData") 
     { 
      string partid = ((TextBox)gvPartNumber.FooterRow.FindControl("txtPartIDInsert")).Text; 
      string partnumber = ((TextBox)gvPartNumber.FooterRow.FindControl("txtPartNumberInsert")).Text; 
      BindGridView(); 
      DataSet dsXMLInsert = (DataSet)gvPartNumber.DataSource; 
      DataRow drInsert = dsXMLInsert.Tables[0].NewRow(); 
      drInsert["partid"] = partid; 
      drInsert["partnumber"] = partnumber; 
      dsXMLInsert.Tables[0].Rows.Add(drInsert); 
      dsXMLInsert.WriteXml(Server.MapPath("~/xml/storeUserInfo.xml")); 
      BindGridView(); 
     } 
} 

我能請得到一些方向/解釋什麼,我缺少的代碼?

預先感謝您。

回答

4

這是因爲你設置DataSourceDataTable

gvPartNumber.DataSource = dsgvPartNumber.Tables["partNumbers"]; 

不是DataSet。所以,與其這樣:

DataSet dsgvPartNumberDelete = (DataSet)gvPartNumber.DataSource; 

做到這一點:

DataTable dsgvPartNumberDelete = (DataTable)gvPartNumber.DataSource; 

,然後在下面幾行你就不必存取像.Tables[0]。它已經是DataTable,因此無論如何都是直接訪問。

此修改當然必須複製到您試圖將DataSource作爲DataSet投射的所有方法。

1

您的數據源是一個DataTable,而不是DataSet。您不能將DataTable轉換爲DataSet。

DataTable dtUpdateXMLFile = (DataTable)gvPartNumber.DataSource; 
dtUpdateXMLFile.Rows[index]["partid"] = partId; 
dtUpdateXMLFile.Rows[index]["partnumber"] = partNumber; 
dtUpdateXMLFile.WriteXml(Server.MapPath("~/xml/storeUserInfo.xml")); 
+0

謝謝你們兩位......我根據指示修改了我的方法。但是,當我試圖更新/刪除一行時,而不是僅應用於一行的操作,XML文件中的所有數據都將被刪除 - 只留下:<?xml version =「1.0」standalone =「yes」? > 要顯示我的修改,是否需要創建一個新帖子或只是編輯我上面提供的?再次感謝你們。 @The Solution – user1724708

+0

我相信,如果我沒記錯的話,writexml會每次替換現有的文件。這聽起來好像DataTable中沒有任何內容。在將數據源轉換回數據集並查看錶中有多少行時,立即放置一個斷點。 –

相關問題