0

ドロップダウンとグリッドビューがあります。ドロップダウンで選択した値に応じて、グリッドビューの 1 列目に指定されたハイパーリンクの NaviagetURL を更新します。そのため、onRowDataBound 関数を使用して、ハイパーリンクの navigateurl を動的に更新しています。そして、最初の列「ID」の値を取得して OnRowDataBound 関数内のクエリ文字列として使用しようとしていますが、これを機能させることができません。

最初の列のハイパーリンクをクリックすると、クエリ文字列に変数 ID に割り当てられた値がありません。したがって、URL はhttp://localhost/JobCosting/EditSavedTicket.aspx?ID=に解決されます。

予想されるのは、ハイパーリンクをクリックして開く URL には、クエリ文字列の変数 ID に割り当てられた 1 列目に指定された値が必要です。e.Row.Cells[1].Text または e.Row.Cells[2].Text を使用すると、列の値は正しく取得されますが、取得されていない列 0 の値が必要です。e.Row.Cells[0].Textである文字列IDの長さを確認すると、ゼロです

グリッドビュー:

<asp:GridView ID="GridView2" runat="server" AllowSorting="True" 
 AutoGenerateColumns="False" DataSourceID="Saved_Work" OnRowDataBound="update_url" 
 Style="float: left; font-size: small; position: relative;
            width: 82%; position: relative; top: -10px; height: 40px; font-size: small; text-align: left;
            left: 30px;" align="left">
            <Columns>
                <asp:TemplateField HeaderText="ID">
                    <ItemTemplate>
                        <asp:HyperLink ID="Continue_SavedWork" runat="server" NavigateUrl='<%# Eval("ID", "~/EditSavedJob.aspx?ID={0}") %>'
                            Text='<%# Eval("ID") %>'></asp:HyperLink>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:BoundField DataField="UserID" HeaderText="User" SortExpression="UserID" />
                <asp:BoundField DataField="Date_Created" HeaderText="Last_Updated_On" SortExpression="Date_Created" />
            </Columns>
        </asp:GridView>

コードビハインド:

protected void update_url(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        //string NavigateUrl="<%# Eval('ID', 'EditSavedTicket.aspx?ID={0}) %>";
        string id = e.Row.Cells[0].Text;
        HyperLink hp = (HyperLink)e.Row.FindControl("Continue_SavedWork");
        if (SavedWorkDD.SelectedValue.ToString() == "Tickets")
            hp.NavigateUrl = string.Format("EditSavedTicket.aspx?ID={0}", id);
    }
}
4

1 に答える 1

0

最初の列のテキストにアクセスできない理由は、それがテンプレート列であるのに対し、他の列はBoundField列であると思われます。

DataItemコントロールからテキストを取得する代わりに、OnRowUpdatedイベント ハンドラーで にアクセスできます。たとえば、DataTable にバインドしている場合は、次のDataRowViewようにアクセスできます。

protected void update_url(object sender, GridViewRowEventArgs e)
{
  if (e.Row.RowType == DataControlRowType.DataRow)
  {
    var row = (DataRowView)e.Row.DataItem;
    var id = (int)row["ID"];
    // ...
  }
}

このアプローチは、コントロールを見つけてその値にアクセスしようとするよりも信頼性が高くなります。UI を変更しても、引き続き動作します。

于 2017-12-20T08:13:39.403 に答える