2015-08-19 6 views
1

ОК, поэтому я пытаюсь применить формат учетных данных для всех текстовых полей в моей форме.Как применить метод форматирования текстового поля ко всем элементам управления текстовыми полями

Теперь, я сделал некоторые исследования здесь и нашел это сообщение, которое поможет мне установить format.

И затем я нашел другое сообщение, чтобы применить формат для всего текстового поля controls на форме без добавления кода format для всех элементов управления.

Ну, дело в том, что код на format использует имя элемента управления, которое привяжет его к одному элементу управления текстовым полем. Вместо этого я попробовал имя элемента управления (TextoBox), и оно также потерпело неудачу.

Существует еще одна проблема, которую следует учитывать, даже если мне удастся преодолеть вышеуказанную проблему, код от format - это событие, названное в честь имени элемента управления, поэтому я не думаю, что он будет работать, если я применил его к класс или метод и вызвать его.

Хотя у меня уже есть решение того, что я хочу, я хотел бы знать, есть ли более быстрый способ применить его, что не добавит столько строк в мой код. Попытка научиться тому, как легче читать, делая меньше с большим количеством. Есть рекомендации?

Спасибо за чтение.

+0

Если учет действительно важен, я предложил бы использовать десятичный тип вместо Double. Двойной будет быстрее, но Десятичный будет более точным. Выясните, какой компромисс имеет смысл и принимает решение на основе этого. – Cory

ответ

1

Похоже, что у вас есть все части, просто нужно помочь собрать ее вместе. Для ControlName вы можете передать объект отправителя элементу управления и получить доступ к свойству Name.

void SetProperty(Control ctr) 
{ 
    foreach (Control control in ctr.Controls) 
    { 
     if (control is TextBox) 
     { 
      control.Leave += control_Leave; 
     } 
     else 
     { 
      if (control.HasChildren) 
      { 
       SetProperty(control); 
      } 
     } 
    } 
} 

void control_Leave(object sender, EventArgs e) 
{ 
    var textBox = sender as TextBox; 
    Double value; 
    if (Double.TryParse(textBox.Text, out value)) 
     textBox.Text = String.Format(System.Globalization.CultureInfo.CurrentCulture, "{0:C2}", value); 
    else 
     textBox.Text = String.Empty; 
} 

Использование:

SetProperty(this); 

Кроме того, из моего комментария на OP: Если учет действительно важно, я предложил бы использовать десятичного типа вместо Double. Двойной будет быстрее, но Десятичный будет более точным. Выясните, какой компромисс имеет смысл и принимает решение на основе этого.


Редактировать в комментариях:

myTextBox.Leave -= control_Leave 

Если вы знаете имя элемента управления, выше будет работать. Вам нужно будет сделать это после использования SetProperty (это). Если вы хотите обработать это внутри метода SetProperty(), выполните проверку на control.Name == "myTextBox".

+0

Он отлично работал! Большое спасибо за то, что помогли мне! –

+0

Теперь, быстрый вопрос, что, если я хочу иметь один набор управления текстовым полем без форматирования? Я пробовал: Mytextbox.Text = String.Format ("{0}", txbTrackingID.Text); играл с некоторыми вариациями вышеизложенного и некоторой другой информацией, которую я нашел в CurrentCulture на MSDN, но это не сработало. –

+0

Вам понадобится какой-то способ определить это текстовое поле и обработать его по-разному. Если вы знаете элемент управления, вы можете отцепить четный обработчик. См. Мое редактирование. – Cory

0

Вы можете подписаться на несколько события управляет (которые используют одни и те же аргументы) в тот же обработчик событий:

public YourFormConstructor() 
{ 
    foreach(var textbox in form.Controls.OfType<TextBox>()) 
     textbox.Leave += FormatCurrencyText; 
} 


private void FormatCurrencyText(object sender, EventArgs e) 
{ 
    var textbox = sender as TextBox; 
    Double value; 
    if (Double.TryParse(textbox.Text, out value)) 
     textbox.Text = String.Format(System.Globalization.CultureInfo.CurrentCulture, "{0:C2}", value); 
    else 
     textbox.Text = String.Empty; 
}