【问题标题】:Hidden button won't show when set to visible=true unless browser refreshes当设置为 visible=true 时隐藏按钮不会显示,除非浏览器刷新
【发布时间】:2013-11-08 19:16:20
【问题描述】:

如果满足某些条件,我会隐藏网格视图中的某个按钮:

protected void storyGridView_OnRowDataBound(Object sender, GridViewRowEventArgs e)
{
   if (e.Row.RowType == DataControlRowType.DataRow)
   {
      int count = Int32.Parse(SqlInteraction.sqlQueryReturnString(conn => countNumberOfHoursBilled(conn, DataBinder.Eval(e.Row.DataItem, "PK_NonScrumStory").ToString())));
      DateTime createdDate = DateTime.Parse(DataBinder.Eval(e.Row.DataItem, "CreatedDate").ToString());
      if (count > 0 || createdDate < DateTime.Today)
      {
         Button btn = (Button)e.Row.FindControl("deleteButton");
         btn.Visible = false;
      }
      else
      {
         Button btn = (Button)e.Row.FindControl("deleteButton");
         btn.Visible = true;
      }
   }
}

这很好用,但是我注意到在使用页面期间满足其中一个条件时,除非我刷新页面,否则删除按钮不会正确来回更改。

我已尝试对 gridview 进行数据绑定,但它不起作用;

protected void viewHoursGridView_OnRowDeleting(object sender, GridViewDeleteEventArgs e)
{
   GridView gv = sender as GridView;
   SqlDataSource6.DeleteParameters["setDailyPKDeleteParam"].DefaultValue = gv.DataKeys[e.RowIndex].Value.ToString();
   storyGridView.DataBind();
}

因此,如果我删除一行并且计数变为零,则该按钮应该可见。但在我刷新页面之前它不会变得可见。

我该如何解决这个问题?

编辑:

<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:ApplicationServices %>"
    SelectCommand="
                SELECT NSS.PK_NonScrumStory
                    ,SCY.Catagory AS Catagory
                    ,APN.AppName AS [Application]
                    ,NSS.IncidentNumber AS IncidentNumber
                    ,CASE WHEN (NSS.[Status] = 1) THEN 'Open' ELSE 'Closed' END AS [Status]
                    ,NSS.EstimatedHours AS EstimatedHours
                    ,NSS.[Description] AS [Description]
                    ,NSS.CreateDate AS CreatedDate
                FROM NonScrumStory NSS
                LEFT JOIN SupportCatagory SCY ON NSS.CatagoryId = SCY.PK_SupportCatagory
                LEFT JOIN [Application] APN ON NSS.ApplicationId = APN.PK_Application
                WHERE NSS.Deleted = 0
                    AND NSS.UserId = @nonScrumStoryUser
                ORDER BY CreatedDate DESC
    ">
    <SelectParameters>
        <asp:QueryStringParameter Name="nonScrumStoryUser" Type="Int16" />
    </SelectParameters>
</asp:SqlDataSource>

【问题讨论】:

  • 在离开OnRowDeleting 事件之前,该删除实际上是否保存回数据库?如果没有,您的 OnRowDataBound 事件在访问数据库时不会看到更改。
  • 如何让它看到变化?

标签: c# asp.net


【解决方案1】:

您需要在 RowDeleting 事件中再次获取数据,然后将该数据绑定到 GridView。本质上你需要重新设置GridView的DataSource并绑定数据,这样删除一行后才能看到更新的数据。

更新

查看SqlDataSource 后,您还没有编写删除该行时单击Delete 按钮的命令。所以更改没有被推送到数据库,这就是您的 GridView 没有看到更改的原因。您需要将 DeleteCommand 添加到 SqlDataSource。

DeleteCommand="DELETE FROM [TableName] WHERE [ColumnName]=@[ParameterName];">
            <DeleteParameters>
                <asp:ControlParameter Name="[ParameterName]" ControlId="storyGridView" PropertyName="SelectedValue" />
            </DeleteParameters>

代码可能在语法上并不完全正确,但这是为了给您一个想法。 查看来自 MSDN 的 this 示例。

【讨论】:

  • 一开始你是如何将数据绑定到 GridView 的?您是否从 SQL 获取数据?如果是这样,您需要调用该代码并设置 GridView 的 DataSource 属性,如 storyGridView.DataSource = > 然后调用 storyGridView.DataBind()
  • 我通过 SQL
  • 当您单击删除按钮时,该行是否已从数据库中删除?如果没有,请参阅我的更新答案。
猜你喜欢
  • 2014-12-27
  • 1970-01-01
  • 1970-01-01
  • 2021-12-03
  • 1970-01-01
  • 1970-01-01
  • 2013-01-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多