На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
> Наследники DataGridColumnStyle
    Кто нибудь разрабатывал свои стили колонок для DataGrid (от DataGridColumnStyle)?

    Я попытался сделать это для DateTime-колонки (и некоторых других), но возникла одна проблема: метод Commit() вызывается ДВА раза, для старой колонки (так и должно быть), а вслед за этим для новой колонки (это что, очередная фича от MS?), а из-за этого портится её содержимое. Я нашёл обходной путь, но он плохой, может кто знает, как сделать лучше?

    ExpandedWrap disabled
      <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>
    Сообщение отредактировано: andrey -
      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?

        Вау, я нашёл решение!
        ExpandedWrap disabled
          <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>


        Блин, и всего то две строчки, а сколько было проблем и мата юзеров
          Чёрт, это код для ComboBoxColumn  а не DateTimePickerColumn.
          cbx - это ComboBox находящийся в ячейке, для DTPColumn должгно быть аналогично
            Ну как, вышло?
              Так я же написал - да!

              Если нужны сорсы пишите - у меня есть ComboBoxColumn (DB lookup combo), LabelColumn (взамен TextBoxColumn c ReadOnly=true, выглядит цивильнее), LookupLableColumn (тот же LabelColumn но с DB Lookup), MultibindComboBoxColumn (очень сложная и полезная штука, позволяет делать Lookup по нескольким таблицам. Таблица выбирается в зависимости от любой другой колонки. Я использую эту штуку для поиска)
                И ещё PathResolverColumn - для таблиц с иерархической структурой (АКА дерево)

                типа
                ExpandedWrap disabled
                  <br>CREATE TABLE Tree(<br>UID int PRIMARY KEY, -- ключ<br>Parent int FOREIGN KEY REFERENCES Tree(UID), -- ссылка на родительскую запись<br>-- .... другие колонки<br>)<br>
                  Пришли плиз на technos@takas.lt буду очень благодарен.
                    По просьбе трудящихся

                    http://www.ve-2-00.ru/dev/cols.rar (7K)
                    Читайте test.txt внутри

                    Этот код есть as is - никакие претензии не принимаются. Улучшайте как хотите, при желании пишите об улучшениях мне.
                    Сообщение отредактировано: andrey -
                      Огромное спасибо!
                      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                      0 пользователей:


                      Рейтинг@Mail.ru
                      [ Script execution time: 0,0289 ]   [ 16 queries used ]   [ Generated: 27.04.24, 05:50 GMT ]