2013-02-10 1 views
1

С помощью ретранслятора для отображения списка (с 'remove' btn рядом с каждой записью) нажмите «удалить», и он удаляется из списка. Im передавая «id» с помощью commandArgument, я хочу передать другое значение ... «название компании» пробовал это через текст, но не уверен, как передать его ... затем в коде, за которым я использую companyName, чтобы получить contractorId, (название компании для подрядчикаbind и pass 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

Посмотрите на мое редактирование, я добавил альтернативу (возможно, лучше?) Способ, как это можно сделать –

ответ

3

Вы можете прокручивать элементы ретранслятора , Получить элемент с идентификатором, прошедшего через по CommandArgument='<%# Bind ("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; } 
} 

Возможно, даже лучшим решением было бы пройти как id, так и compa имя пу к 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

+0

3 года спустя и это помогло мне найти значение текстового поля внутри моего ретранслятора в событии нажатия кнопки ... хорошая работа! – amoyer