Using Aspnet, C# 3.5 in vs2008 :
I have used sucessfully the following code in a gridview or listview templated column:
<asp:Button ID="btnShow" runat="server" Text="?" 
  TabIndex="-1" CommandName="ShowDefinition" 
    CommandArgument='<%# Eval("PKey") %>' />
With code behind to get an identifier for the row in which the button was clicked. :
protected void ListView1_ItemCommand(object sender,  ListViewCommandEventArgs e) 
{
   if (e.CommandName == "ShowDefinition") 
      {
        int showRecordPKey = Convert.ToInt32(e.CommandArgument); 
      }
}
Now I am trying to dynamically (conditionally) put that button in the column.
I tried doing this using a placeholder with the following code behind:
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); 
}
The button is generated but the command argument is not evaluated, the string "(<%# Eval('PKey') %>" is passed as the command argument.
How can I do what I am trying to do?