2009-03-11 13 views
2

İçinde aşağıdaki sütun ile ASP.NET 2.0 DataGrid var:DataGrid denetimi Engelli

<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> 

Yani temel fikir geri Bir açılan tekmeler DataGrid her satırda bir bağlantı sahip olmaktır görüntü önizleme (NodeID için veriye bağlı bir sütuna gönderme). Bu iyi çalışıyor.

İlişkilendirilmiş resim bulunmayan satırların bağlantılarını devre dışı bırakmaya çalışıyorum. Bunu yapmak için ben Page_Load altında, kodda bu koyun: Gördüğünüz gibi

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(); 
} 

, ben visible özelliğini false ayarlayarak çalıştı, ancak bu işe yaramadı. Sahte izin vermeyi denedim, işe yaramadı. Ve sonra DataGrid'i tekrar veritabanına almaya çalıştım - işe yaramıyor. Bağlantılar normal şekilde çalışmaya devam eder.

Bunun neden işe yaramadığını, çalışmasını sağlamak için ne yapılabileceğini ve temel olarak kusurlu ise alternatif bir çözüm olduğunu bilen var mı? Belirli satırlar için bağlantıyı griye çekmek veya tıklanmayacak şekilde gizlemek istiyorum.

cevap

2

Sen OnRowDataBound olaya bu işi şöyle olabilir:

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

Emin değilim ama sanırım Asp.net, Hyperlink1 nesnesinin birden çok örneğiniz olduğundan dolayı acele ediyor. ID proprety, tek bir tanımlayıcı olarak kullanılır, eğer birden fazla örnek varsa, belki de onu manipüle etmeyi reddeder.

1

Sayfa yüklemesindeki öğeler arasında geçiş yapmak yerine OnItemDataBound olayını işlemek için bir olay işleyicisi eklemelisiniz. Daha sonra her öğe bağlı olduğundan HyperLink'i bulabilir ve devre dışı bırakabilirsiniz.

Geçerli çözümün, bağlantının görünmez veya devre dışı bırakılmasını ayarladıktan sonra DataBind() yöntemini çağırdığı için işe yaramadığına inanıyorum. Bu DataGrid'in kendini yeniden inşa etmesine ve yaptığınız işi silmeye neden olur. Her bir öğe için DataGrid'inizi bir performans isabeti olarak yeniden adlandırdığınızı belirtmeyin.

1

Köprüleri devre dışı bıraktığınız ve daha sonra veri kılavuzunu bağlandıktan sonra, yeniden bağlama işleminin temelde bağlantı kodu üzerinden yeniden "yeniden etkinleştiğini" iddia ediyorum.

Alternatif olarak, DataGrid öğesinin ItemDatabound olayını tüketmeyi ve o anda köprüler etkinleştirmeyi/devre dışı bırakmayı düşündünüz mü? Tüm verileri parmaklarınızın ucunda olacak ve kod şu an sahip olduğunuzla aynı görünecektir.