这是我的情景:
我想根据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>
答案 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
中的无条件代码再次运行,并再次呈现默认状态。
btnImport
正在这样做。
<强>解决方案:强>
我可以提出几点建议。
最简单的是第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,然后根据您可以在所需事件处理程序中修改它的记录计数。