2013-02-10 85 views
1

使用中继器显示列表(在每个记录旁边删除btn),单击“删除”,然后从列表中删除。我使用commandArgument传递'id',我想传递另一个值...'公司名'通过文本尝试,但不知道如何传递它...然后在代码后面我使用companyName来获取contractorId,(公司名称为承包商绑定并传递2个值commandArgument和隐藏字段,错误

<td> 
<asp:LinkButton ID="LinkButton1" CommandArgument='<%# Bind ("id") %>' runat="server" OnCommand="RemoveSubContractor" CssClass="bottomhyperlink">Remove</asp:LinkButton> 
<asp:HiddenField id="hdnCompanyName" value='<%#Bind("Company_Name")%>'> 
</td> 

在后面的代码:

HiddenField hdnCompanyName = (HiddenField)e.CommandArgument.ToString("hdnCompanyName); 
string companyName = hdnCompanyName.Value; 

然后问题是由代码来的e.commandArgument后背后我试图做.findControl但它wouldnt让我...任何人知道是什么我失踪了?谢谢

+0

看一看我的编辑,我已经添加了另一种(也许是更好吗?)的方式如何可以做到这一点 – 2013-02-11 12:27:20

回答

3

你可以通过中继器项目循环,获得通过由CommandArgument='<%# Bind ("id") %>'传入的id的项目,并呼吁FindControl()得到的公司名称,这里有一个例子:

ASPX:

<asp:Repeater ID="Repeater1" runat="server"> 
    <ItemTemplate> 
     <asp:Label ID="lblId" runat="server" Text='<%# Eval("ID") %>' /> 
     <asp:HiddenField ID="hdCompanyName" runat="server" Value='<%# Eval("CompanyName") %>' /> 
     <asp:Button ID="btnSave" runat="server" OnCommand="Save" CommandArgument='<%# Eval("ID") %>' Text="Save" /> 
    </ItemTemplate> 
</asp:Repeater> 

后面的代码:

public partial class RepeaterExample : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!Page.IsPostBack) 
     { 
      var employees = new List<Employee>() 
      { 
       new Employee{ Id="1",CompanyName="Company 1"}, 
       new Employee{ Id="2",CompanyName="Company 2"} 
      }; 
      Repeater1.DataSource = employees; 
      Repeater1.DataBind(); 
     } 
    } 

    protected void Save(object sender, CommandEventArgs e) 
    { 
     string id = e.CommandArgument.ToString(); 
     string companyName = string.Empty; 

     foreach (RepeaterItem item in Repeater1.Items) 
     { 
      Label lblId = item.FindControl("lblId") as Label; 
      if (lblId.Text.Equals(id)) 
      { 
       companyName = (item.FindControl("hdCompanyName") as HiddenField).Value; 
       break; 
      } 
     } 
     System.Diagnostics.Debug.WriteLine(companyName); 
    } 
} 

public class Employee 
{ 
    public string Id { get; set; } 
    public string CompanyName { get; set; } 
} 

也许更好的解决方案是通过idcompa纽约名CommandArgument这将避免通过中继器循环创建额外的处理:

ASPX:

<asp:Repeater ID="Repeater1" runat="server"> 
    <ItemTemplate> 
     <asp:Label ID="lblId" runat="server" Text='<%# Eval("ID") %>' /> 
     <asp:HiddenField ID="hdCompanyName" runat="server" Value='<%# Eval("CompanyName") %>' /> 
     <asp:Button ID="btnSave" runat="server" OnCommand="Save" CommandArgument='<%# String.Format("{0},{1}",Eval("ID"),Eval("CompanyName")) %>' Text="Save" /> 
    </ItemTemplate> 
</asp:Repeater> 

后面的代码:

就分割字符串,并有两你的参数!

protected void Save(object sender, CommandEventArgs e) 
{ 
    string [] arguments = e.CommandArgument.ToString().Split(','); 
    string id = arguments[0]; 
    string companyName = arguments[1]; 
} 
+0

感谢您拨冗撰写所有的人的时间...帮助很大 – John 2013-05-28 16:01:27

+0

在3年后这有助于我在按钮的点击事件中找到我的转发器中的文本框的价值......不错的工作! – amoyer 2016-06-03 16:25:04