c# winforms 프로그램의 텍스트 상자에서 텍스트를 강조 표시하려면 어떻게해야합니까?

StackOverflow https://stackoverflow.com/questions/2412678

문제

여러 텍스트 상자가있는 C# Winforms 프로그램이 있습니다. 각 상자의 속성을 사용하여 텍스트를 배치하여 사용자에게 값이 무엇인지 설명했습니다. 사용자가 해당 상자를 선택할 때마다 텍스트를 강조 표시하고 싶습니다. 탭 또는 마우스로 클릭하십시오. 텍스트 상자의 값이 외부의 어딘가에있는 값을 표시하는 방법이 있다면이 작업을 수행 할 필요가 없습니다.

textbox.select 메소드를 시도했지만 효과가 없었습니다. 동일합니다 이것.

여기에 있습니다 스크린 샷 내 프로그램의.

내 코드 :

    private void grapplingText1_MaskInputRejected(object sender, MaskInputRejectedEventArgs e)
    {
        grapplingText1.SelectionStart = 0;
        grapplingText1.SelectionLength = grapplingText1.Text.Length;

이것이 더 필요합니까, 아니면 더 필요합니까?

도움이 되었습니까?

해결책

당신은 어떻습니까? ToolTip 에게 TextBox 그리고 그 내부의 모든 "텍스트 박스가 무엇인지 이야기하십시오.

그냥 드래그 앤 드롭 ToolTip 양식 내부. 그리고 각각 TextBox 속성 기타 섹션에 추가 항목이 있어야합니다 ToolTip ~에 toolTip1 (또는 이름을 바꾸면 이름이 무엇이든).

그런 다음 사용자가 호버링하면 TextBox (읽기 전용/비활성화 TextBox 툴팁을 표시하지 않는 것 같고 1 초의 툴팁이 적절한 정보로 표시되어야합니다.

당신은 결국 또는 더 나은 것을 가질 수 있습니다 Label 옆에 TextBox 무엇인지 말하지만 a ToolTip 또한 사용자에게 더 많은 정보를 설명하는 것이 좋습니다.

Watermark로 작업을 수행하려면 이벤트를 설정하고 Selectall 등을 관리하여 먼 길을 갈 필요가 없습니다. 새 watermark.cs 파일을 만들고이 코드로 바꾸십시오. 프로그램 네임 스페이스와 일치하도록 네임 스페이스를 변경했는지 확인하십시오.

#region
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

#endregion

namespace Watermark {
    public static class TextBoxWatermarkExtensionMethod {
        private const uint ECM_FIRST = 0x1500;
        private const uint EM_SETCUEBANNER = ECM_FIRST + 1;
        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] private static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, uint wParam, [MarshalAs(UnmanagedType.LPWStr)] string lParam);
        public static void SetWatermark(this TextBox textBox, string watermarkText) {
            SendMessage(textBox.Handle, EM_SETCUEBANNER, 0, watermarkText);
        }
    }
}
   internal class WatermarkTextBox : TextBox {
    private const uint ECM_FIRST = 0x1500;
    private const uint EM_SETCUEBANNER = ECM_FIRST + 1;
    private string watermarkText;
    public string WatermarkText {
        get { return watermarkText; }
        set {
            watermarkText = value;
            SetWatermark(watermarkText);
        }
    }
    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] private static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, uint wParam, [MarshalAs(UnmanagedType.LPWStr)] string lParam);
    private void SetWatermark(string watermarkText) {
        SendMessage(Handle, EM_SETCUEBANNER, 0, watermarkText);
    }
}

당신의 형태로 당신은 다음과 같이 활성화합니다.

textBoxYourWhatever.SetWatermark("Text that should display");

그것은 거기에 오래 머물러 있습니다 TextBox 비었다. 사용자가 들어올 때 TextBox 텍스트가 사라집니다. 언제 다시 나타납니다 TextBox (사용자 또는 자동으로) 청소됩니다. 특별 행사 등이 필요하지 않습니다.

편집하다:

디자이너에서 사용할 수있는 새로운 WaterMarkTexBox를 사용하는 옵션을 제공하는 내부 클래스 WaterMarkTextBox도 추가했습니다. 그런 다음 디자이너에게 드래그 앤 드롭하여 사용하십시오. 일반 텍스트 박스처럼 작동하면 추가 필드 워터 마크 텍스트를 제공합니다.

나는 여전히 첫 번째 방법을 선호합니다. GUI를 다시 재건하지 않습니다.

다른 팁

선택하려는 텍스트 금액을 알고 있으면 .select가 작동한다고 생각합니다.

.selectall (); 그것은 당신을 위해 작동해야합니다

컨트롤에 초점을 맞추려면 TextBox.Focus ()를 사용해야하며 자동으로 작동하지 않으면 Enter () 이벤트에서 selectall () 메소드를 호출해야합니다.

private TextBox1_Enter(object sender, EventArgs e) {    
    TextBoxTextHighlight(sender, null);
}

private TextBox2_Enter(object sender, EventArgs e) {
    TextBoxTextHighlight(sender, null);
}

private TextBox3_Enter(object sender, EventArgs e) {
    TextBoxTextHighlight(sender, null);
}

// And so forth...

private void TextBoxTextHighlight(object sender, EventArgs e) {
    (sender as TextBox).SelectAll();
}

이 메소드를 사용하면 모든 TextBoxX_Enter () 이벤트 핸들러에서 호출 할 수 있습니다.

그렇지 않으면, 새로운 USERCONTROL을 만들고, 창조시 원하는대로 호출 할 수도 있습니다. 그런 다음 프로젝트에 생성 될 때 코드를 편집 한 다음 TextBox 클래스에 의해 UserControl 클래스의 유전성을 대체 한 다음 기본 동작을 정의 할 수도 있습니다. enter () 이벤트 에이 호출을 선택할 수 있고, 셀렉트럴 () 메소드로의 호출과 같은 가상으로 만들어주고 생성자 내에서 이벤트 핸들러를 다음과 같은 등으로 구독 할 수 있습니다.

public partial class CustomTextBox : TextBox {
    public CustomTextBox() 
        : base() {
        this.Enter += new EventHandler(Enter);
    }

    protected virtual Enter(object sender, EventArgs e) {
        this.SelectAll();
    }
}

나는 그것을 즉시 썼으므로 아마도 몇 가지 수정이 필요할 수 있지만 아이디어를 얻을 수 있습니다. 그러나 나는 당신의 적절한 상황을 위해 그것을 할 가치가 없다면 당신에게 그렇게하도록 조언하지 않습니다. 더 단순할수록 더 간단하고 가장 간단한 것은 각 양식의 텍스트 상자에 대한 이벤트 핸들러를 작성한 다음 TextBoxTexThighlight () 메소드를 호출하는 것입니다.

TextBox의 이름이 있다고 가정하십시오 'mytextbox'

포커스 이벤트를 처리하기위한 방법을 작성할 수 있습니다.

private void MyTextBox_GotFocus(object sender, EventArgs e)
{
    MyTextBox.SelectionStart = 0;
    MyTextBox.SelectionLength = MyTextBox.Text.Length;
    MyTextBox.Select();
}

이벤트 핸들러도 추가해야합니다.

this.MyTextBox.GotFocus += new System.EventHandler(this.MyTextBox_GotFocus);

이것은 작동해야합니다 ...

편집하다

다른 텍스트 상자에 동일한 메소드를 사용할 수 있습니다. 이벤트 핸들러를 추가하십시오.

this.MyTextBox2.GotFocus += new System.EventHandler(this.MyTextBox_GotFocus);
this.MyTextBox3.GotFocus += new System.EventHandler(this.MyTextBox_GotFocus);
this.MyTextBox4.GotFocus += new System.EventHandler(this.MyTextBox_GotFocus);
//...

일반적으로 사용자에게 무슨 일이 일어나는지 설명하고 싶다면 안에 텍스트 상자, 당신은 a를 배치합니다 상표 바로 위 (또는 측면)를 제어하십시오.

때로는 화면을 저장하기 위해 텍스트에 대한 설명을 할 수 있습니다. 내부에 텍스트 상자 자체의. 이것을 a라고합니다 양수표.

항목을 호버링 할 때 추가 정보를 표시하는 가장 간단한 방법은 툴팁을 사용하는 것입니다. 비슷한 워터 마크 접근법을 시도했지만이를 구현할 수있는 즉각적인 방법이 없다는 것을 알게되었습니다. 툴팁은 적합한 대안으로 보였습니다.

다음 링크에서 구현하는 방법을 볼 수 있습니다.툴팁 구현

내 응용 프로그램에서 하이라이트 메소드를 Focus-> Enter 이벤트에 첨부하는 것이 selectall () 메소드와 잘 작동하지 않음을 발견했습니다. 대신 액션을 사용했습니다 -> 클릭 (마우스에만 효과가 있다고 생각합니다)은 하이라이트 방법을 첨부했습니다. 이제 그것은 매력처럼 작동합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top