0

編集可能な 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();
        }
}

コードに欠けているものについて、方向性や説明を教えてください。

前もって感謝します。

4

2 に答える 2

4

DataSourceを a に設定しているためですDataTable

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

ではありませんDataSet。したがって、これの代わりに:

DataSet dsgvPartNumberDelete = (DataSet)gvPartNumber.DataSource;

これを行う:

DataTable dsgvPartNumberDelete = (DataTable)gvPartNumber.DataSource;

そして、次の行では、のようなアクセサーは必要ありません.Tables[0]DataTableとにかくアクセスがより直接的になります。

DataSourceもちろん、この変更は、を としてキャストしようとしているすべてのメソッドに複製する必要がありますDataSet

于 2013-08-06T16:21:12.567 に答える
1

データソースは DataSet ではなく DataTable です。DataTable を DataSet にキャストすることはできません。

DataTable dtUpdateXMLFile = (DataTable)gvPartNumber.DataSource;
dtUpdateXMLFile.Rows[index]["partid"] = partId;
dtUpdateXMLFile.Rows[index]["partnumber"] = partNumber;
dtUpdateXMLFile.WriteXml(Server.MapPath("~/xml/storeUserInfo.xml"));
于 2013-08-06T16:21:14.527 に答える