当单击按钮时,OnClientClick事件不会引发
本文关键字:事件 OnClientClick 单击 按钮 | 更新日期: 2023-09-27 17:53:09
我有一个js函数,像这样:
<script type="text/javascript">
function Cols() {
rows = document.getElementById("GridView1").rows;
for (i = 0; i < rows.length; i++) {
rows[i].cells[8].style.visibility = "visible";
rows[i].cells[9].style.visibility = "visible";
rows[i].cells[10].style.visibility = "visible";
rows[i].cells[11].style.visibility = "visible";
rows[i].cells[12].style.visibility = "visible";
rows[i].cells[13].style.visibility = "visible";
rows[i].cells[14].style.visibility = "visible";
}
}
</script>
这个按钮有一个OnClientClick事件:
<asp:Button ID="Add_Button" runat="server" OnClick="Add_Button_Click" Text="Add New Record" OnClientClick="Cols()" />
我的函数中的单元格是指我想要在客户端可见的Gridview列,然后去服务器端我的OnClick事件,这使得我的Gridview页脚行可见,页脚行用于插入新行。
编辑:所以这是我最初的问题:当单击按钮时,我想使其他列可见,然后在同一单击事件中使页脚行可见。然而,在事件引发后,额外的列是可见的,但不是页脚行,直到我第二次单击按钮。
点击事件:
protected void Add_Button_Click(object sender, EventArgs e)
{
if (GridView1.FooterRow.Visible == false)
{
GridView1.FooterRow.Visible = true;
Add_Button.Text = "Cancel";
Panel2.Visible = false;
}
else
{
GridView1.FooterRow.Visible = false;
Add_Button.Text = "Add New Record";
GridView1.Columns[10].Visible = false;
GridView1.Columns[11].Visible = false;
GridView1.Columns[12].Visible = false;
GridView1.Columns[13].Visible = false;
GridView1.Columns[14].Visible = false;
GridView1.Columns[15].Visible = false;
GridView1.Columns[16].Visible = false;
}
}
然而,当我点击按钮时,我的OnClick事件被引发,而不是OnClientClick。为什么会发生这种情况?
您需要取消按钮的默认操作,即回发。
改成这样(注意返回false部分):
<asp:Button ID="Add_Button" runat="server" OnClick="Add_Button_Click" Text="Add New Record" OnClientClick="Cols(); return false;" />
什么告诉您OnClientClick
事件没有引发?据我所知,它被触发了,但是,在此之后,您立即发回服务器以在服务器上执行OnClick
事件。
所以你看不到Cols()
函数正在执行
尝试这样结束Cols()
函数:
return false; // prevent the OnClick event from being fired
这样,只触发OnClientClick
事件而不触发OnClick
事件。显然,在这一点上保留两者是没有意义的。两者都有意义的唯一情况是这样的JS函数:
return confirm("Are you sure to execute OnClick?");
如果用户选择"NO",他将留在页面上,否则会发生回发。
最简单的选择,将客户端全部去掉,并将您的按钮单击更改为以下内容:
protected void Add_Button_Click(object sender, EventArgs e)
{
if (Add_Button.Text != "Cancel") //Add Record
{
GridView1.FooterRow.Visible = true;
Add_Button.Text = "Cancel";
Panel2.Visible = false;
}
else //Cancel
{
GridView1.FooterRow.Visible = false;
Add_Button.Text = "Add New Record";
GridView1.Columns[10].Visible = false;
GridView1.Columns[11].Visible = false;
/*etc*/
}
}
这里是另一个可能更健壮的服务端选项
protected void Add_Button_Click(object sender, EventArgs e)
{
bool visibility = false;
string buttonText = string.empty;
if (Add_Button.Text != "Cancel") //Add Record
{
visibility = true;
buttonText = "Cancel";
Panel2.Visible = false;
}
else //Cancel
{
visibility = false;
buttonText = "Add New Record";
}
Add_Button.Text = buttonText;
ridView1.FooterRow.Visible = visibility;
GridView1.Columns[10].Visible = visibility;
GridView1.Columns[11].Visible = visibility;
/*etc*/
}
如果客户端发生了一些事情,然后马上回复,你真的得不到任何东西。
您的另一个选择是在客户端完成所有操作。我对你的Grdiveiw
了解不够,无法给出一个定制的答案,但以下是你需要做的基本事情:
- 当网格生成时,为你想要隐藏的列单元格添加一个CSS类,并在页脚行添加
display:none
- 使用javascript删除类来显示隐藏的元素,并更改按钮的文本。
如果你的网格有固定数量的列,你甚至可以变得棘手,只需使用聪明的CSS来隐藏页脚和列,而无需在服务器端做任何事情。