Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Вывод диапазона строк в DataGridView


Автор: bobadd 4.12.2007, 14:53
Проблема возникла следующая:
У меня DataGridView, чьим датасурсом является таблица на 130000 значений. 
Есть поле, которое задает сколько строчек видимо в данном DataGridView

Пробовал делать построчно 
Rows[i].Visible = false;

Но на это тратится ооочень много времени.

Возникает вопрос нет ли встроенного механизма вывода диапазона?

Автор: 1stain 4.12.2007, 15:15
создай в таблице поле с автоинкрементом, не связанное с данными в базе (для нумерации строк). Добавляешь DataView, к нему как DataSource - таблицу. Для GridView DataSource ставишь DataView, в котором делаешь фильтр на номер автоинкрементного поля.
Этот метод и вообще про ADO.NET можешь прочитать в этой книге http://www.infanata.org/2007/08/27/programmirovanie_na_microsoft_adonet_20.html

Автор: bobadd 4.12.2007, 18:10
Сейчас возникла проблемка, возможна весьма дилетантская, dataView.Table = T (где Т - моя таблица на 130000), вызывает exception 
"Exception has been thrown by the target of an invocation.".
У меня есть подозрение, что должна быть привязка к какой-то БД. У меня сейчас всё без БД сделано

Автор: 1stain 4.12.2007, 19:13
покажи код создания DataView, привязки DataSource к DataGridView, установки RowFilter
и добавления столбцов в Table

Автор: bobadd 4.12.2007, 19:27
Код

        static DataView DView = new DataView();
        static DataTable T = new DataTable();
....
....
        static BackgroundWorker DumpLoad = new BackgroundWorker();
....
....
        void DumpLoad_DoWork(object sender, DoWorkEventArgs e)
        {
            switch (((string)e.Argument)[0])
            {
                case '1':
                    
                  //ЗАПОЛНЕНИЕ ТАБЛИЦЫ

                  if (((string)e.Argument)[1] == '1')
                    {
                        T.Columns.Add("Адрес");
                        T.Columns.Add("00");
                        T.Columns.Add("01");
                        T.Columns.Add("02");
                        T.Columns.Add("03");
                        T.Columns.Add("04");
                        T.Columns.Add("05");
                        T.Columns.Add("06");
                        T.Columns.Add("07");
                        T.Columns.Add("08");
                        T.Columns.Add("09");
                        T.Columns.Add("0A");
                        T.Columns.Add("0B");
                        T.Columns.Add("0C");
                        T.Columns.Add("0D");
                        T.Columns.Add("0E");
                        T.Columns.Add("0F");
                        T.Columns[0].ReadOnly = true;
                    }

                   for (int i = 1; i <= 16; i++)
                    {
                        T.Columns[i].MaxLength = 2;
                        T.Columns[i].DefaultValue = "FF";
                    }

                    int k;

                    for (int i = 0; i <= 131071; i++)
                    {
                        if (i%100 == 0) Delay(1);
                        k = 0x10 * i;
                        T.Rows.Add(NullAdd(k.ToString("X"), 6));
                    }
                    break;
.......
        }
                e.Result = T;
     }
.......
        void DumpLoad_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            DataTable T = (DataTable)e.Result;
            DView.Table = T;
            Dump2.DataSource = DView;         // Вот тут возникает Exception
            Dump2.Visible = true;
            
            Dump2.Columns[0].Width = 50;
            for (int i = 1; i <= 16; i++)
            {
                Dump2.Columns[i].Width = 25;
            }
            tabControl1.Enabled = true;

            DumpLoad.Dispose();
        }


Пока нет фильтрации никакой. Раньше было напрямую

Код

          DataTable T = (DataTable)e.Result;
            Dump2.DataSource = T;
            Dump2.Visible = true;


И всё работало.

Автор: 1stain 4.12.2007, 19:44
попробуй так
Код

        DataView DView;
....
if (((string)e.Argument)[1] == '1')
                    {
DataColumn col = T.Columns.Add("RowNumber", typeof(int));
col.AutoIncrement = true;
col.AutoIncrementSeed = 0;
col.AutoIncrementStep = 1;
T.Columns.Add("Адрес");

....


 void DumpLoad_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            DataTable T = (DataTable)e.Result;
            DView = new DataView(T);
DView.RowFilter = "RowNumber > 10 AND RowNumber < 20";
Dump2.AutoGenerateColumns = true;
Dump2.DataSource = DView;         // Вот тут возникает Exception


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)