Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 |

 

  Вопрос: Изменение ширины DGV Добавлено: 16.03.09 13:54  

Автор вопроса:  aleha
У меня в DGV падают разные по ширине строковые данные, а полоса прокрутки периодически мешает, когда надо просмотреть всю строку целиком. Делать DGV изначально большим по ширине не очень хочется, пустые области мозолят глаз.
Решил циклом пройтись по всем видимым колонкам, посчитать их суммарню ширину и после вывода данных поменять параметр size на новый, но всё равно получается криво, то он чуть больше то он чуть меньше отображенной области, не могу никак поймать эти пиксели, в чём может быть дело? Есть какая-нить возможность сделать ширину DGV такой же как все видимые колонки?
Параметр autosize выдает пустое поле с правого боку, видимо из-за скрытой колонки и это не подходит.

Ответить

  Ответы Всего ответов: 6  

Номер ответа: 1
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #1 Добавлено: 16.03.09 14:27
то он чуть больше то он чуть меньше отображенной области, не могу никак поймать эти пиксели, в чём может быть дело?

Может ты просто не учитываешь ширину вертикальной полосы прокрутки?

Ответить

Номер ответа: 2
Автор ответа:
 aleha



Вопросов: 8
Ответов: 19
 Профиль | | #2 Добавлено: 16.03.09 15:00
SystemInformation.VerticalScrollBarWidth - дефолтный размер я получил, а как теперь узнать отображается ли он или нет?

Ответить

Номер ответа: 3
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #3 Добавлено: 16.03.09 15:17
точно не подскажу, так как не делал подобного, но как вариант можешь попробовать сделать следущее:
У DataGridView есть protected свойство VerticalScrollBar, а у него, в свою очередь, есть свойство Visible и событие VisibleChanged.. Насколько я могу судить это именно то, что ты ищещь. Но чтобы получить доступ к этому свойству тебе придется создать свой контрол и наследовать его DataGridView.

Ответить

Номер ответа: 4
Автор ответа:
 aleha



Вопросов: 8
Ответов: 19
 Профиль | | #4 Добавлено: 16.03.09 16:28
да нашёл я его, жаль что защищенный.... я не настолько крут в программинге, поэтому наследование меня ставит в тупик, вобщем попробую решить эту проблему механическим путём.

Ответить

Номер ответа: 5
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #5 Добавлено: 16.03.09 18:01
я не настолько крут в программинге, поэтому наследование меня ставит в тупик

да фигня это наследование.. не так страшен черт как его малюют.. вот смотри.
1. Определяем аргументы события и делегата
ScrollBarEventArgs.cs
  1.  
  2. using System;
  3. using System.Windows.Forms;
  4.  
  5. namespace WindowsFormsApplication1
  6. {
  7.     public delegate void ScrollBarHandler(object sender, ScrollBarEventArgs e);
  8.  
  9.     public class ScrollBarEventArgs : EventArgs
  10.     {
  11.         public ScrollBarEventArgs(ScrollBar scrollBar)
  12.         {
  13.             if (scrollBar == null) throw new ArgumentNullException();
  14.             this.ScrollBar = scrollBar;
  15.         }
  16.  
  17.         private ScrollBar _ScrollBar;
  18.         public ScrollBar ScrollBar
  19.         {
  20.             get { return _ScrollBar; }
  21.             private set
  22.             {
  23.                 _ScrollBar = value;
  24.             }
  25.         }
  26.  
  27.         public bool ScrollBarVisible
  28.         {
  29.             get { return this.ScrollBar.Visible; }
  30.         }
  31.     }
  32. }



2. Создаем наш новый контрол и наследуем его от DataGridView, определяем в нем событие и инициируем его в нужный момент
MyDataGridView.cs
  1.  
  2. using System;
  3. using System.Windows.Forms;
  4.  
  5. namespace WindowsFormsApplication1
  6. {
  7.     public class MyDataGridView : DataGridView
  8.     {
  9.         public event ScrollBarHandler VScrollBarVisibleChanged;
  10.  
  11.         public MyDataGridView()
  12.         {
  13.             VerticalScrollBar.VisibleChanged += new EventHandler(VerticalScrollBar_VisibleChanged);
  14.         }
  15.  
  16.         private void VerticalScrollBar_VisibleChanged(object sender, EventArgs e)
  17.         {
  18.             OnVScrollBarVisibleChanged(new ScrollBarEventArgs(VerticalScrollBar));
  19.         }
  20.         #region OnVScrollBarVisibleChanged
  21.         /// <summary>
  22.         /// Triggers the VScrollBarVisibleChanged event.
  23.         /// </summary>
  24.         public virtual void OnVScrollBarVisibleChanged(ScrollBarEventArgs e)
  25.         {
  26.             if (VScrollBarVisibleChanged != null)
  27.                 VScrollBarVisibleChanged(this, e);
  28.         }
  29.         #endregion
  30.     }
  31. }



В результате после компиляции у тебя на закладе ToolBox появится новый контрол MyDataGridView (в виде шестеренки) у которого будет свойство VScrollBarVisibleChanged.

3. Ну и осталось испытать наше творение..
Form1.cs
  1.  
  2. using System;
  3. using System.Data;
  4. using System.Windows.Forms;
  5.  
  6. namespace WindowsFormsApplication1
  7. {
  8.     public partial class Form1 : Form
  9.     {
  10.         public Form1()
  11.         {
  12.             InitializeComponent();
  13.             myDataGridView1.VScrollBarVisibleChanged += new ScrollBarHandler(myDataGridView1_VScrollBarVisibleChanged);
  14.         }
  15.  
  16.         private void button1_Click(object sender, EventArgs e)
  17.         {
  18.             DataTable table = new DataTable();
  19.             table.Columns.Add("Id", typeof(int));
  20.             table.Columns.Add("Name", typeof(string));
  21.             for (int i = 0; i < 25; i++)
  22.                 table.Rows.Add(new object[] { i, "Name - " + i });
  23.             myDataGridView1.DataSource = table;
  24.         }
  25.  
  26.         void myDataGridView1_VScrollBarVisibleChanged(object sender, ScrollBarEventArgs e)
  27.         {
  28.             string message = "VScrollBar is " + ((e.ScrollBarVisible) ? "visible" : "not visible");
  29.             Console.WriteLine(message);
  30.         }
  31.     }
  32. }


Если не сможешь перевести на VB.NET пиши.. я думаю с переводом парни с форума помогут.

Ответить

Номер ответа: 6
Автор ответа:
 aleha



Вопросов: 8
Ответов: 19
 Профиль | | #6 Добавлено: 16.03.09 21:26
с переводом проблем нету, в дотНете в принципе всё похоже. Здесь дело не просто скопировать и вставить, а ещё и понять что я делаю. Я конечно всё прочел, понял что я почти ничего не понял, но буду разбираться. Просто у меня длинный список косяков которые надо подправить или исправить, и при этом у меня есть неприятное свойство ослиной упёртости, что когда что-то, даже какая-то мелочь не получается, то буду её хоть весь день решать)) Поэтому отложу на более поздний этап. За пример спасибо.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам