Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > ввод ограничений в TextBox


Автор: Yagmort 2.12.2010, 17:49
нашел такую ссылку, но беру код оттуда и ничего не получается :( Ввожу любые символы, фильтрации нет 

http://forum.vingrad.ru/forum/topic-169366/unread-1/kw-фильтрация-символ-textbox.html 


Автор: Ky7m 2.12.2010, 18:03
А куда этот код вставляешь?

Автор: Yagmort 2.12.2010, 23:57
Тут еще такой ньюанc ограничение, то я на ввод это одно, а как запретить копировать в TextBox текст ? т.е. Ctrl+V или правой кнопкой мыши ? WebForm у меня.
Просто как событие вставляю. Или я не верно понял ? 
Код

private void TextBox1_Click(object sender, EventArgs e)
{

}

Автор: i2m 3.12.2010, 02:55
Код

private void textBox_KeyPress(object sender, KeyPressEventArgs e)
{
}


Код

private void TextBox1_Click(object sender, EventArgs e)
{
}


Замечаете разницу?

Автор: CYBERDREAM 3.12.2010, 08:28
Код

using System;
using System.ComponentModel;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace J
{
    public class TextBoxCharacters : TextBox
    {
        public TextBoxCharacters()
        {
            AllowProperty = new AllowCharactersticGroup();
        }

        [DisplayName("Allowed Characters"), Description("шаблон с символами, разрешенными для ввода")]
        public AllowCharactersticGroup AllowProperty { get; set; }

        

        protected override void OnKeyPress(KeyPressEventArgs e)
        {
            if (e.KeyChar == (int)Keys.Back || e.KeyChar == (int)Keys.Enter)
                return;

            if ((ModifierKeys & Keys.CapsLock) == Keys.CapsLock)
                return;
            if ((ModifierKeys & Keys.Control) == Keys.Control)
                return;

            if (AllowProperty.All)
                return;

            if (AllowProperty.Custom)
            {
                if (String.IsNullOrEmpty(AllowProperty.AllowedCharacters))
                    return;

                if (!AllowProperty.AllowedCharacters.Contains(e.KeyChar))
                    e.Handled = true;
                return;
            }

            if (AllowProperty.Chars && Char.IsLetter(e.KeyChar))
                return;
            if (AllowProperty.Digits && Char.IsDigit(e.KeyChar))
                return;
            if(AllowProperty.Hyphen && e.KeyChar=='-')
                return;

            if(AllowProperty.Punctuation && (e.KeyChar=='.' || e.KeyChar==','))
                return;

            if (AllowProperty.WhiteSpace && Char.IsWhiteSpace(e.KeyChar))
                return;
            if (AllowProperty.Symbols && AllowCharactersticGroup.AllowedSymbols.Contains(e.KeyChar))
                return;

            e.Handled = true;
        }
    }

    [TypeConverter(typeof(ExpandableObjectConverter))]
    public class AllowCharactersticGroup
    {
        #region Fields

        private bool _chars;
        private bool _hyphen;
        private bool _digits;
        private bool _whiteSpace;
        private bool _symbols;
        private bool _punctuation;
        private string _allowedCharacters;

        #endregion

        #region Properties

        [DisplayName("Буквы")]
        [TypeConverter(typeof(BooleanTypeConverter))]
        public Boolean Chars
        {
            get
            {
                if (Custom)
                    return false;
                return _chars;
            }
            set { _chars = value; }
        }

        [DisplayName("Дефис")]
        [TypeConverter(typeof(BooleanTypeConverter))]
        public Boolean Hyphen
        {
            get
            {
                if (Custom)
                    return false;
                return _hyphen;
            }
            set { _hyphen = value; }
        }

        [DisplayName("Цифры")]
        [TypeConverter(typeof(BooleanTypeConverter))]
        public Boolean Digits
        {
            get
            {
                if (Custom)
                    return false;
                return _digits;
            }
            set { _digits = value; }
        }

        [DisplayName("Пробел")]
        [TypeConverter(typeof(BooleanTypeConverter))]
        public Boolean WhiteSpace
        {
            get
            {
                if (Custom)
                    return false;
                return _whiteSpace;
            }
            set { _whiteSpace = value; }
        }

        [DisplayName("Символы")]
        [TypeConverter(typeof(BooleanTypeConverter))]
        [Description("/\\*-+)([]{}'\":;|/~!@#$%^&№?<>=_`")]
        public Boolean Symbols
        {
            get
            {
                if (Custom)
                    return false;
                return _symbols;
            }
            set { _symbols = value; }
        }

        [DisplayName("Знаки препинания")]
        [TypeConverter(typeof(BooleanTypeConverter))]
        public Boolean Punctuation
        {
            get
            {
                if (Custom)
                    return false;
                return _punctuation;
            }
            set { _punctuation = value; }
        }

        [DisplayName("Пользовательский"), TypeConverter(typeof(BooleanTypeConverter))]
        [Description("Пользователь сам указывает разрешенный набор символов")]
        public bool Custom { get; set; }

        [DisplayName("Allowed characters")]
        [Description("символы разрешенные для ввода, если AllowePattern=All")]
        public String AllowedCharacters
        {
            get
            {
                if (!Custom)
                    return String.Empty;
                return _allowedCharacters;
            }
            set
            {
                _allowedCharacters = value;
            }
        }

        [Browsable(false)]
        public Boolean All
        {
            get { return Chars && Hyphen && Digits && Symbols && Punctuation; }
            private set
            {
                Chars = Hyphen = Digits = Symbols = Punctuation = WhiteSpace = value;
                Custom = !value;
            }
        }

        public const String AllowedSymbols = "/\\*-+)([]{}'\":;|/~!@#$%^&№?<>=_`";

        #endregion

        #region .ctor

        public AllowCharactersticGroup()
        {
            All = true;
        }

        #endregion

        #region Methods

        public override string ToString()
        {
            if (Custom)
                return "Пользовательский";
            if (Chars && Hyphen && WhiteSpace && Symbols && Punctuation)
                return "Все";

            StringBuilder sb = new StringBuilder();

            if (Chars)
                sb.Append("буквы,");
            if (Hyphen)
                sb.Append("дефис,");
            if (Digits)
                sb.Append("цифры,");
            if (WhiteSpace)
                sb.Append("пробел,");
            if (Symbols)
                sb.Append("символы,");
            if (Punctuation)
                sb.Append("знаки препинания,");
            if (sb.Length > 0 && sb[sb.Length - 1] == ',')
                sb.Remove(sb.Length - 1, 1);
            else if (sb.Length == 0)
                return "Только для чтения";
            return sb.ToString();
        }

        #endregion
    }

    public class BooleanTypeConverter : BooleanConverter
    {
        public override object ConvertTo(ITypeDescriptorContext context,
          CultureInfo culture,
          object value,
          Type destType)
        {
            return (bool)value ?
              "Да" : "Нет";
        }

        public override object ConvertFrom(ITypeDescriptorContext context,
          CultureInfo culture,
          object value)
        {
            return (string)value == "Есть";
        }
    }
}

Автор: Yagmort 3.12.2010, 10:57
и как пременить вышенаписанный код к данному текстбоксу ?

Автор: CYBERDREAM 3.12.2010, 11:16
это кастомный текстбокс, заменить можешь существующий этим 

Автор: Yagmort 3.12.2010, 11:45
Цитата(CYBERDREAM @ 3.12.2010,  11:16)
это кастомный текстбокс, заменить можешь существующий этим

Я не особо хорошо знаю весь синтаксис, чтобы правильно заменить  C#(

Автор: CYBERDREAM 3.12.2010, 12:03
зайди в класс дезайнера (знашь где и что это?) находишь объявление и инициализацию своего текстбокса, заменяешь TextBox на TextBoxCharacters  ну и все. (а ну добавь класс мой к себе в проект и подправь нэймспэйс лучше)

Автор: Yagmort 3.12.2010, 13:34
Цитата(CYBERDREAM @ 3.12.2010,  12:03)
зайди в класс дезайнера (знашь где и что это?) находишь объявление и инициализацию своего текстбокса, заменяешь TextBox на TextBoxCharacters  ну и все. (а ну добавь класс мой к себе в проект и подправь нэймспэйс лучше)

Я создал отдельный элемент Класс, залил туда код, у меня TextBoxCharacters() поменял на свой странице дизайнера id своего TextBoxa на TextBoxCharacters, как сделать так, и ничего не происходит ( Наверное надо сослаться как нибудь на этот текст бокс ? 
Код

protected global::System.Web.UI.WebControls.TextBox TextBoxCharacters;

А если мне надо для 30 текстбоксов сделать, каждый раз копировать код ? или добавить 30 методов ?

Добавлено через 6 минут и 54 секунды
Запустил и он мне пишет теперь не задана ссылка на Объект (

Добавлено через 8 минут и 45 секунд
TextBoxCharacters.Height = 17; когда так поменял

Автор: CYBERDREAM 3.12.2010, 13:45
глянь

Автор: Yagmort 3.12.2010, 13:53
Цитата(CYBERDREAM @ 3.12.2010,  13:45)
глянь

Понятно, а если мне надо применить данный класс для нескольких прастранств имен, т.е. для нескольких страниц

Добавлено через 1 минуту и 57 секунд
Цитата(Yagmort @ 3.12.2010,  13:53)
Цитата(CYBERDREAM @ 3.12.2010,  13:45)
глянь

Понятно, а если мне надо применить данный класс для нескольких прастранств имен, т.е. для нескольких страниц

Как то возможно его применть например у меня пространство имен a.forms{} и b.forms{} и мне надо применить к ним Ваш класс с пространством имен J

Автор: CYBERDREAM 3.12.2010, 13:58
просто ссылаешься на нужное пространство имен
в дизайнере:
Код

private WFA.TextBoxCharecters textbox1;
если правильно понял

Автор: Yagmort 3.12.2010, 14:06
куда вставлять тут ? 
Код

namespace a.Forms
{  
 public partial class psy
{
protected global::System.Web.UI.WebControls.TextBoxCharecters TextBox1;
}
}

Автор: CYBERDREAM 3.12.2010, 14:07
Цитата(Yagmort @ 3.12.2010,  14:06)
куда вставлять тут ? 
Код

namespace a.Forms
{  
 public partial class psy
{
protected global::System.Web.UI.WebControls.TextBoxCharecters TextBox1;
}
}

у тебя ведь этот контрол находится не в пространстве имен System.Web.UI.WebControls.

Глянь мой пример, там в дизайнере как прописано

Автор: Yagmort 3.12.2010, 14:10
Цитата(CYBERDREAM @ 3.12.2010,  14:07)
Цитата(Yagmort @ 3.12.2010,  14:06)
куда вставлять тут ? 
Код

namespace a.Forms
{  
 public partial class psy
{
protected global::System.Web.UI.WebControls.TextBoxCharecters TextBox1;
}
}

у тебя ведь этот контрол находится не в пространстве имен System.Web.UI.WebControls.

Глянь мой пример, там в дизайнере как прописано

Это для 1 текст бокса надо постоянно прописывать ?
Код

/// <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 Windows Form 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()
        {
            WFA.AllowCharactersticGroup allowCharactersticGroup1 = new WFA.AllowCharactersticGroup();
            this.textBox1 = new WFA.TextBoxCharacters();
            this.SuspendLayout();
            // 
            // textBox1
            // 
            allowCharactersticGroup1.AllowedCharacters = "";
            allowCharactersticGroup1.Chars = false;
            allowCharactersticGroup1.Custom = false;
            allowCharactersticGroup1.Digits = true;
            allowCharactersticGroup1.Hyphen = false;
            allowCharactersticGroup1.Punctuation = false;
            allowCharactersticGroup1.Symbols = false;
            allowCharactersticGroup1.WhiteSpace = false;
            this.textBox1.AllowProperty = allowCharactersticGroup1;
            this.textBox1.Location = new System.Drawing.Point(152, 175);
            this.textBox1.Name = "textBox1";
            this.textBox1.Size = new System.Drawing.Size(100, 20);
            this.textBox1.TabIndex = 0;
            // 
            // Form1
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(292, 267);
            this.Controls.Add(this.textBox1);
            this.Name = "Form1";
            this.Text = "Form1";
            this.ResumeLayout(false);
            this.PerformLayout();

        }

        #endregion

        private TextBoxCharacters textBox1;

Автор: CYBERDREAM 3.12.2010, 14:14
Цитата(Yagmort @ 3.12.2010,  14:10)
Это для 1 текст бокса надо постоянно прописывать ?

перефразируй, не понял

Добавлено через 2 минуты и 29 секунд
в целом, добавляешь класс в проект. Билдишь проект. В тулбоксе должен появиться TextBoxCharacters. а если нужно про апдейтитить существующие, то ручками в дизайнере по две строки на каждый текстбокс

Автор: Yagmort 3.12.2010, 14:19
Я код вставил в новый класс с пространством имен
Код

namespace j
{
    public class TextBoxCharacters: TextBox
    {
}

У меня есть еще 2 страницы и у каждой свое пространство имен
Код

namespace a.forms
{
    public class Froms1: System.Web.UI.Page
    {

и
Код

namespace b.forms
{
    public class Froms2: System.Web.UI.Page
    {


у меня на 1 странице лежат 5 текст боксов и на 2 лежат 5 текст боксов, как для них применить данный код не повторяя его, я так понял он работает через пространство имен ? Через наследование класса textBox

Автор: CYBERDREAM 3.12.2010, 14:25
Код

namespace WFA
{
    partial class Form1
    {
        /// <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 Windows Form 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()
        {
                        //заменяешь это!!!!!!!!!!1
            this.textBox1 = new System.Windows.Forms.TextBox();
                        //на это 
                        this.textBox1 = new J.TextBoxCharacters();

            this.SuspendLayout();
            // 
            // textBox1
            // 
            this.textBox1.Location = new System.Drawing.Point(152, 175);
            this.textBox1.Name = "textBox1";
            this.textBox1.Size = new System.Drawing.Size(100, 20);
            this.textBox1.TabIndex = 0;
            // 
            // Form1
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(292, 267);
            this.Controls.Add(this.textBox1);
            this.Name = "Form1";
            this.Text = "Form1";
            this.ResumeLayout(false);
            this.PerformLayout();

        }

        #endregion

                //Заменяешь эту строку 
        private System.Windows.Forms.TextBox textBox1;
                //на 
                private J.TextBoxCharacters textBox1;
    }
}


Если и сейчас тоже не поймешь, то посиди подумай, ничего сложного тут нет

Автор: Yagmort 3.12.2010, 14:43
Цитата(CYBERDREAM @ 3.12.2010,  14:25)
Код

namespace WFA
{
    partial class Form1
    {
        /// <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 Windows Form 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()
        {
                        //заменяешь это!!!!!!!!!!1
            this.textBox1 = new System.Windows.Forms.TextBox();
                        //на это 
                        this.textBox1 = new J.TextBoxCharacters();

            this.SuspendLayout();
            // 
            // textBox1
            // 
            this.textBox1.Location = new System.Drawing.Point(152, 175);
            this.textBox1.Name = "textBox1";
            this.textBox1.Size = new System.Drawing.Size(100, 20);
            this.textBox1.TabIndex = 0;
            // 
            // Form1
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(292, 267);
            this.Controls.Add(this.textBox1);
            this.Name = "Form1";
            this.Text = "Form1";
            this.ResumeLayout(false);
            this.PerformLayout();

        }

        #endregion

                //Заменяешь эту строку 
        private System.Windows.Forms.TextBox textBox1;
                //на 
                private J.TextBoxCharacters textBox1;
    }
}


Если и сейчас тоже не поймешь, то посиди подумай, ничего сложного тут нет

http://pixs.ru/showimage/12png_3112587_1301911.png

Он там много что не распознает (

Автор: CYBERDREAM 3.12.2010, 14:46
у меня винформ, у тебя вэб.

Может в вэбе позапористее как то объявление организуется, не знаю. Но в коде указанном показана суть, что на что менять

Автор: Yagmort 3.12.2010, 14:55
Цитата(CYBERDREAM @ 3.12.2010,  14:46)
у меня винформ, у тебя вэб.

Может в вэбе позапористее как то объявление организуется, не знаю. Но в коде указанном показана суть, что на что менять

Ну я не разберусь в этом, пока что для меня это сложно, т.к. не весь ситаксис C# выучил, наверное пока не буду реализовывать или сам попробую написать (

Автор: CYBERDREAM 3.12.2010, 14:59
кинь проект

Автор: Yagmort 3.12.2010, 15:09
вот

Автор: CYBERDREAM 3.12.2010, 15:33
под вэб мой класс не пойдет, в вэбе нет KeyPress.

Автор: Yagmort 3.12.2010, 15:35
Цитата(CYBERDREAM @ 3.12.2010,  15:33)
под вэб мой класс не пойдет, в вэбе нет KeyPress.

Эх... ну ладно :( Спасибо, хоть за то что согласился помочь

Автор: CYBERDREAM 3.12.2010, 15:49
http://ondotnet.com/pub/a/dotnet/excerpt/progaspdotnet_14/index2.html

можешь почитать тут пока. Я вечером гляну, задача решаемая. Прийдется переопределить TextChanged или нечто вроде. 

Автор: Yagmort 3.12.2010, 16:32
Ок.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)