C# asp:按钮未正确显示

C# asp:按钮未正确显示,c#,javascript,asp.net,button,gridview,C#,Javascript,Asp.net,Button,Gridview,这是我的设想: 我想根据gridview中显示的行数显示一个按钮(btnGenerate)。我让它显示了一秒钟,然后它又消失了。我正在使用我的另一个按钮(btnImport)的onclientclick。我认为导致问题的原因是,在同一个按钮(btnImport)的OnClick事件上,两个gridview对每个数据绑定执行。这可能是问题所在吗?我已经使用javascript编写了一个脚本,从客户端执行此任务。有更好的方法吗?我能做些什么来解决我的问题 以下是我目前掌握的代码: <asp:B

这是我的设想:

我想根据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" />
以下是脚本:

<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>

函数DisplayButtonGenerate(){
var行计数=;
var buttonGen=document.getElementById(“”);
如果(行计数==0)
{
buttonGen.style.display=“块”;
}
} 

这里不需要JS函数


只需检查数据源是否存在错误Grid
if count!=0
并且如果不仅仅是在codebehind中设置按钮的可见性。

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

库存网格,错误网格标记
//将异步触发器设置为btnImport

让我们把你的问题分解成几个步骤

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

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

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

解决方案:

我可以提出几点建议

  • 使用UpdatePanel可防止回发整个页面或
  • 让您的btnImport成为一个客户端按钮,并使用xhr或jQuery的ajax进行发布
  • 在服务器端本身设置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 from client无您的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;
    } 
    

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

    这将是最理想的方法,但我尝试了这一点,并且使用了语句btnGenerate.Enable=true/false;无法正确执行。需要回发才能看到更改,您不能回发吗?是的,我不能这样做的主要原因是所有的数据处理等都在InventoryUpload包装中完成,因此我需要访问的列表无法从btnImport\u Click方法
    DisplayButtonGenerate()访问
    仅当(rowCount==0)中没有行时才会显示按钮。如果(rowCount>0){…},那不应该是
    否,ErrorsGrid包含错误记录,因此如果gridview没有任何行,实际上没有错误记录,用户可以继续提交数据…在显示
    btnGenerate
    按钮后,您想做什么?你想跳回帖子吗?好的,我已经这样做了,它正确地显示了按钮,但是我的GridView没有显示它们的图标data@user3180965,如果不返回false,它将执行
    btnImport\u Click
    事件,这是回发。当你做一个完整的回发时,你看不到被访问的内容button@user3180965好啊我想您也要更新gridview数据?最好在更新面板中保留
    InventoryGrid,ErrorsGrid,btnGenerate
    ,是的,它需要为两个gridview数据绑定ErrorsGrid.Rows.Any();给出一个编译器错误,表示GridViewCollection不包含任何的定义,如果我删除脚本并执行上面提到的操作,您将需要使用System.Linq
    abv在您的页面中,bt无论如何,我已经修改了代码,立即检查好的,我更改了那个部分,逻辑有点错误,但是我纠正了它,如果(ErrorsGrid.Rows.Count==0)btnGenerate.Visible=true,它现在就可以工作了;谢谢你的帮助!:)谢谢你的帮助!它为我对asp的理解增加了一些知识,是我选择使用的第一选择。这很简单,效果也很好。不客气。我们都在这个世界上学习。很高兴这有帮助。
    OnClientClick="return DisplayButtonGenerate()"
    
    function DisplayButtonGenerate() {
      ....
      return false;
    }