Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.118.126.241] |
|
Сообщ.
#1
,
|
|
|
Кто нибудь разрабатывал свои стили колонок для DataGrid (от DataGridColumnStyle)?
Я попытался сделать это для DateTime-колонки (и некоторых других), но возникла одна проблема: метод Commit() вызывается ДВА раза, для старой колонки (так и должно быть), а вслед за этим для новой колонки (это что, очередная фича от MS?), а из-за этого портится её содержимое. Я нашёл обходной путь, но он плохой, может кто знает, как сделать лучше? <br> public class DateTimeColumn:DataGridColumnStyle{<br> internal DateTimePicker dtp;<br> public DateTimeColumn(){<br> dtp=new DateTimePicker();<br> fmt="d/m/yyyy";<br> dtp.CustomFormat=fmt;<br> WidthChanged+=new EventHandler(OnChangeWidth);<br> }<br><br> protected void OnChangeWidth(object sender, EventArgs args){<br> dtp.Width=this.Width;<br> }<br><br> internal int erow=-1;<br> protected override void Abort(int rowNum)<br> {<br> dtp.Visible=false;<br> }<br><br> internal string fmt;<br> public string Format<br> {<br> get{return fmt;}<br> set{dtp.CustomFormat=fmt=value;}<br> }<br><br> protected override bool Commit(System.Windows.Forms.CurrencyManager dataSource, int rowNum)<br> {<br> dtp.Visible=false;<br><br>///Эту строку мы редактируем?<br> if(rowNum==erow)<br>///Да, это то что надо - изменяем<br> SetColumnValueAtRow(dataSource,rowNum,dtp.Value);<br> else<br>///Нет - это повторный вызов Commit, забиваем<br> return false;<br> return true;<br> }<br><br> protected override void Edit(System.Windows.Forms.CurrencyManager source, int rowNum, System.Drawing.Rectangle bounds, bool readOnly, string instantText, bool cellIsVisible)<br> {<br> dtp.Parent=DataGridTableStyle.DataGrid;<br> dtp.Location=bounds.Location;<br> dtp.Size=bounds.Size;<br> dtp.Visible=true;<br> dtp.Enabled=!readOnly;<br> object o=GetColumnValueAtRow(source,rowNum);<br> if(o is DateTime)<br> dtp.Value=(DateTime)o;<br> else<br> dtp.Value=DateTime.Now;<br><br>/// Запомним строку, для которой открывается редактирование<br> erow=rowNum;<br> }<br><br> protected override int GetMinimumHeight()<br> {<br> return dtp.PreferredHeight;<br> }<br><br> protected override int GetPreferredHeight(System.Drawing.Graphics g, object value)<br> {<br> return dtp.PreferredHeight;<br> }<br><br> protected override System.Drawing.Size GetPreferredSize(System.Drawing.Graphics g, object value)<br> {<br> return new System.Drawing.Size(100,dtp.PreferredHeight);<br> }<br><br> protected override void Paint(System.Drawing.Graphics g, System.Drawing.Rectangle bounds, System.Windows.Forms.CurrencyManager source, int rowNum, System.Drawing.Brush backBrush, System.Drawing.Brush foreBrush, bool alignToRight)<br> {<br> g.FillRectangle(backBrush,bounds);<br> object o=GetColumnValueAtRow(source,rowNum);<br> StringFormat sf=new StringFormat();<br> sf.LineAlignment=StringAlignment.Center;<br> if(o is DateTime)<br> g.DrawString(((DateTime)o).ToString(fmt),DataGrid.DefaultFont,foreBrush,bounds,sf);<br> else<br> g.DrawString(NullText,DataGrid.DefaultFont,foreBrush,bounds,sf);<br> }<br><br> protected override void Paint(System.Drawing.Graphics g, System.Drawing.Rectangle bounds, System.Windows.Forms.CurrencyManager source, int rowNum, bool alignToRight)<br> {<br> Paint(g,bounds,source,rowNum,Brushes.White,Brushes.Black,false);<br> }<br><br> protected override void Paint(System.Drawing.Graphics g, System.Drawing.Rectangle bounds, System.Windows.Forms.CurrencyManager source, int rowNum)<br> {<br> Paint(g,bounds,source,rowNum,Brushes.White,Brushes.Black,false);<br> }<br><br> protected override void ConcedeFocus()<br> {<br> dtp.Visible=false;<br> dtp.Parent=null;<br> }<br> }<br> |
Сообщ.
#2
,
|
|
|
It's not a bug, it's by design!
Декомпильнул я DataGridTextBoxColumnStyle, а там то же самое - запоминается номер редактируемой строки. А ещё один баг с DataGridColumnStyle: в том же DateTimeColumnStyle, при добавлении новой записи в DataGrid (запись в строку со *), новая строка не создаётся, пока не будет аполнено любая колонка с типом DataGridTextBoxColumn или ..BoolColumn (т.е. M$ типы колонок). А это большая задница и страшный глюк. В DataGridTextBoxColumn вызывается метод DataGridTableStyle.DataGrid.ColumnStartedEditing(Rectangle), который, по -видимому и управляет новой записью (типа её начали редактировать). Вся проблема в том что этот метод protected internal, т.е. не доступен вне System.Windows.Forms. Кто нибудь знает как избеать такого кривого Designa? |
Сообщ.
#3
,
|
|
|
Вау, я нашёл решение!
<br> public ComboBoxColumn()<br> {<br>....<br> cbx.SelectionChangeCommitted+=new EventHandler(cbx_SelectionChangeCommitted);<br> }<br>....<br> private void cbx_SelectionChangeCommitted(object sender, EventArgs e) {<br> base.ColumnStartedEditing(cbx);<br> }<br> Блин, и всего то две строчки, а сколько было проблем и мата юзеров |
Сообщ.
#4
,
|
|
|
Чёрт, это код для ComboBoxColumn а не DateTimePickerColumn.
cbx - это ComboBox находящийся в ячейке, для DTPColumn должгно быть аналогично |
Сообщ.
#5
,
|
|
|
Ну как, вышло?
|
Сообщ.
#6
,
|
|
|
Так я же написал - да!
Если нужны сорсы пишите - у меня есть ComboBoxColumn (DB lookup combo), LabelColumn (взамен TextBoxColumn c ReadOnly=true, выглядит цивильнее), LookupLableColumn (тот же LabelColumn но с DB Lookup), MultibindComboBoxColumn (очень сложная и полезная штука, позволяет делать Lookup по нескольким таблицам. Таблица выбирается в зависимости от любой другой колонки. Я использую эту штуку для поиска) |
Сообщ.
#7
,
|
|
|
И ещё PathResolverColumn - для таблиц с иерархической структурой (АКА дерево)
типа <br>CREATE TABLE Tree(<br>UID int PRIMARY KEY, -- ключ<br>Parent int FOREIGN KEY REFERENCES Tree(UID), -- ссылка на родительскую запись<br>-- .... другие колонки<br>)<br> |
Сообщ.
#8
,
|
|
|
Пришли плиз на technos@takas.lt буду очень благодарен.
|
Сообщ.
#9
,
|
|
|
По просьбе трудящихся
http://www.ve-2-00.ru/dev/cols.rar (7K) Читайте test.txt внутри Этот код есть as is - никакие претензии не принимаются. Улучшайте как хотите, при желании пишите об улучшениях мне. |
Сообщ.
#10
,
|
|
|
Огромное спасибо!
|