如何致电' onchange'调用其代码隐藏函数后的asp.net listbox事件

时间:2016-09-07 11:44:49

标签: javascript asp.net

我将Listbox定义为:

<asp:ListBox ID="lst_Agenda" onchange="drawChart()" OnSelectedIndexChanged="lst_Agenda_SelectedIndexChanged" SelectionMode="Multiple" CssClass="txt12 myListBox" AutoPostBack="true" DataTextField="Name" runat="server" Width="100%" Height="100%" />

在我们选择了一些项目之后,会调用 lst_Agenda_SelectedIndexChanged 代码隐藏方法,该方法调用其他一些ListBoxes以级联方式填充。 Javascript中有一个名为 drawChart 的函数,它根据在所有这些ListBox中选择的值生成图表。

因此我希望在列表框上的javascript函数调用更改事件之前调用codebehind函数。但目前恰好相反,Javascript函数drawChart首先被调用而不填充列表框中的值。

我尝试使用以下代码直接从codebehind方法调用Javascript函数:

ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "myscript", "drawChart()", true);

但是使用它会为任何&#39; document.getElementById&#39;提供空值。调用

Codebehind Function和JS调用如下:

protected void lst_Agenda_SelectedIndexChanged(object sender, EventArgs e)
{
    lst_Agenda_Changed();

    foreach (ListItem li in lst_SubAgenda.Items)
        li.Selected = true;

    foreach (ListItem li in lst_Doctors.Items)
        li.Selected = true;

    lst_SubAgenda_Changed();

    lst_Group_Changed();

    //ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "myscript", "drawChart()", true);
}

drawChart的Javascript如下:

function drawChart() {
        var tempDateToWeek = "";
        var tempDateToYear = "";
        var DateOfWeek = new Date();

        tempDateToWeek = document.getElementById('txtRangeTo').value.substring(0, 2);
        tempDateToYear = document.getElementById('txtRangeTo').value.substring(6, 10);
        ...........

我在drawChart中遇到错误,如果我从codebehind那里调用它,那里我用document.getElementById(&#39; txtRangeTo&#39;)填充变量tempDateToWeek。

那我怎么能实现这个目标呢?

3 个答案:

答案 0 :(得分:0)

为什么不尝试删除onchange =&#34; drawChart()&#34;来自asp Control。

答案 1 :(得分:0)

希望这会对你有所帮助。

 //your code here
 string script = "window.onload = function() { drawChart(); };";
 ScriptManager.RegisterClientScriptBlock(this, this.Page.GetType(), "drawChart", script,true);

并且

 tempDateToWeek = document.getElementById("<%=txtRangeTo.ClientID %>").value.substring(0, 2);

答案 2 :(得分:0)

您应该在代码隐藏中的事件处理程序中调用RegisterStartupScript而不是RegisterClientScriptBlock。一旦页面在回发后加载,它将导致Javascript代码被执行,因此可以使用document.getElementById访问DOM元素。

protected void lst_Agenda_SelectedIndexChanged(object sender, EventArgs e)
{
    lst_Agenda_Changed();

    foreach (ListItem li in lst_SubAgenda.Items)
        li.Selected = true;

    foreach (ListItem li in lst_Doctors.Items)
        li.Selected = true;

    lst_SubAgenda_Changed();
    lst_Group_Changed();

    ScriptManager.RegisterStartupScript(this, GetType(), "DrawChart", "drawChart();", true);
}

还应该从DropDownList中删除onchange事件处理程序,以避免在回发之前调用客户端代码。