none
Глюки в работе DataGridView RRS feed

  • Вопрос

  • Всем добрый вечер!

     

    Возникла такая проблема:

    Есть простенькое приложение, которое по сети получает сериализованный DataSet. После того как объект десериализуется, нулевая таблица устанавливается в качестве DataSource компонента DataGridView.

    Дак вот, после нескольких обновлений таблицы, на форме, вместо таблицы, появляется красный крест на белом фоне.

     

    На сколько я понял из Гуга, это баг компонента. 

     

    Так ли это? И как можно это побороть?

     

    Буду благодарен за любую информацию.

    Всем спасибо!


    E-mail: Svatoslav.Pankratov@gmail.com
    21 декабря 2010 г. 21:20

Ответы

  • Установка происходит из дочернего потока. Клиент работает в собственном (дочернем) потоке. При получении клиентом ответа от сервера, вызывается событие, на которое подписана форма, дак вот в обработчике этого события и происходит обновление DataSource.
    Для работы с визуальным компонентом, вы должны перейти в тот поток приложения, в котором этот компонент был создан. Используйте метод DataGridView.Invoke()
    • Помечено в качестве ответа Svyatoslav Pankratov 22 декабря 2010 г. 13:54
    22 декабря 2010 г. 13:36
    Отвечающий

Все ответы

  • Явление исчезло, если перед обновлением DataGridView, его сначала скрывать, а после обновления DataSource заново показывать. Но есть ощущение, что это не совсем правильное решение.
    E-mail: Svatoslav.Pankratov@gmail.com
    21 декабря 2010 г. 22:17
  • Попробуйте следующее решение:

      public class MyDataGridView : DataGridView
      {
        protected override void OnPaint( PaintEventArgs e ) 
        {
          try
          {
            base.OnPaint( e );
          }
          catch
          {
            Invalidate();
          }
        }
      }
    
    У вас установка DataSource происходит в главном потоке, или потокобезопасно?


    Для связи [mail]
    22 декабря 2010 г. 6:26
  • У вас установка DataSource происходит в главном потоке, или потокобезопасно?

    Установка происходит из дочернего потока. Клиент работает в собственном (дочернем) потоке. При получении клиентом ответа от сервера, вызывается событие, на которое подписана форма, дак вот в обработчике этого события и происходит обновление DataSource.

     

    Код, приведенный выше не помогает, реже стало, но всеравно проскакивает =(

    Проблема, как я понял, из-за того что не всегда вызывается перерисовка компонента?


    E-mail: Svatoslav.Pankratov@gmail.com
    22 декабря 2010 г. 13:12
  • Установка происходит из дочернего потока. Клиент работает в собственном (дочернем) потоке. При получении клиентом ответа от сервера, вызывается событие, на которое подписана форма, дак вот в обработчике этого события и происходит обновление DataSource.
    Для работы с визуальным компонентом, вы должны перейти в тот поток приложения, в котором этот компонент был создан. Используйте метод DataGridView.Invoke()
    • Помечено в качестве ответа Svyatoslav Pankratov 22 декабря 2010 г. 13:54
    22 декабря 2010 г. 13:36
    Отвечающий
  • Установка происходит из дочернего потока. Клиент работает в собственном (дочернем) потоке. При получении клиентом ответа от сервера, вызывается событие, на которое подписана форма, дак вот в обработчике этого события и происходит обновление DataSource.
    Для работы с визуальным компонентом, вы должны перейти в тот поток приложения, в котором этот компонент был создан. Используйте метод DataGridView.Invoke()
    Хорошо, спасибо, ша попробую =)
    E-mail: Svatoslav.Pankratov@gmail.com
    22 декабря 2010 г. 13:45
  • Спасибо большое! =) Заработало как часы =)
    E-mail: Svatoslav.Pankratov@gmail.com
    22 декабря 2010 г. 13:54