2013-10-10 4 views
2

У меня есть GridView, который заполняется службой, и я добавил ссылку на каждую строку этой сетки, чтобы я мог действовать, когда эта конкретная строка нажата. Я хочу получить некоторые элементы в выбранной строке, но даже если я добавлю событие onSelectedRowChanged, я не получаю это событие для запуска, просто ссылку.Получить значения из GridView

<asp:GridView ID="gvTransactionHistory" runat="server" 
    AutoGenerateColumns="false" 
    onselectedindexchanging="gvTransactionHistory_SelectedIndexChanging"> 
    <Columns> 
     <asp:TemplateField> 
      <ItemTemplate> 
       <asp:Label ID="lblAmount" runat="server" Text='<%# Eval("preAuthAmount") %>'></asp:Label> 
       <asp:LinkButton runat="server" Text="Assign+" OnClick="btnAssign"></asp:LinkButton> 
      </ItemTemplate> 
     </asp:TemplateField> 
    </Columns> 
</asp:GridView> 

Вот мой btnAssign нажмите событие, которое работает отлично ...

protected void btnAssign(object sender, EventArgs e) 
{ 
    Response.Write("Works!"); 
} 

Я добавил это, чтобы увидеть, если я мог бы вызвать это событие, но я на самом деле не меняется индекс так, что мне нужна помощь с пониманием, какое событие я могу связать, что позволит мне нажать кнопку ссылки и получить значения из строки THAT.

protected void gvTransactionHistory_SelectedIndexChanging(object sender, System.Web.UI.WebControls.GridViewSelectEventArgs e) 
{ 
    var amount = gvTransactionHistory.SelectedRow.Cells[3].Text; 
    Response.Write(amount); 
} 

ответ

4

Чтобы использовать обработчик события btnAssign Нажмите, чтобы получить строку, то вам необходимо получить NamingContainer (читай: родителя) кнопки, которая была нажата, как это:

protected void btnAssign(object sender, EventArgs e) 
{ 
    GridViewRow theClickedRow = ((LinkButton)sender).NamingContainer as GridViewRow; 

    // Check to make sure the clicked row could be found before using it 
    if(theClickedRow != null) 
    { 
     // Find the amount label control 
     Label theAmountLabel = theClickedRow.FindControl("lblAmount") as Label; 

     // Again, make sure we actually have something before using it 
     if(theAmountLabel != null) 
     { 
      // Get the actual label's text here 
      string theAmountLabelText = theAmountLabel.Text; 
     } 
    } 
} 
+0

Карл, который дал мне строку, но когда я пытаюсь сделать что-то вроде получения поля, например, var amount = theClickedRow.Cells [0] .Text; Я получаю пустой текст, несмотря на данные. Мне нравится этот подход, но я думаю, что мне что-то не хватает .... – user2146538

+0

@ user2146538 - Используйте 'FindControl()' для доступа к серверному элементу управления, см. Обновленный ответ. –

1

Я знаю, на этот вопрос уже был дан ответ, но я решил, что дам альтернативный вариант.

Вы всегда можете добавить атрибуты в элементы управления сервером и просто потянуть их позже.

Например, я могу добавить preAuthAmount к кнопке ссылки в качестве атрибута с именем «preAuthAmount».

<asp:Label ID="lblAmount" runat="server" Text='<%# Eval("preAuthAmount") %>'></asp:Label> 
<asp:LinkButton runat="server" Text="Assign+" preAuthAmount='<%# Eval("preAuthAmount") %>' itemID='<%# Eval("itemID") %>' OnClick="btnAssign"></asp:LinkButton> 

Тогда просто вытащить атрибут в случае щелчка

protected void btnAssign(object sender, EventArgs e) 
{ 
    string preAuthAmount= ((LinkButton)sender).Attributes["preAuthAmount"]; 
    string itemID= ((LinkButton)sender).Attributes["itemID"]; 
} 

Это намного меньше кода и очень легко читать.

Третий вариант заключается в использовании ключевых полей

В разметке GridView, добавьте все поля, которые вы хотите, чтобы иметь возможность получить доступ к GridView.

<asp:GridView ID="gvTransactionHistory" runat="server" 
    AutoGenerateColumns="false" 
    onselectedindexchanging="gvTransactionHistory_SelectedIndexChanging" 
    DataKeyNames="ID, preAuthAmount, AnyField"> 

Эти ключевых полей можно получить в код с индексом строки

protected void btnAssign(object sender, EventArgs e) 
{ 

    var rowIndex = (((LinkButton)sender).NamingContainer as GridViewRow).RowIndex; 
    var id = gvTransactionHistory.DataKeys[rowIndwx].Values["ID"]; 
    var preAuthAmount = gvTransactionHistory.DataKeys[rowIndwx].Values["preAuthAmount"]; 
} 

Проблема с другим ответом является то, что это немного нестабильна. Метод «findcontrol» ищет только прямых потомков и может не всегда работать.

+0

Javalsu, также хорошее предложение, однако, я хочу получить доступ к нескольким полям в строке. Для удобства я ограничил свой примерный вопрос на один элемент. – user2146538

+0

Нет ограничений на количество атрибутов, которые вы можете добавить. Вы можете добавить столько полей, сколько хотите. – Smeegs

+0

Я также добавил третий вариант. Опция findcontrol работает, но она немного неудобна и может вызвать проблемы. – Smeegs

Смежные вопросы