【问题标题】:asp:Button not displaying correctlyasp:按钮显示不正确
【发布时间】:2014-04-08 21:01:05
【问题描述】:

这是我的场景:

我想根据我的 gridview 中显示的行数显示一个按钮 (btnGenerate)。我让它显示一秒钟然后它又消失了。我正在使用我的其他按钮之一(btnImport)的onclientclick。我认为导致问题的原因是在同一个按钮(btnImport)的 OnClick 事件上,两个 gridview 为每个数据绑定执行。这可能是问题吗?我已经使用 javascript 编写了一个脚本来从客户端执行此任务。有更好的方法吗?我可以做些什么来解决我的问题?

这是我到目前为止的代码:

<asp:Button runat="server" ID="btnImport" Text="Load Data from File" 
     BackColor="#990000" ForeColor="White" nowrap OnClick="btnImport_Click" 
     style="display:none" OnClientClick="DisplayButtonGenerate()"/>

<asp:Button ID="btnGenerate" runat="server" Text="Generate New Stock Codes" 
    BackColor="#990000" ForeColor="White" OnClick="btnGenerate_Click" 
    style="display:none" />

我有两个网格视图:显示所有错误记录的 ErrorsGrid 和显示正确记录的 InventoryGrid。就像我上面说的,如果 ErrorsGrid 的 rowCount=0,则显示 btnGenerate。

protected void btnImport_Click(object sender, EventArgs e)
{
    InventoryGrid.DataBind();
    ErrorsGrid.DataBind();        
}

protected void btnGenerate_Click(object sender, EventArgs e)
{
    FinalMessage.AppendLine(_InsertWrapper.PostData());
}

这是脚本:

<script language="javascript" type="text/javascript">
    function DisplayButtonGenerate() {
        var rowCount = <%=ErrorsGrid.Rows.Count %>;
        var buttonGen = document.getElementById("<%=btnGenerate.ClientID%>");
        if(rowCount == 0)
        {
            buttonGen.style.display = "block";
        }
    } 
</script>

【问题讨论】:

  • 显示btnGenerate按钮后你想做什么?你想跳过帖子吗?

标签: c# javascript asp.net button gridview


【解决方案1】:

您的 btnImport 设置了服务器端 OnClient 和客户端 OnClientClick。我猜发生的事情是首先调用客户端,显示按钮,然后服务器端启动,页面从服务器刷新,您的按钮再次隐藏。你可以用一种或另一种方式来做,但不能同时做:

服务器端:去掉OnClientClick&style="display:none"&JavaScript,将按钮的Visible属性设置为false,并在服务器端的代码隐藏点击事件中添加:

if(ErrorsGrid.Rows.Count == 0)
    btnImport.Visible = True;

客户端:从 JavaScript 函数返回 false 到 OnClientClick

OnClientClick="return DisplayButtonGenerate()"

function DisplayButtonGenerate() {
  ....
  return false;
} 

【讨论】:

  • 感谢您的帮助!它为我对asp的理解增加了一些知识,我选择使用第一选择。它非常简单,效果很好
  • 不客气。我们都在这个世界上学习。很高兴它有帮助。
【解决方案2】:

如果您想在单击按钮后更新代码中的InventoryGrid,ErrorsGrid 网格控件,则需要将它们保存在UpdatePanel

<asp:UpdatePanel ID="upnl" runat="server" UpdateMode="Conditional">
<contenttemplate>
 InventoryGrid,ErrorsGrid mark up
</contentTemplate>
<Triggers>
 //set async trigger as btnImport 
</Triggers>
</asp:UpdatePanel>

【讨论】:

  • 好的,我已经完成了,它正确显示了按钮,但是我的 gridviews 没有显示它们的数据
  • @user3180965,如果你不返回false,它会执行btnImport_Click事件,这是一个回发。当你做一个完整的回发时,你看不到可见的按钮
  • @user3180965,好的。我想你也想更新 gridview 数据?
  • 最好将InventoryGrid,ErrorsGrid, btnGenerate 保留在更新面板中
  • 是的,它需要为两个网格视图进行数据绑定
【解决方案3】:

让我们将您的问题分解为几个步骤。

  • 你点击btnImport,它首先调用OnClientClick,做客户端处理 然后进行完整的回发,转到服务器端并处理其服务器端处理程序OnClick

  • 处理完OnClick处理程序后,页面再次渲染,btnGenerate display:none中的无条件代码再次运行,再次渲染默认状态。

你看到问题了吗?即使您在 clientClick 中操作某些逻辑,它也会在页面重新加载时重置,因为您的 btnImport 正在这样做。

解决方案:

我可以建议几件事。

  1. 使用 UpdatePanel 防止回发整个页面或
  2. 让您的 btnImport 完全成为客户端按钮,并使用 xhr 或 jQuery 的 ajax 发布帖子。
  3. 在服务器端设置 btnGenerate 的可见性

最简单的是第三个,即从代码中删除 onclientclick 事件并更改您的 btnImport 以执行此操作:

protected void btnImport_Click(object sender, EventArgs e)
{
    InventoryGrid.DataBind();
    ErrorsGrid.DataBind();        
    //set visibility of btnGenerate in Page_Load also;
    btnGenerate.Visible = ErrorsGrid.Rows.Count == 0;
}

并从客户端的 btnGenerate 中删除 display:none

【讨论】:

  • ErrorsGrid.Rows.Any();给出一个编译器错误,说 GridViewCollection 不包含 Any 的定义,如果我删除了脚本并做了你上面提到的事情
  • 你的页面中需要using System.Linq abv,无论如何,我已经修改了我的代码,现在结帐
  • 好吧,我改变了那部分,逻辑有点错误,但我纠正了它,它现在可以工作 if (ErrorsGrid.Rows.Count == 0) btnGenerate.Visible = true;
  • 感谢您的帮助! :)
【解决方案4】:

这里不需要 JS 函数。

只需检查 ErrorsGrid if count != 0 的数据源,如果它不只是在代码隐藏中设置按钮的可见性。

【讨论】:

  • 那将是理想的,但我尝试了,并且声明 btnGenerate.Enable = true/false;无法正确执行。它需要回发才能看到更改
  • 您无法回发吗?
  • 是的,我不能这样做的主要原因是所有数据处理等都是在 InventoryUpload 包装器中完成的,因此我需要访问的列表无法从 btnImport_Click 方法访问跨度>
  • DisplayButtonGenerate() 将仅在没有行 if(rowCount == 0) 时显示按钮。那不应该是if(rowCount &gt; 0) { ... }
  • 否,ErrorsGrid 包含错误记录,因此如果 gridview 没有任何行,则实际上没有错误记录,用户可以继续提交数据...
【解决方案5】:

如果我了解您的要求。正确地,将按钮的 'Visbible' 属性设置为 true 或 false 应该可以工作。即 btnGenerate.Visible=true/false。最初您可以将按钮可见性设置为 false,然后您可以根据记录数在所需的事件处理程序中对其进行修改。

【讨论】:

    猜你喜欢
    • 2015-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-01
    • 2021-03-07
    相关资源
    最近更新 更多