【问题标题】:update GridView BoundFields using ObjectDataSource使用 ObjectDataSource 更新 GridView BoundFields
【发布时间】:2014-04-22 01:39:39
【问题描述】:

我有一个 GridView,我想在我的 ObjectDataSource 中使用自定义方法编辑/更新行。我可以使用自动生成的列而不是我需要的 BoundFields 来让它工作。我尝试在 RowUpdated、RowUpdating 和 RowEditing 事件中执行 GridView1.DataBind()。我没有收到错误消息。它只是不更新​​行。

IncidentUpdate.aspx

<asp:GridView ID="GridView1" runat="server" DataSourceID="ObjectDataSource2" AutoGenerateColumns="false">
    <Columns>
        <asp:CommandField ShowEditButton="True" />
        <asp:BoundField DataField="IncidentID" HeaderText="ID" ReadOnly="True" />
        <asp:BoundField DataField="ProductCode" HeaderText="Product Code"  ReadOnly="True" />
        <asp:BoundField DataField="DateOpened" HeaderText="Date Opened"  ReadOnly="True" />
        <asp:BoundField DataField="DateClosed" HeaderText="Date Closed" />
        <asp:BoundField DataField="Title" HeaderText="Title"  ReadOnly="True" />
        <asp:BoundField DataField="Description" HeaderText="Description" />
    </Columns>
</asp:GridView>
<asp:ObjectDataSource ID="ObjectDataSource2" runat="server" SelectMethod="GetCustomerIncidents" TypeName="IncidentDB" UpdateMethod="UpdateIncident">
    <SelectParameters>
        <asp:ControlParameter ControlID="DropDownList1" Name="customerID" PropertyName="SelectedValue" Type="Int32" />
    </SelectParameters>
    <UpdateParameters>
        <asp:Parameter Name="incidentID" Type="Int32" />
        <asp:Parameter Name="dateClosed" Type="DateTime" />
        <asp:Parameter Name="description" Type="String" />
    </UpdateParameters>
</asp:ObjectDataSource>

App_Code\Service.cs

 public static DataSet UpdateIncident(int incidentID, DateTime dateClosed,string description)
 {
    TechSupportDB techSupportDB = new TechSupportDB();
    var myConnection = techSupportDB.GetConnectionString();

    SqlCommand myCommand = new SqlCommand();

    myCommand.Parameters.AddWithValue("@IncidentID", incidentID);
    myCommand.Parameters.AddWithValue("@DateClosed", dateClosed);
    myCommand.Parameters.AddWithValue("@Description", description);
    myCommand.CommandText = 
    "update Incidents set DateClosed = @DateClosed, Description = @Description where IncidentID = @IncidentID";

    myCommand.Connection = myConnection;
    SqlDataAdapter myAdapter = new SqlDataAdapter(myCommand);
    DataSet updatedIncidentsDataSet = new DataSet();
    myAdapter.Fill(updatedIncidentsDataSet);
    return updatedIncidentsDataSet;
}

【问题讨论】:

标签: c# asp.net gridview objectdatasource boundfield


【解决方案1】:

我认为你并没有真正用你的代码更新你的表格。

在此处更改这部分代码:

public static DataSet UpdateIncident(int incidentID, DateTime dateClosed,string description)
{
    TechSupportDB techSupportDB = new TechSupportDB();
    var myConnection = techSupportDB.GetConnectionString();

    SqlCommand myCommand = new SqlCommand();

    myCommand.Parameters.AddWithValue("@IncidentID", incidentID);
    myCommand.Parameters.AddWithValue("@DateClosed", dateClosed);
    myCommand.Parameters.AddWithValue("@Description", description);
    myCommand.CommandText = 
    "update Incidents set DateClosed = @DateClosed, Description = @Description where IncidentID = @IncidentID";

    myCommand.Connection = myConnection;
    SqlDataAdapter myAdapter = new SqlDataAdapter("SELECT * FROM Incidents ORDR BY IncidentId");

    DataSet updatedIncidentsDataSet = new DataSet();
    myAdapter.Fill(updatedIncidentsDataSet, "Incidents");

    myAdapter.UpdateCommand = myCommand;
    myAdapter.Update(updatedIncidentsDataSet, "Incidents");

    return updatedIncidentsDataSet;
}

您需要指定要更新的表名。在你的情况下是Incidents

试试:

myAdpter.Update(updatedIncidentsDataSet, "Incidents");

如果我们不指定要更新的表名,DataAdapter 将使用默认表名"Table",这就是您得到Update unable to find TableMapping['Table']的原因

【讨论】:

  • 不走运。我得到相同的结果。它不会更新,也没有错误消息。
  • 您需要在我发布的方法中设置一个断点,以查看您在每一行中得到了什么。
  • 在这一行:myAdapter.Update(updatedIncidentsDataSet);我收到无效操作异常:更新无法找到 TableMapping['Table'] 或 DataTable 'Table'。我尝试将表添加到数据集,然后执行 myAdapter.Update(updatedIncidentDataSet, "TableName") 但这不起作用。
  • 我确实尝试了您在编辑中提出的建议。错误消息是“更新无法找到 TableMapping['Incidents'] 或 DataTable 'Incidents'”。所以我添加了 updatedIncidentsDataSet.Tables.Add("Incidents");这仍然行不通。我错过了什么?
  • 请在我的回答中查看编辑后的方法。这次测试了我的工作。
【解决方案2】:

您好,我从您的问题中得到的信息很少,即在第一次加载时您得到了您想要的(期望的结果)。然后您正在做某事(可能添加一些行、编辑或删除)并且您知道您在哪一行上执行了哪些操作。

那您为什么不编写一个单独的函数来单独执行该活动。如果您要更新新行,请在 DB 中更新它并从数据库重新填充您的网格。

TechSupportDB techSupportDB = new TechSupportDB(); var myConnection = techSupportDB.GetConnectionString(); SqlCommand myCommand = new SqlCommand(); myCommand.Parameters.AddWithValue("@IncidentID", eventID); myCommand.Parameters.AddWithValue("@DateClosed", dateClosed); myCommand.Parameters.AddWithValue("@Description", description); myCommand.CommandText = “更新事件集 DateClosed = @DateClosed,描述 = @Description 其中 IncidentID = @IncidentID”; myCommand.Connection = myConnection; myCommand.ExecuteNonQuery();

这会将数据保存到您的数据库表中,并从您的基本查询中重新填充网格。这样你就会得到你想要的结果。

【讨论】:

    【解决方案3】:

    IncidentID 的 BoundField 设置为只读,因此用户无法编辑此字段,但这也阻止了它传递进行更新所需的值。解决方法:在 GridView 中设置 DataKeyNames = IncidentID。

     <asp:GridView ID="GridView1" runat="server" DataSourceID="ObjectDataSource2"
      AutoGenerateColumns="False" DataKeyNames="IncidentID">
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-06
      • 1970-01-01
      • 1970-01-01
      • 2012-09-14
      相关资源
      最近更新 更多