我有一个gridview,它运行一个rowcommand来更新数据库中的值。一切正常,除了在运行更新后,gridview不会刷新表的最新值。我已经看到很多解决方案来解决这个问题,他们中的大多数只是简单地说,“只是重新绑定gridview”
我尝试过运行gridview的绑定,但这没有什么可以刷新gridview。
我还尝试将数据源重新分配给首次创建表时使用的objectdatasource:
GridViewHolder.DataSource = MachineDataSet;
GridViewHolder.DataBind();
但是,我最终得到一个错误说:声明了datasource和datasourceid,并删除了一个定义。
如果有人能告诉我我的gridview错误了什么,我会非常感激吗?
下面你会看到我的gridview和rowcomhind for rowcommand。
Gridview:注意:我删除了所有不必要的上下文以便于阅读,如果您需要更多信息,我会抛出gridview的整个代码。
<asp:GridView ID="GridViewHolder"
runat="server"
AllowPaging="True"
AutoGenerateColumns="False"
EnableViewState="False"
DataKeyNames="ID"
OnRowCommand="GridViewHolder_RowCommand"
DataSourceID="MachineDataSet">
<RowStyle BackColor="Transparent"
HorizontalAlign="Center" />
<Columns>
<asp:ButtonField ButtonType="Button" Text="Assign New Values"
CommandName="AssignNewValue" ItemStyle-Wrap="true"
ItemStyle-Width="25px">
<ItemStyle Width="25px" Wrap="True" />
</asp:ButtonField>
</Columns>
</asp:GridView>
代码隐藏:
/// <summary>
/// Handles the rowcommand event button
/// </summary>
/// <param name="sender">The source control event</param>
/// <param name="e">The <see cref="System.Web.UI.WebControls.GridViewCommandEventArgs"/> instance containing the even data.</param>
protected void GridViewHolder_RowCommand(object sender, GridViewCommandEventArgs e)
{
logger.Debug("Entering Row Command");
if (e.CommandName.CompareTo("AssignNewValue") == 0)
{
try
{
logger.Debug("Entering AssignNewValue Command");
int index = Convert.ToInt32(e.CommandArgument);
GridView gv = (GridView)Panel1.FindControl("GridViewHolder");
GridViewRow row = gv.Rows[index];
Label machineID = (Label)row.FindControl("MachineIDLabel");
int machineid = Convert.ToInt32(machineID.Text);
string machinetypeid = MachineTypeComboBox.SelectedValue;
string machinemodelid = MachineModelComboBox.SelectedValue;
try
{
if (machinetypeid != "" || machinemodelid != "")
{
if (machinetypeid != "")
{
inputsService.UpdateMachineTypes(machineid, machinetypeid);
}
if (machinemodelid != "")
{
inputsService.UpdateMachineModels(machineid, machinemodelid);
}
UpdateSucceed.Visible = true;
logger.Debug("AssignNewValue - Database successfully updated!");
}
else
{
UpdateFail.Visible = true;
logger.Debug("AssignNewValue - Database had no data selected to be updated.");
}
}
catch (Exception ex)
{
logger.ErrorFormat("AssignNewValue - Failed to update the table, ex = {0}", ex);
}
}
catch (Exception ex)
{
logger.ErrorFormat("AssignNewValue Failed to complete, {0}", ex);
}
logger.Debug("Leaving AssignNewValue Command");
}
logger.Debug("Leaving Row Command");
}
数据源代码:
<asp:ObjectDataSource ID="MachineDataSet"
runat="server"
SelectMethod="GetMachineSiteDetails"
TypeName="Datamart.UI.Reporting.Web.FilteredReportInputsSvc.FilteredReportInputsService"
EnableCaching="True">
<SelectParameters>
<asp:Parameter DefaultValue="" Name="siteid" Type="String" />
</SelectParameters>
</asp:ObjectDataSource>
非常感谢任何帮助或建议。
由于
答案 0 :(得分:2)
我发现你的代码中有这个:
GridView gv = (GridView)Panel1.FindControl("GridViewHolder")
GridViewHolder.DataSource = MachineDataSet;
GridViewHolder.DataBind();
UpdateSucceed.Visible = true;
应该是:
GridView gv = (GridView)Panel1.FindControl("GridViewHolder")
gv.DataSource = MachineDataSet;
gv.DataBind();
UpdateSucceed.Visible = true;
但是,我会在一个函数中使用它并在page_load
事件中调用它,也在row_command
上调用它。但是你不应该对gridview的定义有所了解:
DataSourceID="MachineDataSet">
只有在页面中有DataSource控件时才应使用DataSourceID。
编辑:请记住,如果你从后面的代码绑定gridview,你将不得不在代码中进行一些调整,以便能够在Gridview中进行分页/排序。如果您需要帮助,只需要进行简单的搜索,您就会发现它。 祝你好运!