【问题标题】:C#.NET Error: Unable to cast object of type 'System.Data.DataTable' to type 'System.Data.DataSet'C#.NET 错误:无法将“System.Data.DataTable”类型的对象转换为“System.Data.DataSet”类型
【发布时间】:2013-08-06 16:19:27
【问题描述】:

我有一个可编辑的 Gridview,它的数据存储在一个 XML 文件中,当我尝试向 Gridview 插入/更新/删除数据时,我收到以下错误:

无法将“System.Data.DataTable”类型的对象转换为“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();
        }
}

我能否就我在代码中遗漏的内容获得一些指导/解释?

提前谢谢你。

【问题讨论】:

    标签: c# asp.net xml gridview


    【解决方案1】:

    这是因为您将DataSource 设置为DataTable

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

    不是DataSet。所以,而不是这个:

    DataSet dsgvPartNumberDelete = (DataSet)gvPartNumber.DataSource;
    

    这样做:

    DataTable dsgvPartNumberDelete = (DataTable)gvPartNumber.DataSource;
    

    然后在以下几行中,您将不需要像.Tables[0] 这样的访问器。它已经是DataTable,因此更直接地访问。

    此修改当然必须复制到您尝试将DataSource 转换为DataSet 的所有方法中。

    【讨论】:

      【解决方案2】:

      您的数据源是 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"));
      

      【讨论】:

      • 谢谢你们,...我按照指示修改了我的方法。但是,当我尝试更新/删除一行时,不是仅将操作应用于一行,而是删除 XML 文件中的所有数据 - 只留下: 为了显示我的修改,我需要创建一个新帖子还是只编辑我上面提供的内容?再次感谢各位。 @解决方案
      • 我相信,如果我没记错的话,writexml 每次都会替换现有文件。听起来好像 DataTable 中没有任何内容。在将数据源转换回数据集并查看表中是否/有多少行之后立即设置断点。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-05
      • 2018-02-14
      • 1970-01-01
      • 2012-02-17
      • 1970-01-01
      • 2016-10-23
      • 2020-09-12
      相关资源
      最近更新 更多