Здравствуйте, Братец Кролик, Вы писали:
БК>а что про autosize ширины колонок нету?
да, этот вопрос мы упустили. Во превых, потому что никто из авторов с такой потребностью не сталкивался. А во вторых (самое главное), фак составлялся по наиболее часто задаваемым на форуме вопросам. А такой вопрос на форуме особо не возникал, по крайней меря я что-то не припоминаю. Но если потребуется, фак можно и расширить со временем
Надеялся в FAQе найти ответ на единственный вопрос, который не даёт мне радостно дружить с DataGridом:
Заметил, что при изменении выделения Paint вызывается для всех видимых строк, что мне показалось излишним.
(по-моему, достаточно двух, а иногда и одной).
Но, может, так оно и надо, или кто расскажет, как с этим бороться?
Help will always be given at Hogwarts to those who ask for it.
SCS wrote: > Здравствуйте, SiAVoL, Beker, Вы писали: > > "из наболевшего": > > 1. есть ли информация о "многострочном TextBox" стиле
Ставь PreferredRowHeigth и Multiline=True если для всех строк, а для одной строки надо менять Heigth для в соответсвующем объекте из "dataGridRows".
> 2. правильная обработка MouseWeel для комбо
А какая там проблема? У меня колесо двигает скроллбар.
> 2. обработка событий нажатия клавиш (особенно Del ),
Событие KeyDown при нажатии del показывает в аргументах "Delete". В чем там проблема?
PF>для одной строки надо менять Heigth для в соответсвующем объекте из "dataGridRows".
если можно, как добраться до этого этого объекта.
иначе приходится ловить GetMinimumHeight при смене DataSource
>> 2. правильная обработка MouseWeel для комбо PF>А какая там проблема? У меня колесо двигает скроллбар.
а у меня листает список combobox
>> 3. обработка событий нажатия клавиш (особенно Del ), PF>Событие KeyDown при нажатии del показывает в аргументах "Delete". В чем там проблема?
необходима подписка на это событие в форме, на которой находится grid и до удаления записей — что то сделать и возможно не доводить дело до реального удаления
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 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, Вы писали:
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 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.
Есть маленький вопросик к знатокам 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...
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
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
PF>Ставь PreferredRowHeigth и Multiline=True если для всех строк, а для одной строки надо менять Heigth для в соответсвующем объекте из "dataGridRows".
Каким образом поставить Multiline???
Я такого свойства с помощью рефлекшена найти не смог.
Возникла проблема с исходниками идущими к статье.
Нехватает проекта DataGridMoovableColumns.
Да и хотелось бы иметь реализацию класса DataGridTextBoxColumn, а то как-то
не хорошо получается, упоминание в статье есть а в примерах нету.
Возможно реализация класса находится в недостающем проекте.
P. S. За ранее прошу прощение если что-то не досмотрел.
Здравствуйте, 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 на данных в нём как на самом гриде?