如何在gridview的单元格中隐藏链接?

时间:2016-10-14 04:12:58

标签: c# asp.net gridview

我有一个gridview,显示数据库中的数据。在此数据库的其中一个表中有一列存储有关attanchment文件的详细信息。如果附件可用,则该列值将设置为“是”。 否则它将设置为“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;
         }
     }
}       

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

3 个答案:

答案 0 :(得分:2)

执行此操作的方法之一是使用LinkButton之类的服务器端控件来查看要显示的链接,并根据OnRowDataBound事件中的要求设置控件的可见性gridview。

以下是在OnRowDataBound事件中显示/隐藏LinkBut​​ton的代码。

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

答案 1 :(得分:1)

我记得能够通过对每个行使用a并使用for语句来解析网格视图。 如果我没记错的话,你可以抓住一个项目即 row.Item [I]

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

很抱歉我手机上的格式化响应。

答案 2 :(得分:1)

ASPX代码:

<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代码:

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