2014-10-22 4 views
-3

Я хотел бы создать функцию при вводе текста в начало каждого предложения автоматически становится большим.автоматическая заглавная буква в начале слова при вводе текстового поля

Я безуспешно пытался сделать с VB.Net, но когда я попытался с C#, вы не можете работать должным образом.

Я не знаю, где моя ошибка, я надеюсь, что кто-то из вас может помочь улучшить мой код на C#, спасибо.

Мой функции в классе C# (не удалось):

class ClsText 
{ 
    public int Current_Point = 0; 
    public bool Remove_Handle = false; 
    public string tulis(string text) 
    { 
     string[] validasi_char = new string[] { " ", ".", "(", ")", "!", "@", "$", "%", "&", "*", "/", "?", "+", "-", ",", ">", "<", "'", "~", "`" }; 
     string str_temp = ""; 

     foreach (string vchar in validasi_char) 
     { 
      string[] split_temp = text.Split(validasi_char,StringSplitOptions.); 
      str_temp = ""; 
      foreach (string txt in split_temp) 
      { 
       str_temp = str_temp + txt.Substring(0,0).ToUpper() + txt.Substring(1, txt.Length) + vchar; 
      } 
      text = str_temp.Substring(0, str_temp.Length - 1); 
     } 
     text = text.Substring(0, 0).ToUpper() + text.Substring(1, text.Length); 
     return text; 
    } 
} 

Мой код в текстовое поле C# (не удалось):

  ClsText asd = new ClsText(); 
     if (asd.Remove_Handle == true) 
     { 
      asd.Current_Point = textEdit1.SelectionStart; 
      asd.Remove_Handle = true; 
      textEdit1.Text = asd.tulis(textEdit1.Text); 

     } 
     textEdit1.Select(asd.Current_Point, 2); 

Моя функция в VB.NET (успех):

Public current_point As Integer = 0 
    Public remove_handle As Boolean = False 
    Public Function Tulis(ByVal Text As String) As String 
    Dim validasi_char() As String = {" ", ".", "(", ")", "!", "@", "$", "%", "&", "*", "/", "?", "+", "-", ",", ">", "<", """", "'", "~", "`"} 
    Dim str_temp As String = "" 
    For Each vchar In validasi_char 
     Dim split_temp() As String = Split(Text, vchar) 
     str_temp = "" 
     For Each txt In split_temp 
      str_temp = str_temp + Mid(txt, 1, 1).ToUpper + Mid(txt, 2, txt.Length) + vchar 
     Next 
     Text = Mid(str_temp, 1, str_temp.Length - 1) 
    Next 
    Text = Mid(Text, 1, 1).ToUpper + Mid(Text, 2, Text.Length) 
    Return Text 
End Function 

Мой код в текстовом поле VB.Net (успех):

Private Sub TextEdit1_EditValueChanging(sender As Object, e As DevExpress.XtraEditors.Controls.ChangingEventArgs) Handles TextEdit1.EditValueChanging 
    If remove_handle = True Then GoTo DoCurrentPoint 
    current_point = TextEdit1.SelectionStart 
    remove_handle = True 

    TextEdit1.Text = Tulis(TextEdit1.Text) 

DoCurrentPoint: remove_handle = False TextEdit1.Select (current_point, 0) End Sub

+2

http://www.dotnetperls.com/uppercase- первая буква –

+0

Не публикуйте видео. Отправьте свое фактическое сообщение об ошибке в теле вопроса. –

+0

У меня нет сообщения об ошибке, oke i remove video –

ответ

0

Ваш вопрос немного смущен, но от того, что я понимаю, что вы пытаетесь авто-заглавной буквы из всего, что набирается в текстовом поле.

Вот код для функции в C#, которая принимает строку и возвращает строку, так форматированный

public string AutoCapitalize(string text) 
{ 
    return string.IsNullOrEmpty(text) ? "" : text.Length > 1 ? text[0].ToString().ToUpper() + text.Substring(1) : text[0].ToString().ToUpper(); 
} 

Тогда на событие TextChanged вашего текстового поля вы могли бы назвать это так:

Редактировать : _isCapitalizaingMyTextbox будет частным BOOL объявлен на форме

public void MyTextbox_TextChanged(object sender, EventArgs e) 
{ 
    if (!_isCapitalizaingMyTextbox) 
    { 
     _isCapitalizaingMyTextbox = true; 
     MyTextbox.Text = AutoCapitalize(MyTextbox.Text); 
     _isCapitalizaingMyTextbox = false; 
    } 
} 

Edit: на основе комментариев MikeH Я добавил код, чтобы предотвратить бесконечные циклы в обработчик TextChanged

+0

Это вызовет бесконечный цикл. Вы можете захотеть 'if (MyTextbox.Text! = AutoCapitalize (MyTextbox.Text))' в вашем событии TextChanged – MikeH

+0

Я пробовал и не работал в первом типе всех букв в верхнем и вроде ввода справа налево. спасибо –

0

Если вы поместите следующий код в TextChanged обработки события вашего TextBox, это даст вам желаемые результаты:

Private Sub YourTextBox_TextChanged(sender As Object, e As EventArgs) 
    Dim Pos = YourTextBox.SelectionStart 
    Dim Len = YourTextBox.SelectionLength 

    YourTextBox.Text = System.Text.RegularExpressions.Regex.Replace(YourTextBox.Text, "(?<G1>[,.,(,),!,,$,%,&,*,/,?,+,-,,,>,<,,',~,`] *)(?<G2>[a-z])", Function(m) m.Groups(1).Value & m.Groups(2).Value.ToUpper()) 

    YourTextBox.SelectionStart = Pos 
    YourTextBox.SelectionLength = Len 
End Sub 

В C#:

private void YourTextBox_TextChanged(object sender, EventArgs e) 
{ 
    var Pos = YourTextBox.SelectionStart; 
    var Len = YourTextBox.SelectionLength; 

    YourTextBox.Text = System.Text.RegularExpressions.Regex.Replace(YourTextBox.Text, "(?<G1>[,.,(,),!,,$,%,&,*,/,?,+,-,,,>,<,,',~,`] *)(?<G2>[a-z])", m => m.Groups(1).Value + m.Groups(2).Value.ToUpper()); 

    YourTextBox.SelectionStart = Pos; 
    YourTextBox.SelectionLength = Len; 
} 
+0

ваш код для vb, я хочу для C# спасибо –

+0

Добавлена ​​версия C#. FYI: Есть много бесплатных онлайн-инструментов, которые могут конвертировать между C# и VB.NET. – dotNET

0

Я думаю, что я понимаю, что ты ищешь. Вы хотите, чтобы текстовое поле автоматически заглаживало первую букву каждого предложения. У меня есть решение, которое должно работать по вашему желаемому желанию. Во-первых, вы должны создать OnTextBoxChanged событие:

private void OnTextChanged(object sender, EventArgs e) 
{ 
    TextBox myTextArea = (sender as TextBox); 
    if (myTextArea.Text.Length > 3) 
    { 
     char period = myTextArea.Text.ElementAtOrDefault(myTextArea.Text.Length - 3); 
     char space = myTextArea.Text.ElementAtOrDefault(myTextArea.Text.Length - 2); 
     char newestCharAdded = myTextArea.Text.Last(); 

     if(period == '.' && space == ' ' && char.IsLetter(newestCharAdded)) 
     { 
      CapitalizeFunction(myTextArea, newestCharAdded); 
     } 

    } 
    else if (myTextArea.Text.Length == 1) 
    { 
     char newestCharAdded = myTextArea.Text.Last(); 

     if(char.IsLetter(newestCharAdded)) 
     { 
      CapitalizeFunction(myTextArea, newestCharAdded);      
     } 

    } 

} 

Это будет контролировать все символы, вводимые в текстовое поле, а также определить конец предложения периодом. Было бы достаточно легко включить больше символов для пунктуации. Я также включил первый символ пользователя для ввода для согласованности.Вот функция поддержки:

private void CapitalizeFunction(TextBox myTextArea, char newestCharAdded) 
{ 
    // Take out the lowercase letter 
    myTextArea.Text = myTextArea.Text.Remove(myTextArea.Text.LastIndexOf(newestCharAdded), 1) + char.ToUpper(newestCharAdded); 

    // Returns the focus to the end of the string 
    myTextArea.SelectionStart = myTextArea.Text.Length; 
    myTextArea.SelectionLength = 0; 
} 

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

MyTextBox.TextChanged += OnTextChanged; 
+0

Я пробовал ваш код, но не работал Спасибо: '( –

+0

Вы прикрепляли обработчик событий в своем конструкторе форм? Это просто не работало, или он сработал? – Ckrempp

0

Б ToTitleCase из CurrentCulture.TextInfo

public void textB_TextChanged(object sender, EventArgs e) 
{ 
    MyTextbox.Text = ToTitleCase(MyTextbox.Text); 
} 

public static string ToTitleCase(string stringToConvert) 
{ 
    return Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(stringToConvert); 
} 
Смежные вопросы