И снова Double Buffering и DataGridView

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Dry
Новичок
Новичок
Аватара пользователя
 
Сообщения: 26
Зарегистрирован: 08.02.2007 (Чт) 2:03

И снова Double Buffering и DataGridView

Сообщение Dry » 16.02.2009 (Пн) 18:35

Как включить Double Buffering (двойная буферизация) в VB.NET для контрола DataGridView, дайте наглядный пример плиз?

Собсно первоначальный вопрос: как повысить производительность этого контрола, но после долгих поисков и просмотра около 20 тем про дата-грид, нашел что двойная буферизация хоть как то должна помочь, но так и не нашел нормального примера для VB.NET как её включить.. :?:

Ramzes
Скромный человек
Скромный человек
Аватара пользователя
 
Сообщения: 5004
Зарегистрирован: 12.04.2003 (Сб) 11:59
Откуда: Из гробницы :)

Re: И снова Double Buffering и DataGridView

Сообщение Ramzes » 16.02.2009 (Пн) 18:41

  • создаешь класс
  • наследуешся от DataGridView
  • в конструкторе своего класса добавляешь строку
    Код: Выделить всё
    SetStyle(ControlStyles.OptimizedDoubleBuffer, true)

Dry
Новичок
Новичок
Аватара пользователя
 
Сообщения: 26
Зарегистрирован: 08.02.2007 (Чт) 2:03

Re: И снова Double Buffering и DataGridView

Сообщение Dry » 16.02.2009 (Пн) 22:12

Не могу разобраться с этим наследованием никак...
Делаю что то нечто подобное:

Код: Выделить всё
Public Class MoiClass
    Inherits System.Windows.Forms.DataGridView   'вроде так
End Class

Public Class Form1
    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        '----манипуляции с датагрид--------
        Me.Width = 800
        Me.Height = 600

        DataGridView1.Width = 800
        DataGridView1.Height = 600

        DataGridView1.Top = 0
        DataGridView1.Left = 0

        DataGridView1.RowCount = 20
        DataGridView1.ColumnCount = 30

        DataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells
        DataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells
        '----манипуляции с датагрид--------

        SetStyle(ControlStyles.OptimizedDoubleBuffer, True)   'или не сюда, фиг его.. не пойму...
    End Sub
End Class


Как это сделать правильно? :roll:

Вообще вот тут есть хорошее обьяснение этому Double Buffering, но к сожалению на С++, которого я еще больше незнаю. :)
http://www.rsdn.ru/article/gdi/gdiplus2mag.xml#ETIAE

Ramzes
Скромный человек
Скромный человек
Аватара пользователя
 
Сообщения: 5004
Зарегистрирован: 12.04.2003 (Сб) 11:59
Откуда: Из гробницы :)

Re: И снова Double Buffering и DataGridView

Сообщение Ramzes » 17.02.2009 (Вт) 10:41

Код: Выделить всё
Public Class MoiClass
    Inherits System.Windows.Forms.DataGridView   'вроде так

'Сюда надо, ты же хочешь чтоб DataGridView
    SetStyle(ControlStyles.OptimizedDoubleBuffer, True)
End Class

Public Class Form1
    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load


''И начинаешь вместо стандартного DataGridView использовать свой контрол, который ПОЧТИ ничем не отличается от стандартного (кроме SetStyle)
        Dim DataGridView1 = new MoiClass()



        '----манипуляции с датагрид--------
        Me.Width = 800
        Me.Height = 600

        DataGridView1.Width = 800
        DataGridView1.Height = 600

        DataGridView1.Top = 0
        DataGridView1.Left = 0

        DataGridView1.RowCount = 20
        DataGridView1.ColumnCount = 30

        DataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells
        DataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells
        '----манипуляции с датагрид--------
    End Sub
End Class

Dry
Новичок
Новичок
Аватара пользователя
 
Сообщения: 26
Зарегистрирован: 08.02.2007 (Чт) 2:03

Re: И снова Double Buffering и DataGridView

Сообщение Dry » 17.02.2009 (Вт) 23:31

Хм.. вроде все понятно, делаю так как ты сказал, но он подчеркивает SetStyle в моём классе и ругается: "Требуется объявление.". Я собсно поэтому сразу SetStyle туда и не стал писать т.к. подумал что это не правильно. В чем трабл :?:

1Steps
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 505
Зарегистрирован: 20.12.2006 (Ср) 0:50
Откуда: New York

Re: И снова Double Buffering и DataGridView

Сообщение 1Steps » 18.02.2009 (Ср) 1:10

Код: Выделить всё
Public Class MoiClass
    Inherits DataGridView

    Public Sub New()
        Me.SetStyle(ControlStyles.OptimizedDoubleBuffer, True)
    End Sub
End Class
Удалена за ненадобностью.

Ramzes
Скромный человек
Скромный человек
Аватара пользователя
 
Сообщения: 5004
Зарегистрирован: 12.04.2003 (Сб) 11:59
Откуда: Из гробницы :)

Re: И снова Double Buffering и DataGridView

Сообщение Ramzes » 18.02.2009 (Ср) 10:08

Да простите. Set Style надо в конструкторе писать, как показал 1Steps

SBJoker
Начинающий
Начинающий
 
Сообщения: 18
Зарегистрирован: 28.01.2009 (Ср) 14:36

Re: И снова Double Buffering и DataGridView

Сообщение SBJoker » 18.02.2009 (Ср) 11:47

Как удачно, и мне тема пригодилась, спасибо причастным.

Dry
Новичок
Новичок
Аватара пользователя
 
Сообщения: 26
Зарегистрирован: 08.02.2007 (Чт) 2:03

Re: И снова Double Buffering и DataGridView

Сообщение Dry » 19.02.2009 (Чт) 16:43

Спасибо всем, вроде разобрался я с этими классами и наследованием, все получилось что хотел.

Только еще вот такой вопросик, чисто из любопытства:
в ваших примерах получалось так что grid создавался бы програмно:
Код: Выделить всё
Public Class Form1
    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Dim dGrid As New MoiClass()
        Me.Controls.Add(dGrid)   'это что бы отобразить наш новый контрл на форме, ет я уже сам догадался)
    End Sub
End Class

а можно ли сделать так чтобы уже созданый контрол (нарисованный ручками на форме) как то был уже со включенной буферизацией, тоесть сделать всё тоже самое только с готовым контролом, чтобы не писать все его настройки программно?

Ramzes
Скромный человек
Скромный человек
Аватара пользователя
 
Сообщения: 5004
Зарегистрирован: 12.04.2003 (Сб) 11:59
Откуда: Из гробницы :)

Re: И снова Double Buffering и DataGridView

Сообщение Ramzes » 19.02.2009 (Чт) 17:04

а ты на Toolbox внимательно глянь ;)
Обычно после того, как ты создал класс и унаследовал его от Control на toolbox-e он появляется

Dry
Новичок
Новичок
Аватара пользователя
 
Сообщения: 26
Зарегистрирован: 08.02.2007 (Чт) 2:03

Re: И снова Double Buffering и DataGridView

Сообщение Dry » 19.02.2009 (Чт) 20:27

После 20 минут колупания в панели инструментов, а потом еще и в подключаемых COM и т.д.. нифига ненашел. :| Где же мой класс :?: :shock:
P.S. студия 2008 про :?

SBJoker
Начинающий
Начинающий
 
Сообщения: 18
Зарегистрирован: 28.01.2009 (Ср) 14:36

Re: И снова Double Buffering и DataGridView

Сообщение SBJoker » 20.02.2009 (Пт) 11:30

Советую вынести класс в отдельный файл. А потом перетянуть его из дерева проекта на тулбокс. Ваш элемент появится в самом начале в свитке с названием проекта.

Joo
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 762
Зарегистрирован: 14.08.2008 (Чт) 11:55
Откуда: Казахстан

Re: И снова Double Buffering и DataGridView

Сообщение Joo » 20.02.2009 (Пт) 11:57

Обычно после перекомпиляции появляется в самом верху тулбокса, даже если новый контрол писать в файле формы
"Им будет не просто, тем кто полагается на истину авторитета, вместо того чтобы полагаться на авторитет Истины"
Джеральд Месси, Египтолог

Dry
Новичок
Новичок
Аватара пользователя
 
Сообщения: 26
Зарегистрирован: 08.02.2007 (Чт) 2:03

Re: И снова Double Buffering и DataGridView

Сообщение Dry » 21.02.2009 (Сб) 2:13

Пробовал всеми способами, как вы писали, но увы, ничего не появляется. :( (может я чего то не догоняю конечно..)
Если кому то не влом и у него есть 2008 студия попробуйте ради эксперемента, создайте класс-контрл, чтобы он появился на toolbox'е... :roll:

Ramzes
Скромный человек
Скромный человек
Аватара пользователя
 
Сообщения: 5004
Зарегистрирован: 12.04.2003 (Сб) 11:59
Откуда: Из гробницы :)

Re: И снова Double Buffering и DataGridView

Сообщение Ramzes » 21.02.2009 (Сб) 17:49

а модификатор доступа у тебя какой?

Dry
Новичок
Новичок
Аватара пользователя
 
Сообщения: 26
Зарегистрирован: 08.02.2007 (Чт) 2:03

Re: И снова Double Buffering и DataGridView

Сообщение Dry » 21.02.2009 (Сб) 20:42

Public :wink: если я тебя правильно понял)

Да вот он, мой класс, собсно.. ничего замудрого)
Код: Выделить всё
Public Class MoiClass
    Inherits System.Windows.Forms.DataGridView

    Public Sub New()
        Me.SetStyle(ControlStyles.OptimizedDoubleBuffer, True)
        Me.SetStyle(ControlStyles.AllPaintingInWmPaint, True)
        Me.SetStyle(ControlStyles.UserPaint, True)
    End Sub
End Class

Есть еще пару обработчиков событий в классе, но они я думаю ниначто не влияют.
Поидеи, как вы говорите, надо просто создать этот клас, откомпилить приложение и он появится на панели, но нефига.. :)

Dry
Новичок
Новичок
Аватара пользователя
 
Сообщения: 26
Зарегистрирован: 08.02.2007 (Чт) 2:03

Re: И снова Double Buffering и DataGridView

Сообщение Dry » 21.02.2009 (Сб) 21:47

Всё, нашел сам решиние данной странности.
Оказывается в "Сервис - Параметры - Конструктор Windows Forms" есть свойство AutoToolboxPopulate и поумолчанию оно false, и поэтому автоматически свои контролы не добовляются на панель. Если его поставить true (чтобы свойство заработало, необходимо переоткрыть решение), то мой класс приспокойно появляется на панели инструментов после перекомпиляции, в самом верху toolbox'a, как вы и говорили!
Всем спасибо. :D


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 85

    TopList  
cron