4

同様の質問を見たことがありますが、この問題を解決するのに役立つ回答はありませんでした。次のように、ReadOnly フィールドを持つ GridView があります。

グリッドビュー:

<asp:GridView ID="GridView1" runat="server" AllowPaging="True" 
              AutoGenerateColumns="False" DataKeyNames="projectID" 
              DataSourceID="SqlDataSource1" 
              EmptyDataText="There are no data records to display." 
              PageSize="5" OnRowUpdating="GridView1_RowUpdating">
  <Columns>
    <asp:CommandField ShowDeleteButton="True" ShowEditButton="True"/>
    <asp:BoundField DataField="prID" HeaderText="prID" SortExpression="prID"/>
    <asp:BoundField DataField="projectName" HeaderText="projectName" 
                    SortExpression="projectName" />
    <asp:BoundField DataField="projectType" HeaderText="projectType" 
                    SortExpression="projectType" />
  </Columns>
  <EditRowStyle CssClass="GridViewEditRow"/>
</asp:GridView>

ご覧のとおり、 prIDBoundField にはReadonly=True属性があります。prIDユーザーが行の他のフィールドを更新しているときに、分離コードの値を取得しようとしています。

コード ビハインド:

protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
{

    GridViewRow row = GridView1.Rows[e.RowIndex];

    String d1 = ((TextBox)(row.Cells[2].Controls[0])).Text;
    String d2 = ((TextBox)(row.Cells[3].Controls[0])).Text;

    // this only works while the field is not readonly      
    string prIDUpdate = ((TextBox)(row.Cells[1].Controls[0])).Text; 

}

注:コードビハインドでのみ BoundFieldを使用GridView1.DataKeys[e.RowIndex]および設定してみましたが、結果を取得できませんでしたonRowDataBound

前もって感謝します!

4

1 に答える 1

16

GridView コントロールの DataKeyNames 設定が次のようになっていることがわかりました

DataKeyNames="projectID"

それでは、あなたのキー名はprID ではなくprojectIDだと思いますね。その場合、選択した行のデータを次の行として取得できます。

string id = GridView1.DataKeys[e.RowIndex]["projectID"].ToString();

また、次の列も追加する必要があります。

<asp:BoundField DataField="projectID" HeaderText="prID" SortExpression="projectID"/>

あなたはそれを試しましたか?

別の方法として、代わりに TemplateField を使用することもできます

<Columns>
            <asp:TemplateField HeaderText="prID" SortExpression="prID">
                <ItemTemplate>
                    <asp:Label ID="lblPrId" runat="server" Text='<%# Bind("prID") %>'></asp:Label>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:BoundField DataField="projectName" HeaderText="projectName" 
                    SortExpression="projectName" />
            <asp:BoundField DataField="projectType" HeaderText="projectType" 
                    SortExpression="projectType" />
  </Columns>

このコードは、GridView1_RowUpdating イベント ハンドラーの prID 列からデータを取得します。

Label lblPrId = row.FindControl("lblPrId") as Label;    
string prId = lblPrId .Text;

これが役に立たない場合は申し訳ありません。

于 2013-11-08T12:11:20.113 に答える