2012-03-01 108 views
1

ASP.NET GridviewのRowDataBoundイベントで、私はテンプレートフィールドのラベルの値を読み取ろうとしています。私はRowUpdatingイベントでこの値を取得することをお勧めしますが、何らかの理由で私はそれが不可能であることを思い出しているようです。ここでここでASPがある...gridviewテンプレートフィールドの値を取得する方法

<asp:TemplateField HeaderText="Translation" ItemStyle-Width="250" >      
    <ItemTemplate> 
      <asp:Label ID="Label11" runat="server" Text='<%# Bind("lang_String") %>' Width="250px"></asp:Label> 
    </ItemTemplate> 

は私が把握しようとしていますVB.netコードは

Protected Sub GridView1_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GridView1.RowDataBound 

    If (e.Row.RowState And DataControlRowState.Edit) > 0 Then 
     ' The value in the third column postion. 
     Dim needThisValue as string = e.Row.Cells(3).Text 

    End If 
End Sub 

....である任意およびすべてのヘルプをいただければ幸いです。

おかげで、

答えて

3

あなたがRowState=DataControlRowState.Editを選択したので、あなたのラベルがEditItemTemplateであることを考える理由は、私はよく分かりません。

実際にはRowType=DataControlRowType.DataRowを確認する必要があります。これは最初の行のRowTypeがヘッダーであるため必要です。

http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.gridviewrow.rowtype.aspx

Private Sub GridView1_RowDataBound(sender As Object, e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GridView1.RowDataBound 
    If e.Row.RowType = DataControlRowType.DataRow Then 
     ' in the following way you get the row's DataSource: ' 
     Dim row = DirectCast(e.Row.DataItem, DataRowView).Row 
     ' you could also use the DataSource to get the value: ' 
     Dim lang_String = row.Field(Of String)("lang_String") 
     ' and here you get the reference to your Label in the ItemTemplate: ' 
     Dim Label11 = DirectCast(e.Row.FindControl("Label11"), Label) 
     ' at this point Label11.Text is already set to lang_String ' 
    End If 
End Sub 

あなたのEditItemTemplateあなたが(通常はあなたがEditItemTemplate内のTextBoxのような編集可能なコントロールを使用します)あなたのGridViewで、たとえば、aditionally RowStateを確認する必要のコントロールを取得したい場合は、次の

RowDataBound
<ItemTemplate> 
    <asp:Label ID="LblLanguage" runat="server" Text='<%# Bind("lang_String") %>' Width="250px"></asp:Label> 
</ItemTemplate> 
<EditItemTemplate> 
    <asp:TextBox ID="TxtLanguage" runat="server" Text='<%# Bind("lang_String") %>' Width="250px"></asp:TextBox> 
</EditItemTemplate> 

Private Sub GridView1_RowDataBound(sender As Object, e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GridView1.RowDataBound 
    If e.Row.RowType = DataControlRowType.DataRow Then 
     ' in the following way you get the row's DataSource: ' 
     Dim row = DirectCast(e.Row.DataItem, DataRowView).Row 
     ' you could also use the DataSource to get the value: ' 
     Dim lang_String = row.Field(Of String)("lang_String") 

     If e.Row.RowState = DataControlRowState.Normal Then 
      ' and here you get the reference to your Label in the ItemTemplate: ' 
      Dim LblLanguage = DirectCast(e.Row.FindControl("LblLanguage"), Label) 
      ' at this point LblLanguage.Text is already set to lang_String ' 
     ElseIf e.Row.RowState = DataControlRowState.Edit Then 
      ' and here you get the reference to your TextBox in the EditItemTemplate: ' 
      Dim TxtLanguage = DirectCast(e.Row.FindControl("TxtLanguage"), TextBox) 
      ' at this point TxtLanguage.Text is already set to lang_String ' 
     End If 
    End If 
End Sub 

私はコントロールのIDをやや読みやすいものに変更しました。

+0

さて、選択した行が編集モードであることを確認する必要があります。ヘッダー行は決して...他のセクションで動作しますので、変更が必要かどうかを確認する必要があります。スニペットのおかげで、私は今テストします。そうです、これは再帰的ループではありません。編集中の行の値だけが必要です。 – htm11h

+0

これはRowUpdatingイベントで実行できますか? – htm11h

+0

@ marc11h:私の答えを編集しました。 RowUpdatingでは、グリッドの更新行を取得するには 'Dim row = GridView1.Rows(e.RowIndex)'が必要です。次に、 'FindControl'を使って、あなたのconrolへの参照を取得することもできます。 –

関連する問題