单击按钮时,OnClientClick事件不会引发

时间:2015-06-02 22:28:52

标签: javascript c# asp.net gridview onclientclick

我有一个像这样的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页脚行可见,页脚行用于插入新行

编辑: 所以这是我原来的问题:单击按钮时我想让其他列可见,然后在同一个点击事件中显示页脚行。然而,在事件被提升之后,额外的列被显示但不是页脚行,直到我再次单击该按钮。

这是我的Click事件:

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。为什么会这样?

3 个答案:

答案 0 :(得分:0)

您需要取消按钮的默认操作,即回发。

将其更改为此(请注意返回false部分):

<asp:Button ID="Add_Button" runat="server" OnClick="Add_Button_Click" Text="Add New Record" OnClientClick="Cols(); return false;" />

答案 1 :(得分:0)

是什么告诉您OnClientClick事件未被提出? 据我所知,它被引发,但之后,紧接着,您回发到服务器以执行服务器上的OnClick事件。

所以你没有看到正在执行的Cols()函数。

尝试以这种方式结束Cols()功能:

return false; // prevent the OnClick event from being fired

这样,只会触发OnClientClick事件,而不会触发OnClick事件。 显然,在这一点上保持两者是没有意义的。 两个都有意义的唯一情况是像这样的JS函数:

return confirm("Are you sure to execute OnClick?");

如果用户选择“否”,他将停留在页面上,否则回发。

答案 2 :(得分:0)

最简单的选择,一起摆脱客户端并将按钮单击更改为以下内容:

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*/ 
    }
}

这是另一个可能更强大的Servierside选项

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来隐藏页脚和列,而无需在服务器上执行任何操作。