简体   繁体   English

动态Linkbutton的onclick不触发

[英]Onclick of dynamic Linkbutton not firing

I've got a calendar control where I click on a day to give me a javascript popup to add a training class. 我有一个日历控件,我可以在其中单击一天来给我一个JavaScript弹出窗口以添加培训课程。 On each day there might be multiple training classes. 每天可能会有多个培训课程。 To add the classes is no problem. 添加类没有问题。 Then on another page I've got this exact calendar control, but with the training classes populated in each respective day with dynamic linkbuttons. 然后在另一页上,我得到了确切的日历控件,但是在每一天中都有动态链接按钮填充培训课程。 On the click of the linkbutton I want to retrieve the ID of that training class which will be used to populate labels and use this ID as a reference when the manager request training for his/her employees (when inserting into sql). 单击链接按钮后,我想检索该培训课程的ID,该ID将用于填充标签,并在经理要求为其雇员进行培训时(插入sql时)将此ID作为参考。

I have tried adding an EventHandler, but this is not firing. 我尝试添加一个EventHandler,但这没有触发。 I have tried using an Click attribute to this linkbutton (but cannot call a method from an attribute)... I'm not sure if I have missed something that the eventhandler is not firing, could anybody please help me on this? 我尝试将Click属性用于此linkbutton(但无法从属性调用方法)...我不确定是否错过了事件处理程序未触发的内容,有人可以帮我吗?

This is what I have done: DayRendering of calendar control: 这就是我所做的:日历控件的DayRendering:

    protected void calSchedule_DayRender(object sender, DayRenderEventArgs e)
    {
        bool result = false;

        string filterstring = "SELECT tos.[ID], sc.ServiceCenter, tos.Description " +
                              "FROM [SOS].[dbo].[TrainingOfficerSchedule] tos " +
                              "INNER JOIN [dbo].[TrainingOfficerServiceCenters] sc " +
                              "on tos.ServiceCenterRef = sc.ID " +
                              "WHERE TrainingDate = @TrainingDate";

        cn = new SqlConnection(GetConnectionString());
        SqlCommand myCmd = new SqlCommand(filterstring, cn);
        myCmd.Parameters.AddWithValue("@TrainingDate", e.Day.Date.ToShortDateString());

        cn.Open();
        SqlDataReader myReader = myCmd.ExecuteReader();

        if (myReader.HasRows)
        {
            while (myReader.Read())
            {
                string training = myReader["ServiceCenter"].ToString() + " - " + myReader["Description"].ToString();

                LinkButton lnk = new LinkButton();
                lnk.ID = myReader["ID"].ToString();
                lnk.ForeColor = Color.FromArgb(64, 64, 64);
                lnk.BackColor = Color.FromArgb(192, 192, 192);

                lnk.Attributes.Add("onclick", "return getItems();");
                lnk.Click += new EventHandler(lnk_Click);
                  //lnk.Attributes.Add("onClick", "return getItems();");
                  //lnk.Attributes.Add("OnClientClick", "return getItems();");
                  //lnk.Attributes.Add("onclick", jsMethod(Convert.ToInt32(myReader["ID"])));
                  //lnk.Click += new EventHandler(this.lnk_Click);
                  //lnk.Atributes.Add("runat", "server");
                  //lnk.Attributes.Add("onclick", jsMethod(myReader["ID"].ToString()));
                lnk.Text = training + "<br/><br/>";
                lnk.Style.Add("cursor", "pointer");
                e.Cell.Controls.Add(lnk);
            }
        }
        cn.Close();
    } 

Event Handler to fire when clicking on Linkbutton: 单击链接按钮时将触发事件处理程序:

    public void lnk_Click(object sender, EventArgs e)
    {
        string ctrlId = ((Control)sender).ID;
        txtMManagerName.Text = ctrlId;
        this.Page.ClientScript.RegisterStartupScript(this.GetType(), "popSchedular", "showSchedular();", true);
    }

Is there maybe something I am doing wrong? 也许我做错了什么?

Put down PlaceHolder where you want to display link button and then try. 将PlaceHolder放到要显示链接按钮的位置,然后尝试。

<asp:PlaceHolder ID="ph" runat="server" />


LinkButton lnk = new LinkButton();
            lnk.ID = myReader["ID"].ToString();
            lnk.ForeColor = Color.FromArgb(64, 64, 64);
            lnk.BackColor = Color.FromArgb(192, 192, 192);
            lnk.Attributes.Add("onclick", "return getItems();");
            lnk.Click += new EventHandler(lnk_Click);
            lnk.Text = training + "<br/><br/>";
            lnk.Style.Add("cursor", "pointer");
            ph.Controls.Add(lnk);

protected void lnk_Click(object sender, EventArgs e)
{
    string ctrlId = ((Control)sender).ID;
    txtMManagerName.Text = ctrlId;
    this.Page.ClientScript.RegisterStartupScript(this.GetType(), "popSchedular", "showSchedular();", true);
}

I've had this before with dynamic controls. 我以前曾通过动态控件实现过此功能。 Creating multiple items with the same object reference seems to mess things up. 使用相同的对象引用创建多个项目似乎使事情变得混乱。 Try creating a class that inherits from LinkButton and use that in your read loop. 尝试创建一个从LinkBut​​ton继承的类,并在您的读取循环中使用它。

public class myButton : LinkButton
{
    public myButton(SqlCommand sqlCmd)
    {
        var myReader = (SqlDataReader) sqlCmd.ExecuteReader();
        var training = myReader["ServiceCenter"].ToString() + " - " + myReader["Description"].ToString();
        ID =myReader["ID"].ToString();
        ForeColor = Color.FromArgb(64, 64, 64);
        BackColor = Color.FromArgb(192, 192, 192);

        Attributes.Add("onclick", "return getItems();");
        Click += new EventHandler(lnk_Click);
        Text = training + "<br/><br/>";
        Style.Add("cursor", "pointer");
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM