Как я могу скрыть пустые столбцы в сетке, не зная, какие будут пустыми? - PullRequest
2 голосов
/ 04 марта 2011

Я работаю с gridview, который извлекает данные из базы данных SQL на основе выбора в раскрывающихся списках. Исходная таблица имеет шесть столбцов для атрибутов выбора, но в зависимости от того, что выбрано, может быть от одного до шести пустых (все нулевые значения). Когда столбец пуст, я бы хотел, чтобы он был скрыт, чтобы страница была менее громоздкой и запутанной.

Я искал ответ в течение последних нескольких дней, но то, что я нашел до сих пор, связано либо со скрытием столбцов, которые, как вы знаете, пусты, которых я не знаю, либо удалением их в коде SQL, который, я думаю, не работает, если столбец вызывается в коде gridview и не существует в запросе.

Я очень плохо знаком с ASP.NET, поэтому извините, если какая-то из моих терминов отключена! Дайте мне знать, если у вас есть какие-либо вопросы о том, что я спрашиваю.

Заранее спасибо за помощь!

Ответы [ 5 ]

4 голосов
/ 04 марта 2011

Вы можете попробовать:

  1. В настройке вида сетки будут скрыты все столбцы (Visible="false")
  2. В событии RowDataBound gridview проверьте каждое из значений столбцов и, если оноимеет данные, установите для столбца показ (Visible="true")

Метод 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
    }
}
4 голосов
/ 04 марта 2011

Вместо того, чтобы скрывать пустые столбцы, почему бы вам не добавить нужные столбцы в коде ?

Когда вы извлекаете данные для отображения, вы знаете, какие столбцы присутствуют,Вы можете добавить их и связать их в коде.

Чтобы начать с этим, вот код из полезной статьи о том, как это сделать:

BoundField nameColumn = new BoundField();
nameColumn.DataField = "Name";
nameColumn.HeaderText = "Person Name";
GridView1.Columns.Add(nameColumn);
2 голосов
/ 19 января 2015

Лучший способ сделать это для веб:

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;
        }
    }
}
1 голос
/ 30 января 2014

Вместо этого кода:

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

Используйте это:

if (!String.IsNullOrEmpty(Convert.Tostring(rowView["ColumnA"])) )
            YourGridview.Columns[0].Visible = true;
0 голосов
/ 04 марта 2011

для события onItemBound сетки, вы можете проверить значение переменной, которая будет установлена ​​в ячейке столбца, и соответственно настроить ее видимость

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...