2014-06-09 2 views
-1

여기에 문제가 있습니다 : 전화 마스크에 MaskedTextBox를 사용하고 있습니다. 그러나 마스크는 2 가지 종류의 마스크를 받아 들여야 만합니다. 기본 마스크는 (00) 0000-0000과 같지만 때로는 마스크가이 (00) 0000-00000과 같이 하나 더 많은 슬롯을 가질 필요가 있습니다. 이 프로세스는 동적이어야합니다. 사용자가 10자를 초과하여 입력하면 MaskedTextBox는 자신의 마스크를 변경합니다. 얼마 전에 VB.Net을 사용하여 만들었지 만 지금은 C#을 사용하여이 작업을 수행해야합니다.MaskedTextBox의 마스크를 동적으로 변경하는 방법

예전에 작성한 VB.NET을 사용한 예입니다.

Private Sub MaskedTextValidacao_Validating(sender As System.Object, e As System.ComponentModel.CancelEventArgs) Handles Me.Validating 
    Me.TextMaskFormat = MaskFormat.ExcludePromptAndLiterals 

    If Me.Text.Contains(" ") Or Me.Text.EndsWith(" ") Or Me.Text.StartsWith(" ") Then 
     Me.Text.Replace(" ", "") 
    End If 

    If Me.Text.Count.Equals(10) Or Me.MaskCompleted.Equals(True) Then 
     Me.BackColor = Color.LightGreen 
     Me.Text = Me.Text.TrimEnd 
    ElseIf Me.Text = "" Then 
     Me.BackColor = Color.White 
    Else 
     Me.BackColor = Color.LightCyan 
    End If 

End Sub 

이제 더 나은 것을 만들고 C#을 사용하려고합니다.

나를 도와 줄 사람이 있습니까? 내 말은, 그냥 붙 잡았으니 내게 빛을주세요!

+0

문자열은 불변이다. 'Replace()'호출은 쓸모가 없다. 그것의'If'는 더 쓸모가 없습니다. – SLaks

+0

당신은 열거 형을 사용하거나 생성하는 데 익숙합니까? 그런 식으로 마스크를 만들 수 있습니다. – MethodMan

답변

0

이처럼 만들 수 있습니다

public class CustomMaskedBox : MaskedTextBox 
{ 
    public CustomMaskedBox() 
    { 
     this.MaskInputRejected += CustomMaskedBox_MaskInputRejected; 
     this.Enter += CustomMaskedBox_Enter; 
     this.Leave += CustomMaskedBox_Leave; 
    } 

    void CustomMaskedBox_Leave(object sender, EventArgs e) 
    { 
     if (this.MaskFull) 
     { 
      this.BackColor = Color.LightGreen; 
     } 
     else 
     { 
      this.Mask = "(00) 0000-0000"; 
      this.BackColor = Color.LightGreen; 
     } 

     if (!this.MaskCompleted) 
     { 
      this.BackColor = Color.LightCoral; 
     } 

    } 

    void CustomMaskedBox_Enter(object sender, EventArgs e) 
    { 
     this.BackColor = Color.LightBlue; 
    } 

    void CustomMaskedBox_MaskInputRejected(object sender, MaskInputRejectedEventArgs e) 
    { 
     if (this.MaskFull) 
     { 
      this.Mask = "(00) 0000-00000"; 
      this.BackColor = Color.LightYellow; 
     } 
    } 
} 
+0

고마워, 내가 할께! – APS

0

당신은 내가 생각이 찾고있는 (곳 maskedTextBox1 양식에 컨트롤입니다) : 사용자가 값을 입력하면 양식

this.maskedTextBox1.Mask = "(00) 0000-0000"; 

의 마스크에 기본값을 시작하고 마스크는 가득 그래서 때 마스크를 다시 바꿀 수 있습니다 :

private void maskedTextBox1_KeyDown(object sender, KeyEventArgs e) 
    { 
     if (this.maskedTextBox1.MaskFull) 
     { 
      this.maskedTextBox1.Mask = "(00) 0000-00000"; 
     } 
    } 

키 누르기/키 누르기 이벤트를 사용자 정의하여 동적으로 값을 가져올 수 있습니다.

+0

추가 문자를 어디에 추가하면 안 될까요? – Bit

+0

마스크는 사용자가 입력 할 수있는 문자를 지정하므로 질문을 이해할 수 없으므로 자세히 설명해주십시오. – Avneesh

+0

제 질문은 입력이이 경우 마스크에 맞는지 확인해야하지 않습니까? 두 마스크 중 아무 것도 제대로 입력하지 않으면 어떻게 될까요? – Bit

0

답해 주셔서 감사합니다. 나는 무언가를 시도하고 일하고있다.

필드가 맞는지 여부를 식별하는 데 사용되는 색상입니다. 또한 마스크를 수정합니다. 대부분은 Leave Event에 있습니다.

생각한다

  1. 사용자가 10 자리 ((00) 0000-0000
  2. 사용자는
  3. 그리고 경기장을 떠나지 사용자가 필드에 다시 입력하고 새로운 숫자를 추가로 숫자를 입력 00) 0000-00000
  4. 사용자는 사용자가 필드에 입력, 다시 필드
  5. 을 떠나 몇 가지 숫자를 제거 (00) 0000-0000

EVENT LEAVE는이 ​​문제를 처리 할 수 ​​있습니다. 나는 단지 "Professional Way"에서 어떻게 할 수 있는지 알고 싶습니다. 이 MaskedTextBox는 다른 사용자 정의 컨트롤과 함께 클래스의 일부가 될 것입니다. 내가했던 것처럼 더 좋은 방법이 있습니다. ?

내가 작성한 코드는 다음과 같습니다. 감사합니다 !!

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Drawing; 
using System.Data; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 

namespace MaskedTextBox 
{ 
public partial class UserControl1 : UserControl 
{ 
    public UserControl1() 
    { 
     InitializeComponent(); 
    } 

    private void maskedTextBox1_MaskInputRejected(object sender, MaskInputRejectedEventArgs e) 
    { 
     if (maskedTextBox1.MaskFull) 
     { 
      maskedTextBox1.Mask = "(00) 0000-00000"; 
      maskedTextBox1.BackColor = Color.LightYellow; 
     } 
    } 


    private void maskedTextBox1_Enter(object sender, EventArgs e) 
    { 
     maskedTextBox1.BackColor = Color.LightBlue; 
    } 


    private void maskedTextBox1_Leave(object sender, EventArgs e) 
    { 

     if (maskedTextBox1.MaskFull) 
     { 
      maskedTextBox1.BackColor = Color.LightGreen; 
     } 
     else 
     { 
      maskedTextBox1.Mask = "(00) 0000-0000"; 
      maskedTextBox1.BackColor = Color.LightGreen; 
     } 

     if (!maskedTextBox1.MaskCompleted) 
     { 
      maskedTextBox1.BackColor = Color.LightCoral; 
     } 
    } 
} 
} 
+0

안녕하세요, MasketTextBox에서 컨트롤을 파생시키지 않으시겠습니까? 그러면 컨트롤에 가능한 속성이있을 수 있습니다. 양식을 사용자 정의하십시오. 이 모든 논리는 컨트롤 자체 안에있을 수 있으며 완전히 재사용 할 수 있습니다. – Avneesh

+0

VB.Net을 사용하여 상속과 함께 사용했습니다. 하지만 C#에서는 아직 어떻게해야할지 모릅니다. 내가 만든 것은 맞춤 컨트롤이며, 여기에서 MaskedTextBox를 추가 한 다음 일부 이벤트를 코딩합니다. 그 후에, 나는 나의 양식과 다른 것들을 가지고있는 나의 메인 솔루션으로 그 프로젝트를 가져올 것이다. – APS

관련 문제