在网格视图或列表视图中设置动态创建的按钮CommandArgument

时间:2009-09-11 17:55:26

标签: c# asp.net listview gridview

在vs2008中使用Aspnet,C#3.5:

我在gridview或listview模板化列中成功使用了以下代码:

<asp:Button ID="btnShow" runat="server" Text="?" 
  TabIndex="-1" CommandName="ShowDefinition" 
    CommandArgument='<%# Eval("PKey") %>' /> 

使用代码来获取单击按钮的行的标识符。 :

protected void ListView1_ItemCommand(object sender,  ListViewCommandEventArgs e) 
{
   if (e.CommandName == "ShowDefinition") 
      {
        int showRecordPKey = Convert.ToInt32(e.CommandArgument); 
      }
}

现在我正试图动态地(有条件地)将该按钮放在列中。

我尝试使用带有以下代码的占位符来执行此操作:

public class BtnShow 
{
  public Button btnShow = new Button(); 
  PlaceHolder ph = new PlaceHolder(); 
  public BtnShow(string commandName,string displayText, PlaceHolder ph) 
    {
      btnShow.ID =   "btnShow"; 
      btnShow.Text = "?";  
      btnShow.TabIndex = -1 ;
      btnShow.CommandName = "ShowDefinition"; 
      btnShow.CommandArgument =  "(<%# Eval('PKey') %>" ; 
      this.ph = ph; 
    }
public void AddQuMarkToPlaceholder() 
{
   ph.Controls.Add(btnShow); 
}

生成按钮但不评估命令参数,即字符串 “(&lt;%#Eval('PKey')%&gt;”作为命令参数传递。

我怎样才能做我想做的事?

1 个答案:

答案 0 :(得分:1)

使用RowCommand而不是ItemCommand,这有效:

protected void ListView1_RowCommand(object sender, GridViewCommandEventArgs e)
  {
      GridViewRow row = (GridViewRow) 
               ((( Button) e.CommandSource ).NamingContainer);
      Label pk = (Label) row.FindControl("lblPKey");
      int showRecordPKey = Convert.ToInt32(pk.Text); 
  }