简体   繁体   中英

C#.NET Error: Unable to cast object of type 'System.Data.DataTable' to type 'System.Data.DataSet'

I have an editable Gridview, its data is stored in an XML file, when I attempt to insert / update / delete data to/from the Gridview, I get the following error:

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

The Gridview successfully displays the data that is stored in the xml file, but errors out when I attempt to insert / update / delete rows.

Could I gets some direction as to what I'm missing here?

XML file :

<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>

My C# code:

//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();
        }
}

Could I please get some direction/explanation as to what I'm missing in the code?

Thank you in advance.

It's because you're setting the DataSource to a DataTable :

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

not a DataSet . So, instead of this:

DataSet dsgvPartNumberDelete = (DataSet)gvPartNumber.DataSource;

do this:

DataTable dsgvPartNumberDelete = (DataTable)gvPartNumber.DataSource;

and then in the following lines you won't need accessors like .Tables[0] . It will already be a DataTable and thus more direct to access anyway.

This modification would of course have to be replicated to all of your methods where you're trying to cast the DataSource as a DataSet .

Your datasource is a DataTable, not a DataSet. You cannot cast a DataTable to a DataSet.

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM