0

私はこのようなグリッドビューを持っています:

 <asp:GridView ID="wbsdataGV1" runat="server" Width="790px" AutoGenerateColumns="False"
                                    OnSelectedIndexChanged="wbsdataGV1_SelectionChanged">
                                    <Columns>

                                        <asp:TemplateField HeaderText="WBS Code">
                                            <ItemTemplate>
                                                <asp:LinkButton ID="LinkButton1" runat="server" Text='<%# Eval("WBSCode") %>'></asp:LinkButton>
                                            </ItemTemplate>
                                        </asp:TemplateField>
                                        <asp:TemplateField HeaderText="Description">
                                            <ItemTemplate>
                                                <asp:TextBox ID="TextBox7" runat="server" Text='<%# Eval("Description") %>'></asp:TextBox>
                                            </ItemTemplate>
                                        </asp:TemplateField>
                                        <asp:TemplateField HeaderText="Territory Code">
                                            <ItemTemplate>
                                                <asp:TextBox ID="TextBox8" runat="server" Text='<%# Eval("TerritoryCode") %>'></asp:TextBox>
                                            </ItemTemplate>
                                        </asp:TemplateField>
                                        <asp:TemplateField HeaderText="Amount">
                                            <ItemTemplate>
                                                <asp:TextBox ID="TextBox9" runat="server" Text='<%# Eval("AmountReleased") %>'></asp:TextBox>
                                            </ItemTemplate>
                                        </asp:TemplateField>
                                    </Columns>
                                </asp:GridView>

リンクボタンをクリックすると、そのデータが必要になり、それを..から別のaspxに転送します

protected void wbsdataGV1_SelectionChanged(object sender, EventArgs e)
{
    //Some code ;
}

今私の質問は、グリッドビューのリンクボタンをクリックしてそのデータを取得する方法です? クエリ文字列またはセッション変数または非表示のテキスト フィールドでデータを転送できます...しかし、私の懸念は、クリックされた正確なデータを取得するにはどうすればよいかということです...助けはありますか?

4

1 に答える 1

1

データの主キーになるように DataKeys 属性を定義します (ここでは、「ID」という行識別子があると仮定します。

<asp:GridView ... DataKeys="ID">
    ... existing markup
</asp:GridView>

ではwbsdataGV1_SelectionChanged、ユーザーがクリックした行の ID を次のように取得します。

int rowID = (int)this.wbsdataGV1.SelectedDataKey.Value;

次に、ID だけを渡して、次のように別のページにリダイレクトします。

Response.Redirect("anotherpage.aspx?id=" + rowID);

次に、他のページで:

protected void Page_Load(object s, EventArgs e)
{
    if (!Page.IsPostback)
    {
        int rowID = int.Parse(Request.QueryString["id"]);

        // do something with the ID of the row, like go and look
        // up JUST that row again
    }
}

おまけ - CommandButton を使わずに行全体をクリックできるようにするには、次のようにします。

<script language="javascript" type="text/javascript">
    var oldColour = null;

    function rowMouseover(o) {
        o.style.cursor = 'pointer';
        oldColour = o.style.backgroundColor;
        o.style.backgroundColor = '#dddddd';
    }

    function rowMouseout(o) {
        o.style.backgroundColor = oldColour;
    }
</script>

<asp:GridView ... OnRowCreated="grid_RowCreated" />

protected void grid_RowCreated(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        e.Row.Attributes["onclick"] =
            Page.ClientScript.GetPostBackClientHyperlink(
                this.grid, 
                "Select$" + e.Row.RowIndex);

        e.Row.Attributes["onmouseover"] = "rowMouseover(this);";
        e.Row.Attributes["onmouseout"] = "rowMouseout(this);";
    }
}

protected override void Render(HtmlTextWriter writer)
{
    for (int i = 0; i < grid.Rows.Count; i++)
        Page.ClientScript.RegisterForEventValidation(grid.UniqueID, "Select$" + i); 

    base.Render(writer);
}

Session オブジェクトを介して ID を渡すこともできますが、(ブラウザーによっては) 同時に複数のブラウザー ウィンドウが同じ操作を実行すると、奇妙な動作が発生します。これは、ユーザーが改ざんするのが難しいでしょう。

Request.Form を介して ID を渡すこともできます。これにより、ユーザーの些細な操作から ID が隠されますが、真のセキュリティは追加されません。

ヒント: 大量のオブジェクトを単にセッション変数にダンプしないでください。怠け者で、エラーが発生しやすく、スケーリングしません。

于 2012-11-06T10:08:29.620 に答える