【问题标题】:dynamic linkbutton not calling command when clicked单击时动态链接按钮不调用命令
【发布时间】:2015-02-06 00:44:20
【问题描述】:

动态控件的新手,但直到现在我一直在成功地创建它们 我的 gridview 中的模板字段,最近从超链接切换到链接按钮 并且不得不进行一些更改但仍然无法正常工作

在我的页面中,我有以下代码(删节为突出部分)

protected void Page_Load(object sender, EventArgs e)
{
    if (!this.IsPostBack)
    {
        ...
        ...
        TemplateField tf = new TemplateField();
        tf.HeaderText = "Action";
        tf.ItemTemplate = new AssignPage.MyTemplate(..., mylb);
        GridView1.Columns.Add(tf);


protected void Page_PreInit(object sender, EventArgs e)
{
    LinkButton lb = new LinkButton();
    lb.Text = "AssignAll";
    lb.Command += new CommandEventHandler(AssignAll_Click);
    lb.CommandName = "XXX";
    this.mylb = lb;




protected void AssignAll_Click(object sender, CommandEventArgs e)   
{
    string[] arg = new string[2]; // BREAK POINT HERE
    arg = e.CommandArgument.ToString().Split(';');
    ...
    ...
    Response.Redirect("BaseAndRepeats.aspx?id=" + r.Event.ID);

在我拥有的模板类中

    LinkButton lb;

    public MyTemplate(..., LinkButton _lb)
    {
        ...
        lb = _lb;
        ...



    public void InstantiateIn(System.Web.UI.Control container)
    {
            ...
            ...
            // various conditional statements

            lb.CommandArgument = mylist[rowCount].ReqtID.ToString() + ";" + mylist[rowCount].RotaUser;
            container.Controls.Add(lb);
            ...

永远不会到达处理程序中的断点

我以为我在正确的位置创建了链接按钮 链接按钮非常愉快地出现在网格中 当我点击链接按钮时,有一个电话 到 Page_PreInit 和到 Page_Load,正如我所料 这是回发。 但是永远不会调用 AssignAll_Click。

在浏览器页脚中,当您将鼠标悬停时,它会显示“javascript: __dooPsotabck(...” 通过按钮链接

【问题讨论】:

    标签: c# asp.net asplinkbutton


    【解决方案1】:

    我认为问题出在这一行:

    lb.Command += new CommandEventHandler(AssignAll_Click);
    

    改成:

    lb.Command += AssignAll_Click;
    

    编辑: 您还想将它从Page_PreInit 移动到Page_Init,但您可能会在Page_LoadIsPostBack 之外)找到更多成功。这是一个适合我的示例:

    在 ASPX 页面上:

    <asp:Panel ID="TestPanel" runat="server" />
    

    代码隐藏:

    protected void Page_Init(object sender, EventArgs e)
    {
        //Init used because TestPanel doesn't exist yet
        CreateTestButton();
    }
    
    private void CreateTestButton()
    {
        var lb = new LinkButton();
        lb.Text = "hello";
        lb.Command += lb_Command;
        TestPanel.Controls.Add(lb);
    }
    
    void lb_Command(object sender, CommandEventArgs e)
    {
        throw new NotImplementedException();
    }
    

    查看您的代码,看起来您在 GridView 中添加了另一列,并在该列中为每一行创建了一个按钮 - 但您已经在 Page_Load 上添加了列,并且按钮正在创建并绑定到它之前在Page_PreInit

    【讨论】:

    • 似乎没有用。我还读到应该将控件添加到页面中,但我不知道该怎么做,而且我从未使用其他控件这样做。
    • 所以,我还没有最终确定这是一个答案,但我已经在回发时进行了“创建模板字段,将链接按钮传递到其模板并将模板字段添加到网格” .我没有发生这种情况,因为我立即重定向,并且我认为控件实际上不需要回到模板字段和网格中才能调用事件,我认为这只需要渲染。
    • 编辑了我的回复。是的,需要在 PostBack 上创建控件,否则它们会停止存在并且它们的事件不会被触发。
    • 现在变得更加混乱了。我读到我必须在 Page_PreInit 中创建动态控件。但是我在模板 InstantiateIn 中创建它们,因为这是我唯一知道我实际需要多少控件,它们的属性应该设置为的地方!
    • 这取决于你在做什么,像按钮这样的小东西可以在 Page_Load 中(重新)创建,如果它是现有控件的子控件,但如果你想动态设置母版页,例如你需要在 PreInit 中做到这一点
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-04
    • 1970-01-01
    • 2015-09-05
    • 1970-01-01
    • 2012-04-10
    • 2016-02-18
    相关资源
    最近更新 更多