在ASP.NET中的数据列表?ItemCommand事件没有触发?

5

在我的Web应用程序中,我有一个数据列表,其中我绑定了一些图像。在数据列表项命令事件中,我编写了一些代码,但是并没有触发该事件。请问你能帮我吗?

源代码如下:

DataList控件:

<asp:DataList ID="DLQuickVideos" runat="server"  RepeatColumns ="2" CellPadding="0" CellSpacing="0" OnItemCommand="DLQuickVideos_ItemCommand" >                       
     <ItemTemplate>                                        
         <asp:ImageButton ID="imgbtn" runat="server" ImageUrl='<%# "../Trailorvideos/"+ Eval("SnapShot") %>' CommandArgument='<%# Eval("video")+"|"+Eval("videoid") %>' CausesValidation="false"  Width="111px" Height="83px" BorderStyle="double" BorderWidth="4px" BorderColor="#A70202" />                                                                    
     </ItemTemplate>
</asp:DataList> 

事件处理程序:

protected void DLQuickVideos_ItemCommand(object source, DataListCommandEventArgs e)
{        
    try
    {
        string eval = e.CommandArgument.ToString();
        int k = eval.IndexOf("|");
        videoname = eval.Substring(0, k);
        videoid = eval.Substring(k + 1);
        string move = Request.QueryString["movie"].ToString();

        if (Request.Browser.Browser == "IE")
        {
            dvplayer.InnerHtml = "<object id='player' classid='clsid:D27CDB6E-AE6D-11cf-96B8-444553540000' name='player' width='500' height='350'>      <param name='movie' value='player-viral.swf' />     <param name='allowfullscreen' value='true' />       <param name='allowscriptaccess' value='always' />       <param name='flashvars' value='file=~/User/Trailorvideos/" + videoname + "&autostart=true' />   <p><a href='http://get.adobe.com/flashplayer'>Get Flash</a> to see this player.</p>         </object>";
        }
        else
        {
            dvplayer.InnerHtml = "<object type='application/x-shockwave-flash' data='player-viral.swf' width='500' height='350'> <param name='movie' value='player-viral.swf' /> <param name='allowfullscreen' value='true' /> <param name='allowscriptaccess' value='always' /> <param name='flashvars' value='file=~/User/Trailorvideos/" + videoname + "&autostart=true' /> <p><a href='http://get.adobe.com/flashplayer'>Get Flash</a> to see this player.</p> </object>";
        }
        GetQuickList(videoid);
    }
    catch (Exception ex)
    {

    }
}

以上代码是C#代码。

1
你是否将事件处理程序绑定到控件?你能否发布相关代码(包括代码后台和aspx/ascx)? - Oded
<asp:DataList ID="DLQuickVideos" runat="server" RepeatColumns="2" CellPadding="0" CellSpacing="0" OnItemCommand="DLQuickVideos_ItemCommand"> <ItemTemplate> <asp:ImageButton ID="imgbtn" runat="server" ImageUrl='<%# "../Trailorvideos/" + Eval("SnapShot") %>' CommandArgument='<%# Eval("video")+"|"+Eval("videoid") %>' /> </ItemTemplate> </asp:DataList> - Surya sasidhar
我将这个数据列表放在一个包含在 div 中的表格中。 - Surya sasidhar
5个回答

7
您发布了这是您的页面加载事件:

您发布了这是您的页面加载事件:

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!IsPostBack) //this IF statement is what prevents re-binding on PostBack 
    { 
        GetQuickList(videoid, moviename); 
    } 
    else 
    { 
        GetQuickList(videoid, moviename) 
    } 
}

这样做不起作用。您不能在回发时进行数据绑定。否则,任何未处理的事件处理程序请求都将被取消。

您必须删除此if语句的else部分。


当IsPostback为true时,我们不绑定(bind)。否则事件将不会被触发。 - Surya sasidhar
我的意思是,当我们在IsPostBack为true时绑定数据,那么事件就不会被触发,我说得对吗,Philip Smith先生? - Surya sasidhar

5

你是在何时绑定DataList的?如果在PageLoad中绑定了DataList但没有处理PostBack,则所有附加的事件处理程序都将丢失,因为DataList被重新绑定。在这种情况下,ItemCommand事件将永远不会被触发。

请确保您的Page_Load方法结构如下:

protected void Page_Load(object sender, EventArgs e)
{
   if (!IsPostBack)  //this IF statement is what prevents re-binding on PostBack
   {
      //Bind DataList
   }
}

以上代码将确保DataList在PostBack时不会重新创建。

请查看这篇MSDN文章,了解Page.IsPostBack属性的相关内容。


protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) //该IF语句可以防止Postback时重新绑定 { GetQuickList(videoid, moviename); } else { GetQuickList(videoid, moviename) } } - Surya sasidhar
你能否在DLQuickVideos_ItemCommand中设置断点? - NakedBrunch

1

这个有效:

标记:

<asp:DataList ID="DLQuickVideos" runat="server"  RepeatColumns ="2" CellPadding="0" CellSpacing="0" OnItemCommand="DLQuickVideos_ItemCommand" >                       
     <ItemTemplate>                                        
         <asp:ImageButton ID="imgbtn" runat="server" ImageUrl='xx' CommandArgument='<%# "test" + "|" + Eval("Test") %>' CausesValidation="false"  Width="111px" Height="83px" BorderStyle="double" BorderWidth="4px" BorderColor="#A70202" />                                                                    
     </ItemTemplate>
</asp:DataList>

代码后台:

protected void Page_Load(object sender, EventArgs e)
        {


            {
                if (!IsPostBack)  //this IF statement is what prevents re-binding on PostBack
                {
                    System.Data.DataTable dt = new System.Data.DataTable();
                    dt.Columns.Add(new System.Data.DataColumn("test", typeof(int)));

                    System.Data.DataRow r = dt.NewRow();
                    r["test"] = 1;
                    dt.Rows.Add(r);

                    r = dt.NewRow();
                    r["test"] = 2;
                    dt.Rows.Add(r);

                    this.DLQuickVideos.DataSource = dt;
                    this.DLQuickVideos.DataBind();
                }
            }


        }

        protected void DLQuickVideos_ItemCommand(object source, DataListCommandEventArgs e)
        {

            try
            {

            }
            catch (Exception ex)
            {

            }
        }

但我不明白的是,你在DLQuickVideos_ItemCommand中调用了GetQuickList。这是为什么?但是你最初在哪里填充DataList?


是的,在页面加载时,我正在调用 GetQuickList(videoid, moviename)。 - Surya sasidhar
protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) //这个IF语句可以防止在PostBack时重新绑定 { GetQuickList(videoid, moviename); } else { GetQuickList(videoid, moviename); } } - Surya sasidhar
请从您的DLQuickVideos_ItemCommand中移除GetQuickList(videoid)! - Jeroen
你能否将DataList在浏览器中呈现的HTML粘贴过来吗? - Jeroen
这段代码......<table id="DLQuickVideos" cellspacing="0" cellpadding="0" border="0" style="border-collapse:collapse;"><tr><td><input type="image" name="DLQuickVideos$ctl00$imgbtn" id="DLQuickVideos_ctl00_imgbtn" src="../Trailorvideos/dasava04.flv.jpg" style="border-color:#A70202;border-width:4px;border-style:Double;height:83px;width:111px;" />
</td><td> <input type="image" name="DLQuickVideos$ctl01$imgbtn" id="DLQuickVideos_ctl01_imgbtn" src="../Trailorvideos/dasava06.flv.jpg" style="border-color:#A70202;border-width:4px;border-style:Double;height:83px;width:111px;"/>
- Surya sasidhar

1

将命令名称添加到按钮。我认为这就是原因。

希望能对你有所帮助。


呀,我刚刚尝试了那个,但它没有进入该项命令事件。我写了 response.write("hai"),但它没有显示那个消息,Brain先生。 - Surya sasidhar
暂时,尝试使用一个按钮,并将UseSubmitBehavior设置为“false”。 - Brian Mains

1

我猜测你在回发时没有绑定DataList。如果控件没有数据绑定,事件是不会触发的。你能否发布一下你进行数据绑定的代码,也许是在Page_Load中?


这是我的绑定代码 protected void GetQuickList(string vidid) { string squery123 = "select * from Trailor_videos where movie='"+movie+"' and Trailor_videos.videoid!=" + vidid;
da = new SqlDataAdapter(squery123, con); ds = new DataSet(); da.Fill(ds, "temp"); DLQuickVideos.DataSource = ds.Tables["temp"]; DLQuickVideos.DataBind();}
- Surya sasidhar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接