문제

캐럿을 마스크 된 텍스트 상자에 배치하기 위해 기본 동작을 무시할 수 있기를 원합니다.

기본값은 마우스를 클릭 한 곳에 캐럿을 배치하는 것입니다. 마스크 된 텍스트 상자에는 이미 마스크로 인해 문자가 포함되어 있습니다.

나는 당신이 이것에 대해 언급했듯이, 캐럿을 숨길 수 있다는 것을 알고 있습니다. 게시하다, 컨트롤이 초점을 맞출 때 텍스트 상자의 시작 부분에서 간병을 배치하는 것과 비슷한 것이 있습니까?

도움이 되었습니까?

해결책

이것은 트릭을 수행해야합니다.

    private void maskedTextBox1_Enter(object sender, EventArgs e)
    {
        this.BeginInvoke((MethodInvoker)delegate()
        {
            maskedTextBox1.Select(0, 0);
        });         
    }

다른 팁

Abbas의 작업 솔루션을 개선하려면 다음을 시도하십시오.

private void ueTxtAny_Enter(object sender, EventArgs e)
{
    //This method will prevent the cursor from being positioned in the middle 
    //of a textbox when the user clicks in it.
    MaskedTextBox textBox = sender as MaskedTextBox;

    if (textBox != null)
    {
        this.BeginInvoke((MethodInvoker)delegate()
        {
            int pos = textBox.SelectionStart;

            if (pos > textBox.Text.Length)
                pos = textBox.Text.Length;

            textBox.Select(pos, 0);
        });
    }
}

이 이벤트 핸들러는 여러 상자와 함께 재사용 할 수 있으며 입력 된 데이터 중간에 커서를 배치하는 사용자의 능력을 제거하지 않습니다 (즉, 상자가 비어 있지 않을 때 커서를 제로에 테일로 강제하지 않습니다).

나는 이것이 표준 텍스트 상자를 더 밀접하게 모방 한 것으로 나타났습니다. 남은 글리치 만 (내가 볼 수있는) 'ENTER'이벤트 후에 XE가 마우스를 잡고 끝까지 드래그하는 경우에도 나머지 (빈) 마스크 프롬프트를 선택할 수 있다는 것입니다.

이는 MaskedTextboxes의 기본 동작에 비해 크게 개선되었습니다. 감사!

나는 Ishmaeel의 훌륭한 솔루션을 몇 가지 변경했습니다. 커서를 이동 해야하는 경우에만 BeginVoke를 호출하는 것이 좋습니다. 또한 다양한 이벤트 핸들러의 메소드를 호출하므로 입력 매개 변수는 Active MaskedTextBox입니다.

private void    maskedTextBoxGPS_Click( object sender, EventArgs e )
{
    PositionCursorInMaskedTextBox( maskedTextBoxGPS );
}


private void    PositionCursorInMaskedTextBox( MaskedTextBox mtb )
{
  if (mtb == null)    return;

  int pos = mtb.SelectionStart;

  if (pos > mtb.Text.Length)
    this.BeginInvoke( (MethodInvoker)delegate()  { mtb.Select( mtb.Text.Length, 0 ); });
}

부분 답변 : Mouseclick 이벤트에서 0 길이 선택을 할당하여 CARET을 배치 할 수 있습니다.

MaskedTextBox1.Select(5, 0)

... 텍스트 상자의 5 번째 캐릭터 위치로 캐럿을 설정합니다.

이 답변이 부분적 인 이유는, Caret가있는 위치를 결정하는 일반적으로 신뢰할 수있는 방법을 생각할 수 없기 때문입니다. ~해야 한다 클릭에 위치하십시오. 이것은 일부 마스크에서는 가능할 수 있지만 일부 일반적인 경우 (예 : 미국 전화 번호 마스크)에서는 실제로 마스크를 분리하고 문자를 실제 사용자 입력으로부터 쉽게 분리하는 방법을 생각할 수 없습니다 ...

//not the prettiest, but it gets to the first non-masked area when a user mounse-clicks into the control
private void txtAccount_MouseUp(object sender, MouseEventArgs e)
{
  if (txtAccount.SelectionStart > txtAccount.Text.Length)
    txtAccount.Select(txtAccount.Text.Length, 0);
}

이 솔루션은 저에게 효과적입니다. 시도해보세요.

private void maskedTextBox1_Click(object sender, EventArgs e)
{

 maskedTextBox1.Select(maskedTextBox1.Text.Length, 0);
}

클릭 이벤트를 사용하여 작업을 시작했습니다 .... 호출이 필요하지 않았습니다.

 private void maskedTextBox1_Click(object sender, EventArgs e)
{
     maskedTextBox1.Select(0, 0);              
}

이 솔루션은 Gman Cornflake와 같은 MaskedTextbox의 클릭 방법을 사용합니다. 그러나 데이터가 포함 된 후에는 사용자가 MaskedTextbox 내부를 클릭하고 커서가있는 곳에 머무를 수 있어야합니다.

아래의 예는 프롬프트와 리터럴을 끄고 MaskedTextBox의 데이터 길이를 평가하고 0과 같으면 커서를 시작 위치에 놓습니다. 그렇지 않으면 커서를 시작 위치에 놓는 코드를 우회합니다.

코드는 VB.NET 2017에 작성되었습니다. 이것이 도움이되기를 바랍니다!

Private Sub MaskedTextBox1_Click(sender As Object, e As EventArgs) Handles MaskedTextBox1.Click
    Me.MaskedTextBox1.TextMaskFormat = MaskFormat.ExcludePromptAndLiterals
    If Me.MaskedTextBox1.Text.Length = 0 Then
        MaskedTextBox1.Select(0, 0)
    End If
    Me.MaskedTextBox1.TextMaskFormat = MaskFormat.IncludePromptAndLiterals
End Sub
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top