如何在网格视图的单元格中隐藏链接

本文关键字:单元格 隐藏 链接 视图 网格 | 更新日期: 2023-09-27 18:13:05

我有一个显示来自数据库的数据的gridview。在这个数据库中的一个表中,有一个列用于存储有关附件文件的详细信息。如果附件可用,该列值将设置为"YES"。否则将设置为"NO"。我想做的是,显示一个链接来查看附件。但是,如果列的单元格值为"NO"(当没有附件时),则必须隐藏链接。

注意:我知道如何查看文件。这里我期望的是隐藏在没有附件的单元格中的链接。

这是我到目前为止所做的。
if (ds.Tables[0].Rows.Count > 0)
{
     grdSo.DataSource = ds;
     grdSo.DataBind();
     for(int i=0; i <ds.Tables[0].Rows.Count; i++)
     {
          if (ds.Tables[0].Rows[i][6].Equals("NO"))
          {
               grdSo.Rows[i].Cells[6].Visible = false;
          }
         else
         {
               grdSo.Rows[i].Cells[6].Visible = true;
         }
     }
}       

我可以使用下面的代码隐藏单元格。但不幸的是,这也隐藏了细胞的线条。我怎样才能避免这种情况的发生?

如何在网格视图的单元格中隐藏链接

做到这一点的方法之一是使用服务器端控件(如LinkButton)来查看您想要显示的链接,并根据gridview的OnRowDataBound事件的要求设置控件的可见性。

下面是OnRowDataBound事件显示/隐藏LinkButton的代码。

protected void gridId_RowDataBound(object sender, GridViewRowEventArgs e)
{
     if (e.Row.RowType == DataControlRowType.DataRow)
     {
          DataSourceClass varData = (DataSourceClass)e.Row.DataItem;
          // check if your data have flag to show the link
          if(varData.show)
            ((LinkButton)e.Row.FindControl("linkbuttonId")).Visible = true;
          else
            ((LinkButton)e.Row.FindControl("linkbuttonId")).Visible = false;
     }
}

ASPX Code:

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false" OnRowDataBound="GridView1_RowDataBound">
        <Columns>
            <asp:BoundField Visible="false" DataField="id" />
            <asp:TemplateField HeaderText="Has Attachment">
                <ItemTemplate>
                    <asp:Label ID="lblAtt" runat="server" Text='<%#Eval("HasAtt") %>' />
                </ItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="View Attachment">
                <ItemTemplate>
                    <asp:LinkButton ID="lbtnAtt" runat="server" OnClick="lbtnAtt_Click" Visible="false">View</asp:LinkButton>
                </ItemTemplate>
            </asp:TemplateField>
        </Columns>
    </asp:GridView>

CS Code:

protected void Page_Load(object sender, EventArgs e)
    {
        if(!IsPostBack)
        {
            this.BindGrid();
        }
    }
    private void BindGrid()
    {
        //Here you write databind logic
        // Datasource table of GridView1 should contain 'HasAtt' and 'id' as its binded to label.
    }
    private void ViewAttachment(int id)
    {
        //Here you write your logic to view attachment.
    }
    protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if(e.Row.RowType == DataControlRowType.DataRow) // checking if row is datarow or not
        {
            Label lblHasAtt = e.Row.FindControl("lblAtt") as Label;
            LinkButton lbtnViewAtt = e.Row.FindControl("lbtnAtt") as LinkButton;
            lbtnViewAtt.Visible = (lblHasAtt.Text.ToLower() == "yes");
        }
    }
    protected void lbtnAtt_Click(object sender, EventArgs e)
    {
        LinkButton lbtnViewAtt = sender as LinkButton;
        GridViewRow grw = lbtnViewAtt.NamingContainer as GridViewRow;
        int id = Convert.ToInt32(this.GridView1.Rows[grw.RowIndex].Cells[0].Text); // retriving value of first column on 'lbtnAtt' click row.
        this.ViewAttachment(id);
    }

我记得能够通过对行使用for each和对列使用for语句来解析网格视图。如果我没记错的话,你可以拿一件东西行。项[我]

foreach(GridViewRow row in  GridView1.Rows)
{
    for(int i = 0; i < GridView1.Columns.Count; i++)
    {
        // here you can do the logic to decide whether to show or hide the text for this cell
    }
}

对不起,我的手机回复格式不对。