DataGrid FAQ
От: Аноним  
Дата: 09.06.04 03:21
Оценка: 534 (20) +2
Статья:
DataGrid FAQ
Автор(ы): SiAVoL, Beker
Дата: 31.10.2004
Рассматриваются вопросы, наиболее часто возникающие при использовании класса System.Windows.Forms.DataGrid из .NET Framework Class Library.




Авторы:
SiAVoL
Beker

Аннотация:
Рассматриваются вопросы, наиболее часто возникающие при использовании класса System.Windows.Forms.DataGrid из .NET Framework Class Library.
Re: DataGrid FAQ
От: Братец Кролик Россия  
Дата: 09.06.04 06:04
Оценка:
Здравствуйте, SiAVoL, Beker, Вы писали:

SB>Статья:



SB>Авторы:

SB> SiAVoL
SB> Beker

SB>Аннотация:


а что про autosize ширины колонок нету?
Re[2]: DataGrid FAQ
От: SiAVoL Россия  
Дата: 09.06.04 07:01
Оценка: 18 (1)
Здравствуйте, Братец Кролик, Вы писали:

БК>а что про autosize ширины колонок нету?


да, этот вопрос мы упустили. Во превых, потому что никто из авторов с такой потребностью не сталкивался. А во вторых (самое главное), фак составлялся по наиболее часто задаваемым на форуме вопросам. А такой вопрос на форуме особо не возникал, по крайней меря я что-то не припоминаю. Но если потребуется, фак можно и расширить со временем
... << Rsdn@Home 1.1.4 beta 1 >>
Re: DataGrid FAQ
От: _FRED_ Черногория
Дата: 09.06.04 08:34
Оценка:
Надеялся в FAQе найти ответ на единственный вопрос, который не даёт мне радостно дружить с DataGridом:
Заметил, что при изменении выделения Paint вызывается для всех видимых строк, что мне показалось излишним.
(по-моему, достаточно двух, а иногда и одной).
Но, может, так оно и надо, или кто расскажет, как с этим бороться?
Help will always be given at Hogwarts to those who ask for it.
Re: DataGrid FAQ
От: SiAVoL Россия  
Дата: 12.08.04 11:12
Оценка:
drag`n`drop колонок по взрослому
Dragging and Dropping DataGrid Columns
... << RSDN@Home 1.1.4 @@release >>
Re: DataGrid FAQ
От: SCS  
Дата: 12.08.04 14:02
Оценка:
Здравствуйте, SiAVoL, Beker, Вы писали:

"из наболевшего":

1. есть ли информация о "многострочном TextBox" стиле
2. правильная обработка MouseWeel для комбо
2. обработка событий нажатия клавиш (особенно Del ),

PS: из опыта испльзования в приложениях
SCS
Re[2]: DataGrid FAQ
От: Peter Fleischer Германия www.informtoools.de
Дата: 12.08.04 14:41
Оценка:
SCS wrote:
> Здравствуйте, SiAVoL, Beker, Вы писали:
>
> "из наболевшего":
>
> 1. есть ли информация о "многострочном TextBox" стиле

Ставь PreferredRowHeigth и Multiline=True если для всех строк, а для одной строки надо менять Heigth для в соответсвующем объекте из "dataGridRows".

> 2. правильная обработка MouseWeel для комбо


А какая там проблема? У меня колесо двигает скроллбар.

> 2. обработка событий нажатия клавиш (особенно Del ),


Событие KeyDown при нажатии del показывает в аргументах "Delete". В чем там проблема?

Peter
Posted via RSDN NNTP Server 1.8
Re[3]: DataGrid FAQ
От: SCS  
Дата: 12.08.04 15:10
Оценка:
Здравствуйте, Peter Fleischer, Вы писали:


PF>для одной строки надо менять Heigth для в соответсвующем объекте из "dataGridRows".

если можно, как добраться до этого этого объекта.
иначе приходится ловить GetMinimumHeight при смене DataSource


>> 2. правильная обработка MouseWeel для комбо

PF>А какая там проблема? У меня колесо двигает скроллбар.
а у меня листает список combobox


>> 3. обработка событий нажатия клавиш (особенно Del ),

PF>Событие KeyDown при нажатии del показывает в аргументах "Delete". В чем там проблема?
необходима подписка на это событие в форме, на которой находится grid и до удаления записей — что то сделать и возможно не доводить дело до реального удаления
SCS
Re[4]: DataGrid FAQ
От: Peter Fleischer Германия www.informtoools.de
Дата: 12.08.04 15:46
Оценка: 4 (1)
SCS wrote:
...
> PF>для одной строки надо менять Heigth для в соответсвующем объекте
> из "dataGridRows". если можно, как добраться до этого этого объекта.
...

  Private Sub SetRowHeight(ByVal dgrid As DataGrid, ByVal row As Integer, ByVal height As Integer)
    Dim dataGridType As Type = dgrid.GetType()
    Dim objDataGridRows As Object = dataGridType.InvokeMember("dataGridRows", _
        Reflection.BindingFlags.Instance Or Reflection.BindingFlags.GetField Or _
        Reflection.BindingFlags.NonPublic, Nothing, dgrid, New Object() {})
    Dim dataGridRows As Array = CType(objDataGridRows, Array)
    Dim objdataGridRow As Object = dataGridRows.GetValue(row)
    Dim dataGridRowType As Type = dataGridType.Assembly.GetType("System.Windows.Forms.DataGridRow")
    dataGridRowType.InvokeMember("Height", Reflection.BindingFlags.Instance Or _
        Reflection.BindingFlags.SetProperty Or Reflection.BindingFlags.Public, Nothing, _
        objdataGridRow, New Object() {height})
  End Sub


...
>>> 3. обработка событий нажатия клавиш (особенно Del ),
> PF>Событие KeyDown при нажатии del показывает в аргументах "Delete".
> В чем там проблема? необходима подписка на это событие в форме, на
> которой находится grid и до удаления записей — что то сделать и
> возможно не доводить дело до реального удаления

Если в качестве DataSource используется DataTable, то строка удаляется только из DataView. В DataSource она остается со статусом "deleted". Оттуда можешь обратно исвлечь.

Можно переписать ProcessCmdKey и возвращать False.

Peter
Posted via RSDN NNTP Server 1.8
Re[5]: DataGrid FAQ
От: SCS  
Дата: 12.08.04 16:11
Оценка:
Здравствуйте, Peter Fleischer, Вы писали:

PF>...1

>> PF>для одной строки надо менять Heigth для в соответсвующем объекте
>> из "dataGridRows". если можно, как добраться до этого этого объекта.
PF>...
спасибо. (однако использование reflection настораживает)
эта "недокументированная" [nonpublic и даже не protected] возможность будет работать во всех версиях FW ?

2. так что "крутить" по MouseWeel: Combo или Grid ? (2 списка, фокус на Combo)
нужно: крутить Combo — если его состояние DroppedDown=true; и Grid в противном случае
причина: если Combo, имеющий фокус, уехал за границы видимости грида, не изменял свои значения по weel

PF>...3

PF>Если в качестве DataSource используется DataTable, то строка удаляется только из DataView. В DataSource она остается со статусом "deleted". Оттуда можешь обратно исвлечь.
проблема — чтобы "туда" запись попадала только с "разрешения" (см.ниже)

PF>Можно переписать ProcessCmdKey и возвращать False.

именно так и приходися делать: определять своё событие для грида. и анализировать возврат из внешненго обработчика, чтобы вернуть true/false
SCS
Re[6]: DataGrid FAQ
От: SCS  
Дата: 12.08.04 16:56
Оценка:
Здравствуйте, SCS, Вы писали:

SCS>2. так что "крутить" по MouseWeel: Combo или Grid ? (2 списка, фокус на Combo)

SCS>нужно: крутить Combo — если его состояние DroppedDown=true; и Grid в противном случае
SCS>причина: если Combo, имеющий фокус, уехал за границы видимости грида, не изменял свои значения по weel

для этого использую свой ComboBox
public    class    DataGridComboBox : ComboBox
{ public DataGridComboBox(): base(){}

  private const int WM_MOUSEWHEEL=0x020A,
                    MK_SHIFT     =0x0004;

  protected override void WndProc(ref Message m)
  { switch(m.Msg)
    { case WM_MOUSEWHEEL:
        if(this.DropDownStyle==ComboBoxStyle.DropDownList)
        { // небольшой финт, а сколько неприятностей исчезает ...
          m.WParam=(IntPtr)((int)(m.WParam) | MK_SHIFT);                        
        }
      break;

      default: break;
    }
    base.WndProc(ref m); 
  }
}
SCS
Re[6]: DataGrid FAQ
От: Peter Fleischer Германия www.informtoools.de
Дата: 13.08.04 19:47
Оценка:
SCS wrote:
> Здравствуйте, Peter Fleischer, Вы писали:
>
> PF>...1
>>> PF>для одной строки надо менять Heigth для в соответсвующем объекте
>>> из "dataGridRows". если можно, как добраться до этого этого объекта.
> PF>...
> спасибо. (однако использование reflection настораживает)

Почему?

> эта "недокументированная" [nonpublic и даже не protected] возможность

> будет работать во всех версиях FW ?

Возможно, что необходимость отпадает для новых контроль в будующих версиях.

> 2. так что "крутить" по MouseWeel: Combo или Grid ? (2 списка, фокус

> на Combo) нужно: крутить Combo — если его состояние DroppedDown=true;
> и Grid в противном случае причина: если Combo, имеющий фокус, уехал
> за границы видимости грида, не изменял свои значения по weel

Я проверил у себя. Действительно MouseWeel у меня неверно работает, когда Cell, имеющий фокус, уехал за границы видимости грида. Это у меня независимо от Combo.

Peter
Posted via RSDN NNTP Server 1.8
Re: DataGrid FAQ
От: D.Kolomiyets  
Дата: 14.08.04 16:00
Оценка:
Есть маленький вопросик к знатокам DataGrid...
В наследнике DataGridTextBoxColumn замещаю метод Paint, чтобы отрисовывать некоторые строки жирным шрифтом. При этом пользуюсь методом DrawString приходящего в Paint объекта Graphics. Проблема такая — не могу добиться, чтобы DrawString рисовал строку, учитывя HorizontalAlignment колонки. Пробовал играться с параметром StringFormat метода DrawString, но ничего из этого путного не вышло. Подозреваю, что можно ручками установить Rectangle, прижимая его к правому краю, в который пишу строку, но, как мне кажется, это не метод.

Заранее благодарен.
... << Rsdn@Home 1.1.4 beta 1 >>
Re[2]: DataGrid FAQ
От: Аноним  
Дата: 14.08.04 18:40
Оценка:
Здравствуйте, D.Kolomiyets, Вы писали:

DK>Пробовал играться с параметром StringFormat метода DrawString...


private void PaintText(Graphics g, Rectangle TextBounds, string Text, Brush BackBrush, Brush ForeBrush, bool AlignToRight)
{ Rectangle Rect=TextBounds;
  using(StringFormat Format=new StringFormat())
  {  if(AlignToRight) Format.FormatFlags=StringFormatFlags.DirectionRightToLeft;
      switch(this.Alignment)
      { case HorizontalAlignment.Left:
          Format.Alignment=StringAlignment.Near;
          break;
        case HorizontalAlignment.Right:
          Format.Alignment=StringAlignment.Far;
          break;
        case HorizontalAlignment.Center:
          Format.Alignment=StringAlignment.Center;
          break;
      }
      Format.FormatFlags=Format.FormatFlags | StringFormatFlags.NoWrap;
      g.FillRectangle(BackBrush, Rect);
      Rect.Offset(0, 2);
      Rect.Height -= 2;
      g.DrawString(Text, this.DataGridTableStyle.DataGrid.Font, ForeBrush, Rect, Format);
  }
}
Re[2]: DataGrid FAQ
От: Peter Fleischer Германия www.informtoools.de
Дата: 15.08.04 06:27
Оценка:
D.Kolomiyets wrote:
> Есть маленький вопросик к знатокам DataGrid...
> В наследнике DataGridTextBoxColumn замещаю метод Paint, чтобы
> отрисовывать некоторые строки жирным шрифтом. При этом пользуюсь
> методом DrawString приходящего в Paint объекта Graphics. Проблема
> такая — не могу добиться, чтобы DrawString рисовал строку, учитывя
> HorizontalAlignment колонки. Пробовал играться с параметром
> StringFormat метода DrawString, но ничего из этого путного не вышло.
> Подозреваю, что можно ручками установить Rectangle, прижимая его к
> правому краю, в который пишу строку, но, как мне кажется, это не
> метод.
>
> Заранее благодарен.

Другой топорный метод

  Public Class myDataGrid10TextBoxColumn
    Inherits DataGridTextBoxColumn

    Private fnt As Font

    Protected Overloads Overrides Sub Paint(ByVal g As Graphics, _
          ByVal bounds As Rectangle, ByVal source As CurrencyManager, _
          ByVal rowNum As Integer, ByVal backBrush As Brush, _
          ByVal foreBrush As Brush, ByVal alignToRight As Boolean)
      If rowNum = 5 Then
        fnt = Me.DataGridTableStyle.DataGrid.Font
        Me.DataGridTableStyle.DataGrid.Font = New Font(fnt, FontStyle.Bold)
        MyBase.Paint(g, bounds, source, rowNum, backBrush, foreBrush, alignToRight)
        Me.DataGridTableStyle.DataGrid.Font = fnt
      Else
        MyBase.Paint(g, bounds, source, rowNum, backBrush, foreBrush, alignToRight)
      End If
    End Sub
  End Class


Peter
Posted via RSDN NNTP Server 1.8
Re[3]: DataGrid FAQ
От: SkySandy  
Дата: 02.09.04 08:37
Оценка:
PF> Public Class myDataGrid10TextBoxColumn
PF> Inherits DataGridTextBoxColumn

PF> Private fnt As Font


PF> Protected Overloads Overrides Sub Paint(ByVal g As Graphics, _

PF> ByVal bounds As Rectangle, ByVal source As CurrencyManager, _
PF> ByVal rowNum As Integer, ByVal backBrush As Brush, _
PF> ByVal foreBrush As Brush, ByVal alignToRight As Boolean)
PF> If rowNum = 5 Then
PF> fnt = Me.DataGridTableStyle.DataGrid.Font
PF> Me.DataGridTableStyle.DataGrid.Font = New Font(fnt, FontStyle.Bold)
PF> MyBase.Paint(g, bounds, source, rowNum, backBrush, foreBrush, alignToRight)
PF> Me.DataGridTableStyle.DataGrid.Font = fnt
PF> Else
PF> MyBase.Paint(g, bounds, source, rowNum, backBrush, foreBrush, alignToRight)
PF> End If
PF> End Sub
PF> End Class

Работать не будет, из-за входа в безконечный цикл после:
Me.DataGridTableStyle.DataGrid.Font = fnt
... << RSDN@Home 1.1.3 stable >>
Re[3]: DataGrid FAQ
От: shrek  
Дата: 08.11.04 13:50
Оценка:
PF>Ставь PreferredRowHeigth и Multiline=True если для всех строк, а для одной строки надо менять Heigth для в соответсвующем объекте из "dataGridRows".


Каким образом поставить Multiline???
Я такого свойства с помощью рефлекшена найти не смог.
Re: DataGrid FAQ
От: Cib Украина http://www.cibsoft.com
Дата: 29.04.05 09:25
Оценка:
Здравствуйте, SiAVoL, Beker, Вы писали:

Возникла проблема с исходниками идущими к статье.
Нехватает проекта DataGridMoovableColumns.
Да и хотелось бы иметь реализацию класса DataGridTextBoxColumn, а то как-то
не хорошо получается, упоминание в статье есть а в примерах нету.
Возможно реализация класса находится в недостающем проекте.

P. S. За ранее прошу прощение если что-то не досмотрел.
Re[2]: DataGrid FAQ
От: SiAVoL Россия  
Дата: 03.05.05 04:40
Оценка:
Здравствуйте, Cib, Вы писали:

Cib>Возникла проблема с исходниками идущими к статье.

возможно недосмотрели, в общем выложу еще раз

Cib>Нехватает проекта DataGridMoovableColumns.

здесь

Cib>Да и хотелось бы иметь реализацию класса DataGridTextBoxColumn, а то как-то

Cib>не хорошо получается, упоминание в статье есть а в примерах нету.
Папка DataGridFAQ в коде к проекту, файлы DataGridColorTextBoxColumnStyle.cs и так далее, не оно?
... << RSDN@Home 1.1.4 beta 6a rev. 438>>
Re[3]: DataGrid FAQ
От: Аноним  
Дата: 11.05.05 17:15
Оценка:
а есть возможность научить грид обрабатывать doubleclick на данных в нём как на самом гриде?
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.