2013-10-07 2 views
3

У меня есть серия текстовых полей и меток с текстовым полем 1-9 и с надписью 1 до 9. С помощью щелчка на любой ярлыке я очищаю соответствующее текстовое поле.Как обрабатывать группу текстовых полей/ярлыков в массиве

Я создал метод, но это похоже на игрушку с детскими игрушками в сравнении с моими процедурами в TP или VB. Должен быть кратчайший хорошо структурированный способ. Любая идея будет очень оценена?

Что я сделал :)))

private void label1_Click(object sender, EventArgs e) 
    { 
     textBox1.Text = "" ; 
    } 
    private void label2_Click(object sender, EventArgs e) 
    { 
     textBox2.Text = "" ; 
    } 
    private void label3_Click(object sender, EventArgs e) 
    { 
     textBox3.Text = "" ; 
    } 
    private void label4_Click(object sender, EventArgs e) 
    { 
     textBox4.Text = "" ; 
    } 
    private void label5_Click(object sender, EventArgs e) 
    { 
     textBox5.Text = "" ; 
    } 
    private void label6_Click(object sender, EventArgs e) 
    { 
     textBox6.Text = "" ; 
    } 
    private void label7_Click(object sender, EventArgs e) 
    { 
     textBox7.Text = "" ; 
    } 
    private void label8_Click(object sender, EventArgs e) 
    { 
     textBox8.Text = "" ; 
    } 
    private void label9_Click(object sender, EventArgs e) 
    { 
     textBox9.Text = "" ; 
    } 
+0

Даже если вы пишете «общий» метод для обработки события щелчка вы все еще будете нуждаться для регистрации этого метода для каждой из ваших меток. Затем вы замените прямой вызов 'textBoxX.Text =" ";' прямым вызовом метода, который будет делать именно это ... –

+0

Используете ли вы WPF или окна? Пожалуйста, обновите теги –

ответ

2

Вы можете использовать Tag свойство для метки управления. Затем вы можете прокручивать их (желательно, начиная с большей части родительского элемента управления и с помощью рекурсии! Или, если вы уверены, из контейнера, в котором содержится группа элементов управления).

// assign tag "1" to "9" to labels and texboxes 
// subscribe all labels to same event label_Click 
private void label_Click(object sender, EventArgs e) 
{ 
    string id = (sender as Control).Tag.ToString(); 
    // iterate or recurse 
    FindTextboxWithId(id).Clear(); 
} 
// it shouldn't be hard to write FindTextboxWithId 

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

public TextBox[] _textBox; 

public Form1() 
{ 
    InitializeComponent(); 
    _textBox = new TextBox[] {textBox1, texBox2, ..., textBox9}; 
} 

// assign tag "0" to "8" to labels and texboxes 
// subscribe all labels to same event label_Click 
private void label_Click(object sender, EventArgs e) 
{ 
    int index = int.Parse((sender as Label).Tag); 
    _textBox[index].Clear(); 
} 

Третья возможность заключается в использовании контейнеров, например TableLayoutPanel. Вы можете создать контейнер с двумя столбцами, где первый столбец равен Label, а второй - TextBox. Затем просто заполните 9 строк и получите fun в OnClick (чтобы найти sender положение, чтобы найти положение texbox, найти текстовое поле и, наконец, очистить его).

+0

Мне нравится решение, которое использует теги, это был бы мой первый выбор. Пример реализации FindTextBoxWithID: TextBox FindTextBoxWithID (Control parentContainer, string txbID) { return parentContainer.Controls.OfType () .Where (a => ((string) a.Tag) .Equals (txbID)). FirstOrDefault() ; } – Arie

+0

http://www.turcguide.com/stack/lblidx.jpg Я получаю 2 следующих erros «Наилучшее перегруженное соответствие метода для int.parse (string) имеет некоторые аргументы invalide» и Argument '1': can не конвертировать из «объекта» в «строку». –

+0

Спасибо. Я использовал два метода для создания своего. Я был остерегался обхода и контроля таким образом. –

0

Возможно, один обработчик для всех и с помощью Controls.Find:

private void label_Click(object sender, EventArgs e) 
{ 
    var label = (Label)sender; 
    string lastDigits = new string(label.Name.SkipWhile(c => !Char.IsDigit(c)).ToArray()); 
    var textBox = Controls.Find("textBox" + lastDigits, true).FirstOrDefault() as TextBox; 
    if(textBox != null) 
     textBox.Text = "" ; 
} 

Хотя, опираясь на те бессмысленные имена переменных не лучшая практика.

0

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

Control Class, поэтому при нажатии на этикетке вы должны искать тег TextBox в , что вы будете установить для каждого TextBox ,

foreach (Control C in this.Controls) 
{ 
    //Code Here... 

} 
0

Быстрое решение:

переименованиих ярлыков, как: label_1, label_2 ... label_22, то вы можете использовать следующее общий обработчика событий для всех кликов.

Улучшение этого было бы просто передать labelNr отдельному номеру, который затем использовал бы это, чтобы найти текстовое поле по имени, вместо того, чтобы использовать swith, чтобы проверить все из них. У меня нет времени, чтобы попробовать, что сейчас, но я уверен, что вы можете понять это как-то ..;)

private void label1_Click(object sender, EventArgs e) 
    { 
     var labelNr = ((Label) sender).Name.Split('_').Last(); 

     switch (labelNr) 
     { 
      case "1": 
       textBox_1.Clear(); 
       break; 
      case "22": 
       textBox_22.Clear(); 
       break; 
     } 
    } 

Update: Кажется Тим Schmelter был ответ здесь. Чтобы украсть у него небольшую деталь: используйте Controls.Find("textBox" + labelNr, true), как он показывает выше, а не переключатель здесь, и вы должны быть установлены.

0

А Javascript решение:

<asp:TextBox ID="txt1" runat="server"></asp:TextBox> 
    <asp:Label ID="lbl1" runat="server" AssociatedControlID="txt1" onclick="clearTextBox(this)">Clear</asp:Label> 

function clearTextBox(sender){ 
     var assocControlId = sender.htmlFor; 
     var el = document.getElementById(assocControlId); 
     if (el) 
      el.value = ''; 
    } 
+0

Хотя явным образом не указано, я думаю, что он ссылается на приложение winforms, а не на веб-приложение. –

+0

Ooops :) Извините, если это так (пиво). – iTURTEV

+0

Никаких оправданий не требуется. Я просто указывал на сферу вопроса. Пиво всегда приветствуется. :) –

0

Я хотел бы предложить вам создать UserControl

  • Устройте себе Контрактное и TextBox
  • обрабатывать событие label_click

и использует UserControl на форме вместо этого.

что-то вроде этого:

public class LableAndTextBox : UserControl 
{ 
public LableAndTextBox() 
{ 
    InitializeComponents(); 
} 

public void label_Click(object sender, EventArgs e) 
{ 
    textBox.Text = string.Empty; 
} 
} 

Edit - убедитесь, что вы создаете UserControl, в отдельной сборке - для компиляции причины ..

0

С двумя решениями @sinatr я создал один другой потому что оба имеют сообщение об ошибке.

private void label_Click (object sender , EventArgs e) 
    { 
     string id = (sender as Control).Tag.ToString(); 
     int newidx = Convert.ToInt32(id); 
     _textBox[newidx].Clear(); 
    } 

ЭТО РАБОТЫ!

Несомненно! Я добавил Juste здесь это

namespace WindowsFormsApplication1 
{ 
public partial class 
DefBiscuit : Form 
{ 
    public TextBox[] _textBox; 

И

В form_load это

_textBox = new TextBox[] { textBox1, textBox2, textBox3, textBox4, textBox5, textBox6, textBox7, textBox8, textBox9 };

0

Если вам не нравится писать код много, у меня есть программа может написать это быстро , Например, если вы вводите «lable1.Text = textbox1.Text;» и «15» программа будет выводить в текстовое поле:

lable1.Text = textbox1.Text; 
lable2.Text = textbox2.Text; 
lable3.Text = textbox3.Text; 
lable4.Text = textbox4.Text; 
lable5.Text = textbox5.Text; 
lable6.Text = textbox6.Text; 
... 
lable15.Text = textbox15.Text; 

Go здесь, чтобы узнать больше и скачать: Download Counter Replacer

Смежные вопросы