【问题标题】:When clicking a button, the OnClientClick event does not raise单击按钮时,不会引发 OnClientClick 事件
【发布时间】:2015-06-02 22:28:52
【问题描述】:

我有一个这样的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。为什么会这样?

【问题讨论】:

  • 你试过在服务器端的按钮onclick事件中添加RegisterClientScriptBlock吗?回发会导致 js 函数所做的更改恢复。
  • 服务器端和客户端的列索引完全不同。您确定您尝试显示的列已在客户端浏览器中呈现吗?您可以尝试使用浏览器上的 Developer Tool 或 Inspect Element 进行检查。我在质疑,因为如果您在服务器端将 Column visible 设置为 false,则该列将不会在客户端呈现。因此,您的 javascript 中的列索引可能不是您想要的正确索引。
  • 为什么不做所有服务器端或所有客户端?在这种情况下,将两者分开对我来说似乎没有意义。另请注意,style.visibility = "visible"GridView1.Columns[10].Visible = false; 非常不同(又与 style.display= "none" 不同)
  • 在上面展开:服务器端 GridView1.Columns[10].Visible = false 导致 没有为该元素呈现 HTML,因此客户端脚本无法与之交互。
  • 我想要做的是让一些列和页脚行在按钮单击时可见。如果我在第一个按钮上单击所有服务器端,则在再次单击该按钮之前,列将变为可见,但页脚行不可见。我还没有尝试过所有客户端。

标签: javascript c# asp.net gridview onclientclick


【解决方案1】:

你需要取消按钮的默认动作,即回发。

改成这个(注意return false部分):

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

【讨论】:

    【解决方案2】:

    什么告诉您OnClientClick 事件没有引发? 据我所知,它已引发,但随后,您立即发回服务器以在服务器上执行 OnClick 事件。

    所以您看不到正在执行的 Cols() 函数。

    尝试以这种方式结束Cols()函数:

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

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

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 在我的网格视图中,出于美学原因,额外的列被隐藏了,所以我想要完成的是允许按钮单击以使这些列和页脚行可见,但是当我把它全部在单击事件中,第一次单击时,列可见,但页脚行不可见,直到再次单击按钮。
      • 我提供的代码可以满足您的需求。它为您单击两次的原因是您正在检查页脚的可见性以显示列,并且在您单击按钮之前这不会改变。我已将检查更改为按钮文本。
      • 我使用了你的第二个建议,结果是它设法改变了列的可见性,但没有改变页脚行。
      • 页脚行是没有出现在“添加”上还是没有出现在“取消”上?作为调试测试,让所有内容出现在页面加载并检查页脚是否正在生成。也许将您的 Gridview 标记添加到您的问题中。
      猜你喜欢
      • 2020-02-20
      • 2012-01-19
      • 2016-04-25
      • 2012-09-12
      • 2019-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多