如何在不知道哪个为空的情况下隐藏网格视图中的空列?

时间:2011-03-04 15:44:20

标签: c# asp.net gridview

我正在使用gridview,它根据下拉列表中的选择从SQL数据库中提取数据。源表有六列用于选择的属性,但是根据所选择的内容,可能有一到六个空的列(所有空值)。当列是空的时,我想隐藏它,这样页面就不那么笨拙和混乱了。

我在过去的几天里一直在寻找答案,但到目前为止我发现的要么与隐藏的列相关,你知道这些列是空的我不知道,或者在我认为的SQL代码中删除它们如果在gridview代码中调用该列并且查询中不存在该列,则无效。

我是ASP.NET的新手,所以如果我的某些术语已经关闭,我很抱歉!如果您对我的要求有任何疑问,请与我联系。

提前感谢您的帮助!

5 个答案:

答案 0 :(得分:4)

您为什么不在代码中添加所需的列,而不是隐藏空列?

检索要显示的数据时,您知道存在哪些列。您可以添加它们并在后面的代码中对它们进行数据绑定。

为了帮助您开始使用此功能,以下是helpful article中有关如何执行此操作的一些代码:

BoundField nameColumn = new BoundField();
nameColumn.DataField = "Name";
nameColumn.HeaderText = "Person Name";
GridView1.Columns.Add(nameColumn);

答案 1 :(得分:4)

你可以尝试:

  1. 设置gridview将隐藏所有列(Visible="false"
  2. 在gridview的RowDataBound事件中,检查每个列值以及是否有数据,将列设置为show(Visible="true"
  3. RowDataBound方法看起来像这样:

    void YourGridview_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            // if this is a SqlDataSource you can use DataRowView, 
            // otherwise use whatever type is used in the data source
            DataRowView rowView = (DataRowView)e.Row.DataItem;
    
            if (!String.IsNullOrEmpty(rowView["ColumnA"])) 
                YourGridview.Columns[0].Visible = true;
            // repeat for your other columns
        }
    }
    

答案 2 :(得分:2)

为网络做到这一点的最佳方式:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.UI.WebControls;

namespace MyProject
{
    public static class ExtensionGridView
    {
        public static GridView RemoveEmptyColumns(this GridView gv)
        {
            // Make sure there are at least header row
            if (gv.HeaderRow != null)
            {
                int columnIndex = 0;

                // For each column
                foreach (DataControlFieldCell clm in gv.HeaderRow.Cells)
                {
                    bool notAvailable = true;

                    // For each row
                    foreach (GridViewRow row in gv.Rows)
                    {
                        string columnData = row.Cells[columnIndex].Text;
                        if (!(string.IsNullOrEmpty(columnData) || columnData ==" "))
                        {
                            notAvailable = false;
                            break;
                        }
                    }

                    if (notAvailable)
                    {
                        // Hide the target header cell
                        gv.HeaderRow.Cells[columnIndex].Visible = false;

                        // Hide the target cell of each row
                        foreach (GridViewRow row in gv.Rows)
                            row.Cells[columnIndex].Visible = false;
                    }

                    columnIndex++;
                }
            }

            return gv;
        }
    }
}

答案 3 :(得分:1)

而不是这段代码:

if (!String.IsNullOrEmpty(rowView["ColumnA"])) 
            YourGridview.Columns[0].Visible = true;

使用这个:

if (!String.IsNullOrEmpty(Convert.Tostring(rowView["ColumnA"])) )
            YourGridview.Columns[0].Visible = true;

答案 4 :(得分:0)

在网格的 onItemBound 事件中,您可以检查要在列单元格中设置的变量的值并相应地设置其可见性