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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не вводятся некоторые символы в TextBox, TextBox в составе собственного контрола 
:(
    Опции темы
SpaceSpace
Дата 5.6.2007, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Дайте мне тоже посмотреть - интересно


--------------------
Репутация - самое ценное, что есть у человека. Зарабатывают годы, теряют за мгновение.
70-565
MCPD Enterprise 3.5 
PM MAIL   Вверх
draiv
Дата 5.6.2007, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



class FilterEdit:

Код

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

namespace FilterEditControl
{
    public partial class FilterEdit : UserControl, IDataGridViewEditingControl
    {
        #region Constructors
        public FilterEdit()
        {
            InitializeComponent();
        }

        public void SetupControls(Filter filter)
        {
            this.FilterForEditSession = new Filter();
            this.operation.SelectedItem = filter.Operation;
            this.Checked = filter.Checked;
            this.Text = filter.Text;
        }
        #endregion

        #region Handlers
        void textBox1_TextChanged(object sender, EventArgs e)
        {
            this.OnValueChanged();
        }

        void operation_SelectedValueChanged(object sender, EventArgs e)
        {
            this.OnValueChanged();
        }

        void enable_CheckedChanged(object sender, EventArgs e)
        {
            this.OnValueChanged();
        }

        private void OnValueChanged()
        {
            this._valueChanged = true;
            this.FilterForEditSession.Checked = this.Checked;
            this.FilterForEditSession.Operation = this.Operation;
            this.FilterForEditSession.Text = this.Text;
            DataGridView dgv = this.EditingControlDataGridView;
            if (dgv != null)
                dgv.NotifyCurrentCellDirty(true);
        }
        #endregion

        #region FilterEdit Members
        public bool Checked
        {
            get { return enable.Checked; }
            set
            {
                if (enable.Checked != value)
                {
                    enable.Checked = value;
                }
            }
        }

        public string Operation
        {
            get { return (string)operation.SelectedItem; }
            set
            {
                if ((string)operation.SelectedItem != value)
                {
                    operation.SelectedItem = value;
                }
            }
        }

        public new string Text
        {
            get { return textBox1.Text; }
            set
            {
                if (textBox1.Text != value)
                {
                    textBox1.Text = value;
                }
            }
        }

        public string FullText
        {
            get
            {
                string txt = Text;
                double result;
                switch (Operation)
                {
                    case "in":
                        if (!double.TryParse(txt, out result))//введенное значение не является числом-скорее всего-это строка
                        {
                            txt=txt.Replace(" ,", ",");//поубираем пробелы слева и справа от запятых, чтоб они не вошли в состав значений
                            txt=txt.Replace(", ", ",");
                            txt=txt.Replace(",", "','");//все значения разделенные запятыми возьмем в одиночные кавычки
                            return Operation + " ('" + txt + "')";
                        }
                        else
                            return Operation + " (" + Text + ")";
                        break;
                    case "IS NULL":
                        return Operation;
                        break;
                    default:
                        if (!double.TryParse(txt, out result))//введенное значение не является числом-скорее всего-это строка
                            return Operation + " '" + Text + "'";
                        else
                            return Operation + " " + Text;
                        break;
                }
            }
        }
        #endregion

        #region Fields
        private int _row;
        private DataGridView _dgv;
        private bool _valueChanged = false;
        private Filter FilterForEditSession;
        #endregion

        #region IDataGridViewEditingControl Members
        public void ApplyCellStyleToEditingControl(DataGridViewCellStyle dataGridViewCellStyle)
        {
            this.enable.Font = this.operation.Font = this.textBox1.Font = dataGridViewCellStyle.Font;
            this.MinimumSize = this.Size;
        }

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

        public object EditingControlFormattedValue
        {
            get
            {
                return this.FilterForEditSession;
            }
            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 Cursor.Current; }
        }

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

        public void PrepareEditingControlForEdit(bool selectAll) { }

        public bool RepositionEditingControlOnValueChange { get { return false; } }
        #endregion
    }

    public class DataGridViewFilterCell : DataGridViewTextBoxCell
    {
        private int _heightOfGridBeforeEditMode;
        private int _heightOfRowBeforeEditMode;
        private int _widthOfColumnBeforeEditMode;

        public DataGridViewFilterCell() : base() { }

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

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

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

        public override object DefaultNewRowValue
        {
            get { return string.Empty; }
        }

        public override void InitializeEditingControl(int rowIndex, object initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle)
        {
            base.InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle);
            FilterEdit filterEditCtrl = this.DataGridView.EditingControl as FilterEdit;
            this._heightOfGridBeforeEditMode = this.DataGridView.Height;
            this._heightOfRowBeforeEditMode = this.OwningRow.Height;
            this._widthOfColumnBeforeEditMode = this.OwningColumn.Width;
            int CtrlWidth = filterEditCtrl.Width;
            int HeightPlus = 15;//надбавка на возможное появление горизонтальной полосы прокрутки
            if (this.DataGridView.Height < filterEditCtrl.Height + HeightPlus)
                this.DataGridView.Height = filterEditCtrl.Height + HeightPlus;
            if (this.OwningRow.Height < filterEditCtrl.Height)
                this.OwningRow.Height = filterEditCtrl.Height;
            if (this.OwningColumn.Width < CtrlWidth)
                this.OwningColumn.Width = CtrlWidth;
            else
                filterEditCtrl.Width = this.OwningColumn.Width;

            Filter filterInCell = this.Value as Filter;
            if (filterInCell == null)
                filterInCell = new Filter();
            filterEditCtrl.SetupControls(filterInCell);
        }

        public override void DetachEditingControl()
        {
            if (this._heightOfGridBeforeEditMode > 0)
                this.DataGridView.Height = this._heightOfGridBeforeEditMode;
            if (this._heightOfRowBeforeEditMode > 0)
                this.OwningRow.Height = this._heightOfRowBeforeEditMode;
            if (this._widthOfColumnBeforeEditMode > 0)
                this.OwningColumn.Width = this._widthOfColumnBeforeEditMode;
            base.DetachEditingControl();
        }

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

    public class DataGridViewFilterColumn : DataGridViewColumn
    {
        public DataGridViewFilterColumn() : base(new DataGridViewFilterCell()) { }

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

    [TypeConverter(typeof(FilterConverter))]
    [Serializable]
    public class Filter
    {
        public Filter() { }
        public Filter(bool check, string oper, string txt)
        {
            this.Checked = check;
            this.Operation = oper;
            this.Text = txt;
        }

        private bool _Checked;
        public bool Checked
        {
            get { return _Checked; }
            set { _Checked = value; }
        }

        private string operation;
        public string Operation
        {
            get { return operation; }
            set { operation = value; }
        }

        private string text;
        public string Text
        {
            get { return text; }
            set { text = value; }
        }

        public string FullText
        {
            get
            {
                string txt = text;
                double result;
                switch (Operation)
                {
                    case "in":
                        if (!double.TryParse(txt, out result))//введенное значение не является числом-скорее всего-это строка
                        {
                            txt=txt.Replace(" ,", ",");//поубираем пробелы слева и справа от запятых, чтоб они не вошли в состав значений
                            txt=txt.Replace(", ", ",");
                            txt=txt.Replace(",", "','");//все значения разделенные запятыми возьмем в одиночные кавычки
                            return Operation + " ('" + txt + "')";
                        }
                        else
                            return Operation + " (" + text + ")";
                        break;
                    case "IS NULL":
                        return Operation;
                        break;
                    default:
                        if (!double.TryParse(txt, out result))//введенное значение не является числом-скорее всего-это строка
                            return Operation + " '" + text + "'";
                        else
                            return Operation + " " + text;
                        break;
                }
            }
        }
    }

    public class FilterConverter : TypeConverter
    {
        // Overrides the ConvertTo method of TypeConverter.
        public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType)
        {
            if (destinationType == typeof(string))
            {
                Filter filter = value as Filter;
                return filter.FullText;
            }
            return base.ConvertTo(context, culture, value, destinationType);
        }
    }
}



FilterEdit.Designer.cs:
Код

namespace FilterEditControl
{
    partial class FilterEdit
    {
        /// <summary> 
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary> 
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Component Designer generated code

        /// <summary> 
        /// Required method for Designer support - do not modify 
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.enable = new System.Windows.Forms.CheckBox();
            this.operation = new System.Windows.Forms.ComboBox();
            this.textBox1 = new System.Windows.Forms.TextBox();
            this.SuspendLayout();
            // 
            // enable
            // 
            this.enable.AccessibleRole = System.Windows.Forms.AccessibleRole.None;
            this.enable.AutoSize = true;
            this.enable.Location = new System.Drawing.Point(2, 4);
            this.enable.Name = "enable";
            this.enable.Size = new System.Drawing.Size(59, 17);
            this.enable.TabIndex = 0;
            this.enable.Text = "Enable";
            this.enable.UseVisualStyleBackColor = true;
            this.enable.CheckedChanged += new System.EventHandler(this.enable_CheckedChanged);
            // 
            // operation
            // 
            this.operation.FormattingEnabled = true;
            this.operation.Items.AddRange(new object[] {
            "Like",
            "=",
            "<>",
            ">",
            ">=",
            "<",
            "<=",
            "in",
            "IS NULL"});
            this.operation.Location = new System.Drawing.Point(57, 2);
            this.operation.Name = "operation";
            this.operation.Size = new System.Drawing.Size(47, 21);
            this.operation.TabIndex = 1;
            this.operation.SelectedValueChanged += new System.EventHandler(this.operation_SelectedValueChanged);
            // 
            // textBox1
            // 
            this.textBox1.Dock = System.Windows.Forms.DockStyle.Bottom;
            this.textBox1.Location = new System.Drawing.Point(0, 26);
            this.textBox1.Name = "textBox1";
            this.textBox1.Size = new System.Drawing.Size(106, 20);
            this.textBox1.TabIndex = 2;
            this.textBox1.TextChanged += new System.EventHandler(this.textBox1_TextChanged);
            // 
            // FilterEdit
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.Controls.Add(this.textBox1);
            this.Controls.Add(this.operation);
            this.Controls.Add(this.enable);
            this.Name = "FilterEdit";
            this.Size = new System.Drawing.Size(106, 46);
            this.ResumeLayout(false);
            this.PerformLayout();

        }

        #endregion

        private System.Windows.Forms.CheckBox enable;
        private System.Windows.Forms.ComboBox operation;
        private System.Windows.Forms.TextBox textBox1;
    }
}



(В TextBox не вводятся символы q % ' " .)
PM MAIL   Вверх
soros26
Дата 13.11.2008, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Не стал создавать отдельную тему....
У меня такая задача: есть уравнение, у этого уравнения есть коэффициенты. Так вот мне надо ввести в несколько TextBox-ов эти коэффициенты. Понятно что коэффициенты могут всякими разными - отрицательными, дробными и т.д.
Так вот у меня при вводе в TextBox знака минус (-) сразу выскакивает ошибка что мол неправильный формат. 
Вот код:
Код

d3 = Convert.ToDouble(textBox1.Text);
 
Что делать? Как это исправить?? В инете вообще ничего нормального по этому поводу нет...
И второй момент: при вводе в TextBox дробного числа (например 23,45) рассчет выражений с использованием числа 23,45 идет неправильно... пробовал вводить вместо запятой точку, но при вводе точки сразу выскакивает ошибка "Неправильный формат и т.д."
 
Наверняка кто-то сталкивался с такой ситуацией....помогите пожалуйста! Неужели весь мир вводит в TextBox только целые int -овские значения?? smile 
PM   Вверх
QryStaL
Дата 13.11.2008, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Intellectual feast
**


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

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



Цитата(soros26 @  13.11.2008,  11:27 Найти цитируемый пост)
вводе в TextBox знака минус (-) сразу выскакивает ошибка

Проверил с минусом, все отлично работает.

Цитата(soros26 @  13.11.2008,  11:27 Найти цитируемый пост)
пробовал вводить вместо запятой точку, но при вводе точки сразу выскакивает ошибка "Неправильный формат и т.д."

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


--------------------
I don't need a reason being who I am...
PM MAIL ICQ   Вверх
soros26
Дата 13.11.2008, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Насчет минуса...как так? А ты пробовал присвоить какой-нибудь переменной (d3 например) содержимое TextBox:
d3 = Convert.ToDouble(textBox1.Text);

Потому что если ты поставишь голый TextBox на форму, то конечно у тебя будет все отлично....
Я уже думаю-может в типе double причина? Мб надо какой-то другой формат брать? 
Но мне надо чтобы после запятой можно было вводить хотя бы десяток знаков. 
Есть варианты?
PM   Вверх
QryStaL
Дата 13.11.2008, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Intellectual feast
**


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

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



Цитата(soros26 @  13.11.2008,  14:58 Найти цитируемый пост)
Насчет минуса...как так? А ты пробовал присвоить какой-нибудь переменной (d3 например) содержимое TextBox


Пробовал, все работает

Код

        private void button1_Click(object sender, EventArgs e)
        {
            Double d = Convert.ToDouble(textBox1.Text);
        }



--------------------
I don't need a reason being who I am...
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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