Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> GridView.DataSource=List<...>, Как выбрать столбцы для отображения? 
V
    Опции темы
tol05
Дата 22.2.2008, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 34
Всего: 170



Привет всем. 

Вот и я столкнулся с проблемой (а что, я хуже других что-ли ?  smile )

Итак.. Есть страница с одним гридом
В зависимости от ... разных вещей мне нужно делать различные запросы к БД и получать данные в виде List<Class1>, List<Class2> ... List<ClassN>. Но биндить все эти списки все равно нужно к одному и тому же гриду. Т.е. Для каждого конкретного запросы у меня грид должен иметь различное кол-во столбцов, с различными названиями... 
Ну я и сделал что-то наподобие 
Код

switch(MyCommandArgument)
{
    case "arg1":
        SchoolsListGridView.DataSource = list1;
        break;
    case "arg2":
        SchoolsListGridView.DataSource = list2;
        break;
    case "arg3":
        SchoolsListGridView.DataSource = list3;
        break;
//...
    case "argN":
        SchoolsListGridView.DataSource = list4;
        break;    
}
MyGridView.DataBind();


но все это меня устраивало до того момента, когда выяснилось, что для некоторых таблиц нужно показывать не все столбцы, а только некоторые... В идеале нужно переписать (или написать новые) хранимки в БД, чтобы они возвращали только нужные мне столбцы, но это, по различным причинам, весьма хлопотно... Желательно решить проблему на уровне приложения. Кроме того, некоторые столбцы отображать не нужно, а данные их в коде этой же страницы используются.

Пока танцую с бубном... AutoGenerateColumns="false", огромный switch, где для каждой ситуации создаются свои BoundField и добавляются в коллекцию MyGridView.Columns

Поэтому задаю вопрос: как с найменьшими усилиями удалить из DataSource-List<T> (а точнее из view для отображения) ненужные столбцы?
MyGridView.Columns.RemoveAt(...) не предлагать smile этот тот же switch... Вот если бы кой-какие свойства Class1, Class2 ... ClassN кой-какими аттрибутами пометить можно было бы... Это было бы самое оно...


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
1stain
Дата 22.2.2008, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 486
Регистрация: 30.7.2007
Где: Киев - Харьков

Репутация: 11
Всего: 40



надеюсь, это примерно то, что тебе надо
Код

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Collections.Generic;

public partial class _Default : System.Web.UI.Page 
{
    private int[] hidingColumns;
    protected void Page_Load(object sender, EventArgs e)
    {
        this.GridView1.DataBinding += new EventHandler(GridView1_DataBinding);

        List<MyClass> myClassesList = new List<MyClass>();
        myClassesList.Add(new MyClass(1, 3, 5));
        myClassesList.Add(new MyClass(11, 22, 33));
        myClassesList.Add(new MyClass(345, 555, 222));

        this.GridView1.DataSource = myClassesList;
        this.GridView1.AutoGenerateColumns = true;
        this.GridView1.DataBind();
    }

    void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        foreach (int i in this.hidingColumns)
            e.Row.Cells[i].Visible = false;
    }

    void GridView1_DataBinding(object sender, EventArgs e)
    {
        HidingColumnsAttribute attr = this.GridView1.DataSource.GetType().GetGenericArguments()[0].GetCustomAttributes(typeof(HidingColumnsAttribute), false)[0] as HidingColumnsAttribute;
        if (attr == null)
            this.hidingColumns = new int[] { };
        else
        {
            this.hidingColumns = new int[attr.Columns.Length];
            Array.Copy(attr.Columns, this.hidingColumns, attr.Columns.Length);
        }

        GridView1.RowDataBound += new GridViewRowEventHandler(GridView1_RowDataBound);
    }
}

[global::System.AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)]
sealed class HidingColumnsAttribute : Attribute
{
    private readonly int[] columns;
    public int[] Columns
    {
        get
        {
            int[] result = new int[columns.Length];
            Array.Copy(columns, result, columns.Length);
            return result;
        }
    } 

    public HidingColumnsAttribute(params int []columns)
    {
        this.columns = new int[columns.Length];
        Array.Copy(columns, this.columns, columns.Length);
    }
}

[HidingColumns(new int[]{0,2})]
public class MyClass
{
    #region Variuos Accessors

    private int firstPropery;
    public int FirstPropery
    {
        get { return firstPropery; }
        set { firstPropery = value; }
    }

    private int secondPropery;
    public int SecondPropery
    {
        get { return secondPropery; }
        set { secondPropery = value; }
    }

    private int thirdPropery;
    public int ThirdPropery
    {
        get { return thirdPropery; }
        set { thirdPropery = value; }
    } 
    #endregion
    #region Ctors

    public MyClass()
    {
    }

    public MyClass(int first, int second, int third)
    {
        this.firstPropery = first;
        this.secondPropery = second;
        this.thirdPropery = third;
    }
    #endregion
}





--------------------
Все знают, что это невозможно. Но вот приходит невежда, которому это неизвестно - он-то и делает открытие. (Albert Einstein)
user posted image
PM MAIL   Вверх
tol05
Дата 22.2.2008, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 34
Всего: 170



1stain, душевное тебе спасибо smile

Но не пойдет... Модель интересная, но страницы этого ИМХО не стоят..
Мне проще формировать список столбцов

И потом... код
Код

 List<MyClass> myClassesList = new List<MyClass>();
        myClassesList.Add(new MyClass(1, 3, 5));
        myClassesList.Add(new MyClass(11, 22, 33));
        myClassesList.Add(new MyClass(345, 555, 222));

и выборки из БД DataReader-ом.... как-то не представляются вместе... А MyClass-ов у меня много.


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Любитель
Mymik
mr.DUDA

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Любитель, Mymik, mr.DUDA.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка под ASP.NET | Следующая тема »


 




[ Время генерации скрипта: 0.0445 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.