2009-03-11 13 views
2

私はそれで、次の列を持つASP.NET 2.0でのDataGridていますので、基本的な考え方は、ポップをバックキック、データグリッドの各行にリンクを持っているのDataGridコントロール無効

<ASP:TEMPLATECOLUMN> 
    <ItemStyle HorizontalAlign="Right"></ItemStyle>   
    <ItemTemplate> 
     <asp:HyperLink id="HyperLink1" runat="server" 
      CssClass="DataGridCommand" Target="_blank" 
      NavigateUrl='<%# GetPreviewURL(DataBinder.Eval(Container, "DataItem.NodeID")) %>'> 
     Preview Graphic 
     </asp:HyperLink> 
    </ItemTemplate> 
</ASP:TEMPLATECOLUMN> 

です(NodeIDのデータバインドされた列を参照してください)。これはうまく動作します。

関連する画像がない行のリンクを無効にしようとしています。これを行うには私がPage_Loadの下、背後にあるコードでこれを置く:あなたが見ることができるように

foreach (DataGridItem dgi in this.dgNode.Items) 
{ 
    HyperLink myLink1 = (HyperLink)dgi.Cells[0].FindControl("HyperLink1"); 

    //myLink1.Visible = false; 
    //if (condition for hiding links goes here...) 
    myLink1.Enabled = false; 
    this.dgNode.DataBind(); 
} 

は、私がfalseにvisibleプロパティを設定しようとしたが、それは動作しませんでした。私はfalseを有効に設定しようとしましたが、どちらもうまくいきませんでした。そして、私は再びDataGridのデータバインドを試みました - うまくいきません。リンクは正常に機能し続けます。

なぜこれが機能しないのか、それを動作させるために何ができるのか、誰かが根本的に欠陥がある場合、別の解決方法を知っていますか?私は特定の行のリンクをグレーアウトするか、クリックしないように隠すかのどちらかを探しています。

答えて

2

あなたがそうのように、OnRowDataBoundイベントでこれを扱うことができます。

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    HyperLink hl = (HyperLink)e.Row.FindControl("HyperLink1"); 
    hl.Visible = false; 
} 
0

私は確信していませんが、あなたは、オブジェクトHyperlink1のインスタンスが複数あるので、asp.netが急いでいると思います。 Is not ID IDは、一意の識別子として使用されます。複数のインスタンスがある場合は、それを操作することを拒否するかもしれません。

1

ページの読み込み時にアイテムをループするのではなく、OnItemDataBoundイベントを処理するイベントハンドラを追加する必要があります。そこでは、各項目がバインドされているので、そこでHyperLinkを見つけて無効にすることができます。

リンクを不可視または無効に設定した後にDataBind()メソッドを呼び出すため、現在のソリューションが動作していないと考えられます。これにより、DataGridが再構築され、直前に行った作業が消去されます。各項目のDataGridを再バインドすることは言うまでもありませんが、これはパフォーマンスのヒットです。

1

ハイパーリンクを無効にしてから実際にデータグリッドをバインドしているので、再バインドは本質的にデータバインドコードを通じてリンクを再び「再アクティブ化」していると思います。

代わりに、DataGridのItemDataboundイベントを消費し、その時点でハイパーリンクを有効または無効にすることについて考えましたか?あなたはすぐにすべてのデータを手に入れることができ、コードは今のところとほとんど変わらないでしょう。

関連する問題