6

ASP.NET Web フォーム アプリケーションがあります。私のアプリケーションには、スムーズに動作するGridViewがあります。いくつかのテキスト フィールドがあり、最後のフィールドは<asp:hyperlinkfield>.

ここで、特定の条件が満たされた場合の代わりに単純なリンクを配置して、プログラムでフィールドを変更したいと思います。hyperlinkfieldしたがって、私はonRowDataBoundイベントをキャッチします:

Sub myGridView_RowDataBound(ByVal sender As Object, ByVal e As GridViewRowEventArgs) Handles myGridView.RowDataBound

    If (condition) Then
           Dim link = New HyperLink()
           link.Text = "login"
           link.NavigateUrl = "login.aspx"
           e.Row.Cells(3).Controls.Add(link)
        End If
    End If
End Sub

ここで、nhyperlinkfieldはが配置されるセルです。このコードではhyperlinkfield、 newに追加するだけlinkです。どうすれば交換できますか?

PS: コードは VB6 ですが、私は C# プログラマーです。両方の言語での回答が受け入れられます。

4

5 に答える 5

7

そのような状況では、私は通常、バインドされたフィールドをテンプレート化されたフィールドに変換します。

 <asp:TemplateField HeaderText="Title" SortExpression="Title">
    <ItemTemplate>
       <asp:HyperLink ID="TitleHyperLink" runat="server" ></asp:HyperLink>
    </ItemTemplate>
 </asp:TemplateField>

そして、コードビハインドで残りの作業を行います。

protected void grid_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        var link = (HyperLink)e.Row.FindControl("TitleHyperLink");

        if (link != null)
        {
            if (condition)
            {
               link.Text = "login";
               link.NavigateUrl = "login.aspx";
            }
            else 
            {
               link.Text = "default text";
               link.NavigateUrl = "default.aspx";
            }
        }
    }
}
于 2012-02-29T16:07:59.437 に答える
7

新しいコントロールを追加する前に、置き換えるコントロールをコレクションから削除します。

protected void TestGridView_RowDataBound(object sender, GridViewRowEventArgs e)
{
  if (e.Row.RowType == DataControlRowType.DataRow)
  {
    HyperLink newHyperLink = new HyperLink();
    newHyperLink.Text = "New";
    e.Row.Cells[3].Controls.RemoveAt(0);
    e.Row.Cells[3].Controls.Add(newHyperLink);
  }
}

しかし、私は他の人に同意します。既存のリンクのプロパティを変更するだけです:

protected void TestGridView_RowDataBound(object sender, GridViewRowEventArgs e)
{
  if (e.Row.RowType == DataControlRowType.DataRow)
  {
    HyperLink link = e.Row.Cells[0].Controls[0] as HyperLink;
    if (link != null)
    {
      link.Text = "New";
      link.NavigateUrl = "New";
    }
  }
}
于 2012-02-29T15:49:39.367 に答える
1

この時点で新しいリンクを作成する代わりに、フィールドの一部として既に生成されているリンクを取得します。

If (e.Row.RowType = DataControlRowType.DataRow) Then
    Dim link = e.Row.Cells(3).Controls(0)
    link.Text = "login"
    link.NavigateUrl = "login.aspx"
End If

編集:アイテム行の外側でのアクションを回避するために If ブロックを追加しました。

于 2012-02-29T15:43:02.697 に答える
1

aspxファイルでこれを行うことができます:

<asp:HyperLink Text='<%# condition ? "TextIfTrue" : "TextIfFalse" %>' NavigateUrl='<%# condition ? "UrlIfTrue" : "UrlIfFalse" %>' />

またはあなたのキャスト

e.Row.Cells(3).Controls(0)

ハイパーリンクに変更し、その値を変更します。

于 2012-02-29T15:46:48.230 に答える