为什么我的ASP.NET Button控件没有调用指定的函数?

时间:2012-03-21 21:15:08

标签: asp.net html visual-web-developer-2010

我想在我的网站上设置搜索功能。用户在文本框中键入一些信息,然后单击搜索按钮。单击搜索按钮后,将使用文本框中的文本搜索数据库,并将结果显示在表格中。如果文本框中的文本与数据库中的一个结果完全匹配,而不是显示结果列表,则会在页面中填充有关匹配结果的详细信息。

为了更容易精确匹配结果,我想在每个结果旁边添加一个按钮,“选择”该结果,在文本框中填入该结果的文本,然后用详细信息填充页面。这就是我所拥有的。

点击搜索按钮后,在检查结果是否完全匹配后,我创建了一个包含结果和按钮的表:

for(int x=0; x < res_list.Length; x++)
{
     TableRow newRow = new TableRow();
     TableCell textCell = new TableCell();
     TableCell buttonCell = new TableCell();
     buttonCell.ID = "bc" + x;
     Button cellButton = new Button();
     cellButton.ID = "btn" + x;
     textCell.Text = res_list[x];
     textCell.Attributes.Add("Width","60%");
     cellButton.Text = x.ToString();

     // cellButton.OnClientClick = "NameClick"; This property refers to client-side scripts, which I am not using.
     cellButton.Click += new EventHandler(NameClick);

     buttonCell.Controls.Add(cellButton);
     newRow.Cells.Add(firstCell);
     newRow.Cells.Add(buttonCell);
     myTable.Rows.Add(newRow);
}

我已经尝试过OnClientClick方法和上面看到的Click方法,两者都产生了相同的结果。

我的NameClick功能如下:

void NameClick(object sender, EventArgs e)
{
     Button sendButton = (Button)sender;
     int index = Int32.Parse(sendButton.Text);
     SearchTextBox.Text = myTable.Rows[index].Cells[0].Text;
     return;
}

我在NameClick函数的开头设置了一个断点,当我单击其中一个按钮时,它永远不会到达。为什么我的按钮没有调用此函数?

编辑:如果可能,我想在不使用JavaScript的情况下完成此任务。

4 个答案:

答案 0 :(得分:4)

您使用的是cellButton.OnClientClick = "NameClick";,但实际上您的javascript中是否有NameClick个功能?如果没有,单击该按钮将导致JS错误,这可能会阻止回发。

除此之外,建议将明确的ID分配给以编程方式创建的控件。否则,自动生成的ID可能会在回发时更改,这将阻止控制事件触发。

以下内容应该有效(未经测试):

myTable.ID = "someid";
for (int x=0; x < res_list.Length; x++)
{
  TableRow newRow = new TableRow();
  newRow.ID = "r" + x;
  TableCell textCell = new TableCell();
  TableCell buttonCell = new TableCell();
  buttonCell.ID = "bc" + x;
  Button cellButton = new Button();
  cellButton.ID = "btn" + x;
  textCell.Text = res_list[x];
  textCell.Attributes.Add("Width","60%");
  cellButton.Text = x.ToString();

  //cellButton.OnClientClick = "NameClick"; // not needed unless you have actual JS for it
  cellButton.Click += new EventHandler(NameClick);

  buttonCell.Controls.Add(cellButton);
  newRow.Cells.Add(firstCell);
  newRow.Cells.Add(buttonCell);
  myTable.Rows.Add(newRow);
}

答案 1 :(得分:1)

cellButton.OnClientClick应指向客户端功能,即JavaScript。你在某个地方有JS功能吗?

如果答案是否定的,那么我们就找到了您的问题。你应该创建一个。将动态生成的控件的ClientIDMode属性设置为StaticPredictable会很有帮助,因此您的JS函数可以轻松访问它们。

您是否需要JS功能方面的帮助?

答案 2 :(得分:1)

当您单击该按钮时,该页面将再次启动生命周期,您的控件将不再存在于您需要再次创建控件的页面中,或者将其保存在viewstate中或使用控件状态 当他在生命周期中回电时

在页面生命周期事件SaveControlState,loadControlState

如果你想创建一个javascript click事件,你需要确保控件在javascript函数中没有调用服务器端事件,你需要返回false

答案 3 :(得分:-2)

您必须在asp语法中添加此事件以获取按钮。

 <asp:Button runat="server " OnClick="ButtonClick"/>