Модераторы: gambit, Partizan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> DataGridView, формат DateTime в колонке 
V
    Опции темы
Aline
Дата 16.11.2007, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 470
Регистрация: 22.7.2005
Где: Таруса

Репутация: нет
Всего: нет



Привет всем!

У меня есть таблица, в ней первая колонка  - время в формате "HH:mm:ss". Я установила в свойстве DefaultCellStyle свойство Format = T и установила значение Null value = 00:00:00.

При редактировании ячеек в этой колонке, получается, что я могу набирать совершенно любые символы с клавиатуры, единственное что при нажатии на Enter выскочит ошибка, типа данные неправильного типа.

Так вот вопрос: можно ли как то сделать, чтобы ячейка была типа как MaskEdit? Т.е. задал формат и по маске можно ввести только допустимые символу? Как это сделать?

Я работала с Borland, там таких проблем не было. Там я писала такой обработчик:


Код

 void __fastcall TDiscretForm::StringGrid3GetEditMask(TObject *Sender, int ACol,
      int ARow, AnsiString &Value)
{
  if (ACol == 0) Value =  "!90:00:00.0000>;1;_";
  if (ACol == 1) Value = "0";
}



Можно ли здесь сделать подобное? 
PM MAIL   Вверх
Experimenter
Дата 19.11.2007, 07:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 430
Регистрация: 8.5.2007
Где: Уфа

Репутация: 1
Всего: 17



Написал сначала, не подумавши. Видимо то, что я предложил, уже реализовано у тебя.
А возможно ли такое? Там есть события CellBeginEdit и CellEndEdit, получается, что в момент, когда пользователь редактирует ячейку, она недоступна для перехвата вводимых данных?

Это сообщение отредактировал(а) Experimenter - 19.11.2007, 08:32


--------------------
public Zlo FromTwoEvilsChooseSmaller(Zlo zlo1, Zlo zlo2){
    if(zlo1 < zlo2) return zlo1;
    else if(zlo1 > zlo2) return zlo2;
    else throw new Exception("Kill yourself by the wall"); }
PM WWW ICQ   Вверх
Aline
Дата 19.11.2007, 08:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 470
Регистрация: 22.7.2005
Где: Таруса

Репутация: нет
Всего: нет



Спасибо, попробую smile
PM MAIL   Вверх
Aline
Дата 20.11.2007, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 470
Регистрация: 22.7.2005
Где: Таруса

Репутация: нет
Всего: нет



Experimenter, по-моему ты мне давал до этого ссылку в RSDN, очень дельная статья там. Скачала исходники. В них вроде всё работает. Попробовала под себя переделать не получается :-(
Задача в том, чтобы встроить в ячейку таблицы MaskEdit

Это сообщение отредактировал(а) Aline - 20.11.2007, 11:40
PM MAIL   Вверх
Experimenter
Дата 20.11.2007, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 430
Регистрация: 8.5.2007
Где: Уфа

Репутация: 1
Всего: 17



Aline, если и давал, то уже не помню. В любом случае здесь же, на RSDN подробно описано. Раздел "Размещение в ячейке пользовательского UserControl". Если мы об одном и том же, тогда давай свой код, сравним.


--------------------
public Zlo FromTwoEvilsChooseSmaller(Zlo zlo1, Zlo zlo2){
    if(zlo1 < zlo2) return zlo1;
    else if(zlo1 > zlo2) return zlo2;
    else throw new Exception("Kill yourself by the wall"); }
PM WWW ICQ   Вверх
Aline
Дата 20.11.2007, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 470
Регистрация: 22.7.2005
Где: Таруса

Репутация: нет
Всего: нет



Да, об одном и том же. Только у меня почему то не получается :-(

Код в процессе очередной переработки, поэтому сейчас я его выложить не могу.

В программе-тесте компонента у меня появлялось поле  для ввода значения в формате времени ("00:00:00"), значение я вводила, а потом после нажатия на Enter в поле все равно стояла строка по умолчанию "00:00:00"


PM MAIL   Вверх
Aline
Дата 20.11.2007, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 470
Регистрация: 22.7.2005
Где: Таруса

Репутация: нет
Всего: нет



Не смогла загрузить файл, поэтому прилагаю код:

Код

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;

namespace TimeEditControl
{
    #region EditControl
    public partial class TimeEdit : UserControl, IDataGridViewEditingControl
    {
        private int _row;
        private DataGridView _dgv;
        private bool _valueChanged = false;
        private TimeCtr _psForEditSession;

        public TimeEdit()
        {
            InitializeComponent();
        }

        private void _mskEdit_Validating(object sender, CancelEventArgs e)
        {
            if (this._mskEdit.MaskCompleted)
                this.OnValueChanged();
            e.Cancel = !this._mskEdit.MaskCompleted;
        }

        private void OnValueChanged()
        {
            this._valueChanged = true;            
            this._psForEditSession.Number = (this._mskEdit.Text == null ? string.Empty : this._mskEdit.Text);            
            DataGridView dgv = this.EditingControlDataGridView;
            if (dgv != null)
                dgv.NotifyCurrentCellDirty(true);
        }

        public void SetupControls(TimeCtr ps)
        {
            this._psForEditSession = new TimeCtr();
            this._mskEdit.Text = ps.Number;            
        }

        #region IDataGridViewEditingControl Members

        public void ApplyCellStyleToEditingControl(DataGridViewCellStyle dataGridViewCellStyle)
        {
            this._mskEdit.Font = dataGridViewCellStyle.Font;
            this.MinimumSize = this.Size;
        }

        public DataGridView EditingControlDataGridView
        {
            get
            {
                return this._dgv;
            }
            set
            {
                this._dgv = value;
            }
        }

        public object EditingControlFormattedValue
        {
            get
            {
                return this._psForEditSession;
            }
            set
            {
                //nothing to do...
            }
        }

        public int EditingControlRowIndex
        {
            get
            {
                return this._row;
            }
            set
            {
                this._row = value;
            }
        }

        public bool EditingControlValueChanged
        {
            get
            {
                return this._valueChanged;
            }
            set
            {
                this._valueChanged = value;
            }
        }

        public bool EditingControlWantsInputKey(Keys keyData, bool dataGridViewWantsInputKey)
        {
            switch (keyData & Keys.KeyCode)
            {
                case Keys.Down:
                case Keys.Right:
                case Keys.Left:
                case Keys.Up:
                case Keys.Home:
                case Keys.End:
                    return true;
                default:
                    return false;
            }

        }

        public Cursor EditingPanelCursor
        {
            get { return base.Cursor; }
        }

        public object GetEditingControlFormattedValue(DataGridViewDataErrorContexts context)
        {
            return this.EditingControlFormattedValue;
        }

        public void PrepareEditingControlForEdit(bool selectAll) { }

        public bool RepositionEditingControlOnValueChange { get { return false; } }

        #endregion
    }
    #endregion

    #region Custom Cell
    public class DataGridViewPassportCell : DataGridViewTextBoxCell
    {
        private const string DEFAULT_STRING = "000000";
        private int _heightOfRowBeforeEditMode;

        public DataGridViewPassportCell() : base() { }

        public override void InitializeEditingControl(int rowIndex, object initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle)
        {
            base.InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle);
            TimeEdit pasCtrl = this.DataGridView.EditingControl as TimeEdit;
            this._heightOfRowBeforeEditMode = this.OwningRow.Height;
            this.OwningRow.Height = pasCtrl.Height;
            TimeCtr pasInCell = this.Value as TimeCtr;
            if (pasInCell == null)
                pasInCell = new TimeCtr();
            pasCtrl.SetupControls(pasInCell);
        }

        public override void DetachEditingControl()
        {
            if (this._heightOfRowBeforeEditMode > 0)
                this.OwningRow.Height = this._heightOfRowBeforeEditMode;
            base.DetachEditingControl();
        }

        public override Type EditType
        {
            get
            {
                return typeof(TimeEdit);
            }
        }

        public override Type ValueType
        {
            get
            {
                return typeof(TimeCtr);
            }
        }

        public override Type FormattedValueType
        {
            get
            {
                return typeof(TimeCtr);
            }
        }

        public override object DefaultNewRowValue
        {
            get
            {
                return DEFAULT_STRING;
            }
        }

        protected override object GetFormattedValue(object value, int rowIndex, ref DataGridViewCellStyle cellStyle, TypeConverter valueTypeConverter, TypeConverter formattedValueTypeConverter, DataGridViewDataErrorContexts context)
        {
            if (value == null)
                return DEFAULT_STRING;
            else
                return TypeDescriptor.GetConverter(value).ConvertToString(value);
        }
    }
    #endregion

    #region Custom Column
    public class DataGridViewPassportColumn : DataGridViewColumn
    {
        public DataGridViewPassportColumn() : base(new DataGridViewPassportCell()) { }

        public override DataGridViewCell CellTemplate
        {
            get
            {
                return base.CellTemplate;
            }
            set
            {
                if (value != null && !value.GetType().IsAssignableFrom(typeof(DataGridViewPassportCell)))
                    throw new InvalidCastException("Cell must be a PassportCell");
                base.CellTemplate = value;
            }
        }
    }
    #endregion



        #region TimeCtr object
    [TypeConverter(typeof(TimeCtrConverter))]
        public class TimeCtr
        {            
            private string _number;
         
            public string Number
            {
                get
                {
                    return _number;
                }
                set
                {   
                    _number = value;
                }
            }

            /// <summary>
            /// Creates a new instance of Passport
            /// </summary>
            /// <param name="series">Passport Series</param>
            /// <param name="number">Number of Passport</param>
            /// <param name="issueDate">Date of issue</param>
            public TimeCtr(string number)
            {                
                this.Number = _number;             
            }


            /// <summary>
            /// Creates a new instance of "default" Passport
            /// </summary>
            public TimeCtr() : this("000000") { }
        }
        #endregion

        #region TimeCtrConverter
        public class TimeCtrConverter : TypeConverter
        {
            private const string DEFAULT_FORMAT_STRING = "{00:00:00}";

            // Overrides the ConvertTo method of TypeConverter.
            public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType)
            {
                if (destinationType == typeof(string))
                {
                    TimeCtr pas = value as TimeCtr;
                    return string.Format(DEFAULT_FORMAT_STRING, pas.Number);
                }
                return base.ConvertTo(context, culture, value, destinationType);
            }
        }
        #endregion
    
}


Здесь библиотека сделана на основе примера из RSDN, только у меня одно поле типа MaskEdit и маска у него должна быть "00:00:00".

Experimenter, может быть посмотришь код? Где то я делаю что-то не так... Когда в проекте использую колонку типа DataGridViewPassportColumn (я её не переименовала), значение у меня не устанавливается
PM MAIL   Вверх
Experimenter
Дата 20.11.2007, 18:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 430
Регистрация: 8.5.2007
Где: Уфа

Репутация: 1
Всего: 17



да, осталась самая малость, InitializeComponent() показать.
там у тебя с исходником много отличий?

Это сообщение отредактировал(а) Experimenter - 20.11.2007, 18:47


--------------------
public Zlo FromTwoEvilsChooseSmaller(Zlo zlo1, Zlo zlo2){
    if(zlo1 < zlo2) return zlo1;
    else if(zlo1 > zlo2) return zlo2;
    else throw new Exception("Kill yourself by the wall"); }
PM WWW ICQ   Вверх
Experimenter
Дата 20.11.2007, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 430
Регистрация: 8.5.2007
Где: Уфа

Репутация: 1
Всего: 17



Aline, не понравилась одна строчка в class TimeCtrConverter
Код

        private const string DEFAULT_FORMAT_STRING = "{00:00:00}";
Попробуй заменить на:
Код
 
       private const string DEFAULT_FORMAT_STRING = "Время: {0}"; //либо просто "{0}"
еще в class TimeCtr:
Код

        public TimeCtr(string number)
        {
            this.Number = _number;
        }
заменить на:
Код

        public TimeCtr(string number)
        {
            this.Number = number;
        }
а здесь, хотя не уверен, потому что не особо вникал:
Код

        public TimeCtr() : this("000000") { }
на:
Код

        public TimeCtr() : this("00:00:00") { }


Это сообщение отредактировал(а) Experimenter - 20.11.2007, 21:01


--------------------
public Zlo FromTwoEvilsChooseSmaller(Zlo zlo1, Zlo zlo2){
    if(zlo1 < zlo2) return zlo1;
    else if(zlo1 > zlo2) return zlo2;
    else throw new Exception("Kill yourself by the wall"); }
PM WWW ICQ   Вверх
Aline
Дата 21.11.2007, 08:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 470
Регистрация: 22.7.2005
Где: Таруса

Репутация: нет
Всего: нет



Experimenter, спасибо за ответы, однозначно "+" в твою репутацию smile

Что касается кода: насчет форматирования - там всё в порядке. Проблема в этом куске:

Код

 private void OnValueChanged()
        {
            this._valueChanged = true;            
            this._psForEditSession.Number = (this._mskEdit.Text == null ? string.Empty : this._mskEdit.Text);            
            DataGridView dgv = this.EditingControlDataGridView;
            if (dgv != null)
                dgv.NotifyCurrentCellDirty(true);
        }



Когда первый раз туда попадаешь, почему то _psForEditSession=NULL.
Т.е. получается, что SetupControls не отработал перед этим?

А если делаю вот так:
Код

public TimeEdit()
        {
            InitializeComponent();
            this._psForEditSession = new TimeCtr();
        }



тогда при первом изменении в ячейке ничего не меняется, а поменяется если ещё раз туда войдешь и введешь заново значение, причем это только в первый раз так, потом в других ячейках всё нормально отрабатывает

Добавлено через 2 минуты и 36 секунд
А с исходником у меня немного отличий: исключила 2 ненужных компонента  вместе с Label и изменила маску у MaskEdit
PM MAIL   Вверх
Experimenter
Дата 21.11.2007, 09:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 430
Регистрация: 8.5.2007
Где: Уфа

Репутация: 1
Всего: 17



Цитата

тогда при первом изменении в ячейке ничего не меняется, а поменяется если ещё раз туда войдешь и введешь заново значение, причем это только в первый раз так, потом в других ячейках всё нормально отрабатывает

Так проблема, на мой взгляд, как раз в том, что когда ты объявляешь
Код

this._psForEditSession = new TimeCtr();
выполнение программы переходит сюда:
Код

public TimeCtr() : this("000000") { }
откуда следует переход сюда:
Код

        public TimeCtr(string number)
        {
            this.Number = _number;
        }
где свойство this.Number замыкается на переменную-поле string _number с пустым значением, а не на передаваемый аргумент, который в скобках (string number). Посмотри исходник внимательнее. Свойству нужно передавать именно аргумент, а не поле.


--------------------
public Zlo FromTwoEvilsChooseSmaller(Zlo zlo1, Zlo zlo2){
    if(zlo1 < zlo2) return zlo1;
    else if(zlo1 > zlo2) return zlo2;
    else throw new Exception("Kill yourself by the wall"); }
PM WWW ICQ   Вверх
Aline
Дата 21.11.2007, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 470
Регистрация: 22.7.2005
Где: Таруса

Репутация: нет
Всего: нет



Это всё я исправила, это было от невнимательности smile

Но тем не менее всё равно с первого раза не могу установить значение, только со второго. А дальше уже всё отлично вводится....

Вот мой код:
Код

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;

namespace TimeEditControl
{
    #region EditControl
    public partial class TimeEdit : UserControl, IDataGridViewEditingControl
    {
        private int _row;
        private DataGridView _dgv;
        private bool _valueChanged = false;
        private TimeCtr _psForEditSession;

        public TimeEdit()
        {            
            InitializeComponent();            
        }

        private void _mskEdit_Validating(object sender, CancelEventArgs e)
        {
            if (this._mskEdit.MaskCompleted)
                this.OnValueChanged();
            e.Cancel = !this._mskEdit.MaskCompleted;
        }     
        private void OnValueChanged()
        {
            this._valueChanged = true;            
            this._psForEditSession.Number = (this._mskEdit.Text == null ? string.Empty : this._mskEdit.Text);            
            DataGridView dgv = this.EditingControlDataGridView;
            if (dgv != null)
                dgv.NotifyCurrentCellDirty(true);
        }

        public void SetupControls(TimeCtr ps)
        {
            this._psForEditSession = new TimeCtr();
            this._mskEdit.Text = ps.Number;            
        }

        #region IDataGridViewEditingControl Members

        public void ApplyCellStyleToEditingControl(DataGridViewCellStyle dataGridViewCellStyle)
        {
            this._mskEdit.Font = dataGridViewCellStyle.Font;
            this.MinimumSize = this.Size;
        }

        public DataGridView EditingControlDataGridView
        {
            get
            {
                return this._dgv;
            }
            set
            {
                this._dgv = value;
            }
        }

        public object EditingControlFormattedValue
        {
            get
            {
                return this._psForEditSession;
            }
            set
            {
                //nothing to do...
            }
        }

        public int EditingControlRowIndex
        {
            get
            {
                return this._row;
            }
            set
            {
                this._row = value;
            }
        }

        public bool EditingControlValueChanged
        {
            get
            {
                return this._valueChanged;
            }
            set
            {
                this._valueChanged = value;
            }
        }

        public bool EditingControlWantsInputKey(Keys keyData, bool dataGridViewWantsInputKey)
        {
            switch (keyData & Keys.KeyCode)
            {
                case Keys.Down:
                case Keys.Right:
                case Keys.Left:
                case Keys.Up:
                case Keys.Home:
                case Keys.End:
                    return true;
                default:
                    return false;
            }

        }

        public Cursor EditingPanelCursor
        {
            get { return base.Cursor; }
        }

        public object GetEditingControlFormattedValue(DataGridViewDataErrorContexts context)
        {
            return this.EditingControlFormattedValue;
        }

        public void PrepareEditingControlForEdit(bool selectAll) { }

        public bool RepositionEditingControlOnValueChange { get { return false; } }

        #endregion
           
    }
    #endregion

    #region Custom Cell
    public class DataGridViewPassportCell : DataGridViewTextBoxCell
    {
        private const string DEFAULT_STRING = "00:00:00";
        private int _heightOfRowBeforeEditMode;

        public DataGridViewPassportCell() : base() { }

        public override void InitializeEditingControl(int rowIndex, object initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle)
        {
            base.InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle);
            TimeEdit pasCtrl = this.DataGridView.EditingControl as TimeEdit;
            this._heightOfRowBeforeEditMode = this.OwningRow.Height;
            this.OwningRow.Height = pasCtrl.Height;
            TimeCtr pasInCell = this.Value as TimeCtr;
            if (pasInCell == null)
                pasInCell = new TimeCtr();
            pasCtrl.SetupControls(pasInCell);
        }

        public override void DetachEditingControl()
        {
            if (this._heightOfRowBeforeEditMode > 0)
                this.OwningRow.Height = this._heightOfRowBeforeEditMode;
            base.DetachEditingControl();
        }

        public override Type EditType
        {
            get
            {
                return typeof(TimeEdit);
            }
        }

        public override Type ValueType
        {
            get
            {
                return typeof(TimeCtr);
            }
        }

        public override Type FormattedValueType
        {
            get
            {
                return typeof(TimeCtr);
            }
        }

        public override object DefaultNewRowValue
        {
            get
            {
                return DEFAULT_STRING;
            }
        }

        protected override object GetFormattedValue(object value, int rowIndex, ref DataGridViewCellStyle cellStyle, TypeConverter valueTypeConverter, TypeConverter formattedValueTypeConverter, DataGridViewDataErrorContexts context)
        {
            if (value == null)
                return DEFAULT_STRING;
            else
                return TypeDescriptor.GetConverter(value).ConvertToString(value);
        }
    }
    #endregion

    #region Custom Column
    public class DataGridViewPassportColumn : DataGridViewColumn
    {
        public DataGridViewPassportColumn() : base(new DataGridViewPassportCell()) { }

        public override DataGridViewCell CellTemplate
        {
            get
            {
                return base.CellTemplate;
            }
            set
            {
                if (value != null && !value.GetType().IsAssignableFrom(typeof(DataGridViewPassportCell)))
                    throw new InvalidCastException("Cell must be a PassportCell");
                base.CellTemplate = value;
            }
        }
    }
    #endregion



        #region TimeCtr object
    [TypeConverter(typeof(TimeCtrConverter))]
        public class TimeCtr
        {            
            private string _number;
         
            public string Number
            {
                get
                {
                    return _number;
                }
                set
                {   
                    _number = value;
                }
            }

            /// <summary>
            /// Creates a new instance of Passport
            /// </summary>
            /// <param name="series">Passport Series</param>
            /// <param name="number">Number of Passport</param>
            /// <param name="issueDate">Date of issue</param>
            public TimeCtr(string number)
            {                
                this.Number = number;             
            }


            /// <summary>
            /// Creates a new instance of "default" Passport
            /// </summary>
            public TimeCtr() : this("{00:00:00}") { }
        }
        #endregion

        #region TimeCtrConverter
        public class TimeCtrConverter : TypeConverter
        {
            private const string DEFAULT_FORMAT_STRING = "{00:00:00}";

            // Overrides the ConvertTo method of TypeConverter.
            public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType)
            {
                if (destinationType == typeof(string))
                {
                    TimeCtr pas = value as TimeCtr;
                    return string.Format(DEFAULT_FORMAT_STRING, pas.Number);
                }
                return base.ConvertTo(context, culture, value, destinationType);
            }
        }
        #endregion
    
}


PM MAIL   Вверх
Experimenter
Дата 21.11.2007, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 430
Регистрация: 8.5.2007
Где: Уфа

Репутация: 1
Всего: 17



а строчку 
Код

private const string DEFAULT_FORMAT_STRING = "{00:00:00}";
менять не будешь? И потом, раз уж ты делаешь в class TimeCtrConverter перегрузку метода public override object ConvertTo, не логичнее ли будет в коде
Код

        protected override object GetFormattedValue(object value, int rowIndex, ref DataGridViewCellStyle cellStyle, TypeConverter valueTypeConverter, TypeConverter formattedValueTypeConverter, DataGridViewDataErrorContexts context)
        {
            if (value == null)
                return DEFAULT_STRING;
            else
                return TypeDescriptor.GetConverter(value).ConvertToString(value);
        }
поставить не ConvertToString(value), а ConvertTo(value), либо перегружать метод ConvertToString(object)?
Хотя непонятно, где они в программе пересекаются.

Это сообщение отредактировал(а) Experimenter - 21.11.2007, 10:08


--------------------
public Zlo FromTwoEvilsChooseSmaller(Zlo zlo1, Zlo zlo2){
    if(zlo1 < zlo2) return zlo1;
    else if(zlo1 > zlo2) return zlo2;
    else throw new Exception("Kill yourself by the wall"); }
PM WWW ICQ   Вверх
Aline
Дата 21.11.2007, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 470
Регистрация: 22.7.2005
Где: Таруса

Репутация: нет
Всего: нет



Experimenter, меня тоже строка
Код

  return TypeDescriptor.GetConverter(value).ConvertToString(value);


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

Вот сейчас попробовала поставить не ConvertToString(value), а ConvertTo(value)  - выдает ошибку. Так что не в этом дело. Буду копать дальше


DEFAULT_FORMAT_STRING менять пробовала, как ты написал - результат такой же, поэтому вернула назад...
PM MAIL   Вверх
Experimenter
Дата 21.11.2007, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 430
Регистрация: 8.5.2007
Где: Уфа

Репутация: 1
Всего: 17



Цитата

Вот сейчас попробовала поставить не ConvertToString(value), а ConvertTo(value)  - выдает ошибку. Так что не в этом дело. Буду копать дальше
Ну правильно, сам не догадался сразу, первый выдает строку, второй - объект. Может все же в TimeCtrConverter другой метод переопределить?

Добавлено через 1 минуту и 21 секунду
И пробежаться по коду отладчиком в пошаговом режиме, посмотреть, где и что сбой дает...


--------------------
public Zlo FromTwoEvilsChooseSmaller(Zlo zlo1, Zlo zlo2){
    if(zlo1 < zlo2) return zlo1;
    else if(zlo1 > zlo2) return zlo2;
    else throw new Exception("Kill yourself by the wall"); }
PM WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




[ Время генерации скрипта: 0.1106 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.