asp:按钮无法正确显示

时间:2014-03-06 09:57:04

标签: c# javascript asp.net button gridview

这是我的情景:

我想根据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>

5 个答案:

答案 0 :(得分:1)

如果要在单击按钮后更新代码中的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>

答案 1 :(得分:1)

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

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

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

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

<强>解决方案:

我可以提出几点建议。

  1. 使用UpdatePanel阻止整个页面的回发或
  2. 让你的btnImport完全成为客户端按钮,并使用xhr或jQuery的ajax发布帖子。
  3. 在服务器端设置btnGenerate的可见性
  4. 最简单的是第3个,即从代码中删除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

答案 2 :(得分:1)

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

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

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

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

OnClientClick="return DisplayButtonGenerate()"

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

答案 3 :(得分:0)

这里不需要JS功能。

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

答案 4 :(得分:0)

如果我了解你的要求。正确地说,将按钮的“可见”属性设置为true或false应该有效。即btnGenerate.Visible = true / false。最初,您可以将按钮可见性设置为false,然后根据您可以在所需事件处理程序中修改它的记录计数。