Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.09.2011, 21:23   #1
zakaev
 
Регистрация: 08.12.2010
Сообщений: 8
По умолчанию По выходу из потока не работают элементы скроллинга компонента dataGridView

У меня есть простая форма с кнопкой, прогрессбаром и датагридом.
Я в потоке рандамайзом заполняю N строк:

Код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace WindowsFormsApplication10
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();            
        }
        public void r()
        {
            Random a = new Random();
            for (int i = 0; i < 100999; i++)
            {
                dataGridView1.Rows.Add();
                dataGridView1.Rows[i].Cells[0].Value = a.Next();
            }
            button1.Visible = true;
            progressBar1.Visible = false;
        }
        private void button1_Click(object sender, EventArgs e)
        {
            button1.Visible = false;
            progressBar1.Visible = true;
            new Thread(r).Start();            
        }
    }
}
При окончании работы потока в компоненте dataGridView становятся неактивными элементы скроллинга. листать могу только роликом мышки.
Можно ли вернуть нормальное управление скроллами?
zakaev вне форума Ответить с цитированием
Старый 02.09.2011, 10:33   #2
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

Очень все это подозрительно. А как у Вас вообще в ошибку не вылетело?
Доступ к элементу управления "dataGridView1" не из того потока, в котором он был создан.

Вам необходимо создать метод делегат в основном потоке и этот метод вызывать из потока через BeginInvoke().

Скорее всего поэтому у Вас и проблемы.
Вот Вам правильный пример ...
Код:
        private delegate void FillGridDelegate(); // делегат для функции
       
        private void FillGrid() // функция заполнения датагрида
        {
            Random a = new Random();
            for (int i = 0; i < 30000; i++) // сюда свое число вставите... 
            {
                dataGridView1.Rows.Add();
                dataGridView1.Rows[i].Cells[0].Value = a.Next();
                Application.DoEvents(); // это чтобы программа не висела пока вы заполнять ее будете ... 
            }
        } 

        public void ThreadProc() // основная функция потока
        {
            FillGridDelegate FillD = new FillGridDelegate(FillGrid); // создаем делегат с указателем на нужную функцию
            if (this.InvokeRequired) this.BeginInvoke(FillD); // выполняем ее в том потоке где был создан элемент
        }

        private void button1_Click(object sender, EventArgs e)
        {
            button1.Visible = false;            
            new Thread(ThreadProc).Start(); // запускаем поток
        }
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.

Последний раз редактировалось WorldMaster; 02.09.2011 в 10:41.
WorldMaster вне форума Ответить с цитированием
Старый 07.09.2011, 08:11   #3
zakaev
 
Регистрация: 08.12.2010
Сообщений: 8
По умолчанию

Ошибка у меня не вылетала потому что в коде я дописывал
CheckForIllegalCrossThreadCalls = false;
А тут почему то забыл указать.

Спасибо за внимание, доступно очень расписали.
Но к сожалению мою проблему не решило. Я акцентировал на прорисовке датагрида, попробовал в своем приложении, а проблема оказалось чуть в другом.
Дело в том что я обращаюсь с запросом на сервер БД. Запрос выполняется пару секунд на сервере, и потом я через reader заполняю датагрид:
Код:
            using (OleDbConnection Connection = new OleDbConnection("bla-bla"))
            {
                Connection.Open();
                OleDbCommand Command = new OleDbCommand("trala-la",Connection);
                OleDbDataReader reader = Command.ExecuteReader();
                int counter=0;
                while (reader.Read())
                {
                    dataGridView1.Rows.Add();
                    dataGridView1.Rows[counter].Cells[0].Value = reader[0].ToString();
                    counter++;
                }
                reader.Close();
                Command.Connection.Close();
            }
Если делать моим деревянным способом, то во время ожидания ответа от сервера приложение не висит, но после прорисовки компоненты скроллбара не доступны.

Если делать как написали Вы, то попросту получается приложение на момент ожидания от сервера подвисает. А когда переходит к заполнению - всё работает как надо.
Не подскажете как решить эту проблему.
zakaev вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Пример скроллинга textarea softbi HTML и CSS 2 29.06.2011 07:23
Как узнать номер потока из самого потока? GaMeSTeR Помощь студентам 0 03.12.2010 09:50
Запись аудио потока в событие OnBuffer компонента SampleGrabber Jacobson Мультимедиа в Delphi 2 01.08.2010 00:22
Подобие скроллинга в паскале druganito Помощь студентам 2 18.05.2009 13:46