Как можно очистить все текстовые поля, нажав на кнопку, когда 1 флажок установлен в C # - PullRequest
0 голосов
/ 12 октября 2011

В моем приложении у меня есть 85 текстовых полей. Все текстовые поля в моем приложении, как это:

void textBox1s(string input)
{
    this.textBox1.ForeColor = Color.Black;
    this.textBox1.Text = input;
}

private void textBox1_MouseClick(object sender, MouseEventArgs e)
{
    textBox1s(Clipboard.GetText());
}

и теперь я хочу любое текстовое поле, когда флажок установлен с помощью Click / MouseClick на textbox1 >>> только пустой textbox1.text если нажать на textbox2 >>> только пустое textbox2.text и .....

и в моем приложении у меня есть tabControl1 и 18 групповой блок

как установить все текстовые поля, если флажок установлен пустым, щелкнув / щелкнув мышью текстовое поле?

если мой ответ использует пользовательский контроль, пожалуйста, дайте мне 1 пример кода

Спасибо.

Ответы [ 4 ]

1 голос
/ 12 октября 2011

Чтобы сбросить текст, эта часть кода ниже приведет к сбросу любого текстового поля, по которому щелкнули:

сначала объявите событие Delegate

 private void AllTextBoxes_MouseClick(object sender, MouseEventArgs e)
        {
            if(sender is TextBox)
                ((TextBox)(sender)).Text = "";
        }

, чем назначьте его для каждого текстового поля, вы можетеиспользуйте окно свойств VisualStudio, чтобы сделать это, выделив все текстовые поля и назначив их или сделав это вручную для каждого:

this.textBox2.MouseClick += new System.Windows.Forms.MouseEventHandler(this.AllTextBoxes_MouseClick);

или в FormLoad_Event вы можете сделать это

 foreach (Control ctrl in this.Controls)
            {
                if (ctrl is TextBox)
                {
                    ctrl.MouseClick += new System.Windows.Forms.MouseEventHandler(this.AllTextBoxes_MouseClick);
                }
            }

и сбросить еготекст TextBox внутри GroupBox, такой как

foreach (Control ctrl in groupBox1.Controls)
            {
                if (ctrl is TextBox)
                {
                    MessageBox.Show(ctrl.Name);
                }
            }

, для всех групповых ящиков вы можете:

foreach (Control control in this.Controls)

    {
        if(control is GroupBox)
        {
        foreach (Control ctrl in groupBox1.Controls)
                    {
                        if (ctrl is TextBox)
                        {
                            MessageBox.Show(ctrl.Name);
                        }
                    }
        }
    {
1 голос
/ 12 октября 2011

Не совсем точно, что вы имеете в виду, но если вы хотите перебрать коллекцию текстовых полей, вы можете сделать это следующим образом:

    foreach (Control cntrl in this.Controls)
    {
        if (cntrl is TextBox)
        {
            cntrl.Text = "lold";
        }
    }

где "this" - это контейнер типа формы

0 голосов
/ 12 октября 2011

neurotix шел по правильному пути, но он не будет ловить ваши текстовые поля в дочерних контейнерах, и при этом он не будет обрабатывать вызов правильной функции для установки свойств правильного текстового поля. Лучший способ справиться с этим без пользовательского элемента управления - использовать рекурсивную функцию для назначения обработчика событий.

public void SetTextBoxClickHandler(Control control)
{
    foreach (Control childControl in control.Controls)
    {
        if (childControl is TextBox)
        {
            childControl.Click += this.MyClickHandler;
            continue;
        }
        if (item.Controls == null)
            continue;
        SetTextBoxClickHandler(childControl);
    }
}

private void MyClickHandler(object sender, MouseEventArgs e)
{
    typeof(Form).InvokeMember(string.Format("{0}s", ((Control)sender).Name), BindingFlags.InvokeMethod | BindingFlags.NonPublic, null, null, new object[] { Clipboard.GetText() });
}

private void Form1_Load(object sender, EventArgs e)
{
    SetTextBoxClickHandler(this.Controls);
}

Если вы используете пользовательский элемент управления, это действительно просто, просто наследуйте от TextBox и установите все, чтобы использовать новый элемент управления.

public class ClickableTextBox : TextBox
{
    public ClickableTextBox()
    {
        this.Click += MyClickHandler;
    }
    void setText(string input)
    {
        this.ForeColor = Color.Black;
        this.Text = input;
    }

    private void MyClickHandler(object sender, MouseEventArgs e)
    {
        setText(Clipboard.GetText());
    }
}

Я рекомендую создать пользовательский элемент управления по следующим причинам:

  1. Избегайте снижения производительности при использовании отражения для динамического вызова метода на основе его имени
  2. Избегайте снижения производительности при преобразовании отправителя объекта в элемент управления при каждом нажатии
  3. Избегайте снижения производительности во время цикла инициализации проверки каждого элемента управления и дочернего элемента управления в форме, независимо от того, является ли это TextBox или нет
  4. Меньше кода для обслуживания
  5. Более высокая возможность повторного использования, код формы, должна присутствовать в каждой форме. Если вам потребуется повторно использовать ее в другом проекте или другой форме, было бы намного проще повторно использовать пользовательский элемент управления, а не копировать / вставка кода в каждую форму, которая может потребоваться изменить

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

public void SetTextBoxClickHandler(Control control)
{
    foreach (Control childControl in control.Controls)
    {
        if (childControl is TextBox)
        {
            childControl.Click += this.MyClickHandler;
            continue;
        }
        if (item.Controls == null)
            continue;
        SetTextBoxClickHandler(childControl);
    }
}

private void MyClickHandler(object sender, MouseEventArgs e)
{
    TextBox textBox = sender as Textbox;
    if (textBox == null)
        return;
    textBox.ForeColor = Color.Black;
    textBox.Text = Clipboard.GetText();
}

private void Form1_Load(object sender, EventArgs e)
{
    SetTextBoxClickHandler(this.Controls);
}

или с помощью пользовательского элемента управления:

public class ClickableTextBox : TextBox
{
    public ClickableTextBox()
    {
        this.Click += MyClickHandler;
    }

    private void MyClickHandler(object sender, MouseEventArgs e)
    {
        this.ForeColor = Color.Black;
        this.Text = input;
    }
}

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

0 голосов
/ 12 октября 2011

Из того, что я могу установить, вы хотите, чтобы флажок действовал как переключатель - когда он установлен, удалите содержимое текстового поля, если он не отмечен, скопируйте в него буфер обмена.

Код для этогобудет:

void textBox_MouseClick(object sender, MouseEventArgs e)
{
    textBox tb = (TextBox)sender;
    if (checkBox1.IsChecked)
    {
        tb.Text = "";
    }
    else
    {
        tb.Text = Clipboard.GetText();
    }
}

Тогда вы можете просто заставить все события Click () в текстовых полях указывать на этот единственный метод - ура для повторного использования кода: D

...