2012-02-29 12 views
5

Tôi có một ứng dụng ASP.NET Web Forms. Trong ứng dụng của tôi, tôi có GridView hoạt động trơn tru. Tôi có một số trường văn bản và trường cuối cùng là <asp:hyperlinkfield>.Làm thế nào để thay thế chương trình HyperLinkField trong ASP.NET GridView

Bây giờ tôi muốn thay đổi trường theo chương trình bằng cách đặt liên kết đơn giản thay vì hyperlinkfield nếu điều kiện cụ thể được đáp ứng. Vì vậy, tôi bắt sự kiện 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 

nơi n là các tế bào nơi hyperlinkfield được đặt. Với mã này, nó chỉ thêm vào hyperlinkfield mới link. Làm thế nào tôi có thể thay thế nó?

PS: Mã này là trong VB6 nhưng Tôi là một C# lập trình viên, câu trả lời với cả hai ngôn ngữ được chấp nhận

Trả lời

5

Tháo điều khiển bạn muốn thay thế từ bộ sưu tập trước khi thêm mới:

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

Nhưng tôi đồng ý với những người khác, chỉ cần thay đổi các thuộc tính liên kết hiện có của:

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"; 
    } 
    } 
} 
+0

Tôi cung cấp cho bạn câu trả lời nhưng đầu tiên là một trong những tôi đang tìm kiếm. Lý do chính là 'HyperLinkField' của tôi có các thuộc tính khác được liên kết với dữ liệu và do đó tôi không thể thay thế Text và NavigateUrl. Điều đáng ngạc nhiên là không ai nhận thấy rằng điều khiển tôi phải loại bỏ là một 'HyperLinkField' khác với' HyperLink'. Tôi đoán giải pháp đầu tiên hoạt động trơn tru trừ khi có một số JavaScript được kết nối với việc làm mới dữ liệu của 'GridView' nhưng nó không phải là trường hợp của tôi. Cảm ơn nhiều! – CiccioMiami

1

Thay vì tạo ra một liên kết mới vào thời điểm này, lấy liên kết đó đã được tạo ra như một phần của lĩnh vực này.

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

EDIT: Added Nếu khối để tránh hành động bên ngoài hàng mục.

+0

cảm ơn nhưng nó mang lại cho tôi Lỗi Giá trị của loại 'System.Web.UI.WebControls.HyperLinkField' không thể được chuyển đổi thành 'System.Web.UI.Control'. – CiccioMiami

+0

bạn có thể nói chính xác bạn đang cố gắng làm gì không? – Pankaj

+0

cảm ơn. Nếu người dùng không đăng nhập, thay vì liên kết tải xuống, tôi muốn hiển thị liên kết đăng nhập – CiccioMiami

1

Bạn có thể làm điều này trong tập tin aspx của bạn:

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

hoặc đúc của bạn

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

vào một siêu liên kết và thay đổi giá trị của nó.

+0

cảm ơn. Tôi đã nghĩ về điều đó nhưng điều kiện thì phức tạp. Hơn nữa tôi luôn cố gắng để đặt mã trong mã phía sau, không thích "bẩn" aspx – CiccioMiami

6

Trong tình huống như vậy tôi thường chuyển đổi trường bị ràng buộc thành một trường mẫu.

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

Và thực hiện phần còn lại của tác phẩm trong codebehind.

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"; 
      } 
     } 
    } 
} 
+1

cảm ơn giải pháp này là tốt đẹp nhưng điều gây phiền nhiễu là siêu liên kết không có thuộc tính Id – CiccioMiami

+0

Điều @lincolnk đang nói là sử dụng TemplateField, sau đó bạn có thể sử dụng HyperLink thay vì HyperLinkField, sẽ có Id. – dugas

0

Bạn có thể sử dụng trong aspx:

<asp:HyperLink ID="HyperLink1" CssClass="exercise" runat="server" NavigateUrl="#">Search ¡here!</asp:HyperLink> 

Trong codebehind: Bạn có thể sử dụng cũng là một phương pháp:

public string SharePoint(string x) 
{ 

    string page1, page2; 

       if (x== "1") 
       { 
        string page1="http://nwpage/files.zip"; 

        return page1; 
       } 

       else 
       { 


        string page2="http://example2.aspx"; 
        return page2; 
       } 


     } 

Nếu tôi gọi là kiểm soát trong các phương pháp khác hoặc tải trang, bạn có thể thêm HyperLink1 bằng đường dẫn

string path= SharePoint(x); 
HyperLink1.NavigateUrl = path;