C# 设置文本框插入符号的最后可能位置

C# 设置文本框插入符号的最后可能位置,c#,winforms,textbox,C#,Winforms,Textbox,我有一个textbox和一个TextChanged事件,每当用户键入某个内容时,如果文本框的末尾没有反斜杠,就会自动添加反斜杠 这可以正常工作,除非用户将光标放在反斜杠后的文本框末尾并键入,它会将反斜杠向左移动,添加新文本,然后在末尾添加另一个反斜杠 例如,用户输入C,然后出现C\。现在,如果他们在\后单击并键入a,就会出现C\a\,而我想要的只是Ca\ 因此,如果用户试图在反斜杠之后设置光标,我需要一种方法将光标在文本框中的最后位置设置为反斜杠之前 以下是textchanged事件的代码: p

我有一个
textbox
和一个
TextChanged
事件,每当用户键入某个内容时,如果文本框的末尾没有反斜杠,就会自动添加反斜杠

这可以正常工作,除非用户将光标放在反斜杠后的文本框末尾并键入,它会将反斜杠向左移动,添加新文本,然后在末尾添加另一个反斜杠

例如,用户输入
C
,然后出现
C\
。现在,如果他们在
\
后单击并键入
a
,就会出现
C\a\
,而我想要的只是
Ca\

因此,如果用户试图在反斜杠之后设置光标,我需要一种方法将光标在文本框中的最后位置设置为反斜杠之前

以下是textchanged事件的代码:

private void batchRootFolderText_TextChanged(object sender, EventArgs e)
{
    if (!batchRootFolderText.Text.EndsWith("\\"))
    {
        batchRootFolderText.Text = batchRootFolderText.Text + "\\";
    }
} 
试着把绳子的末端剪掉,然后换掉


是否尝试将字符串的末端剪掉,然后将其替换?

您可以添加一个变量,用于跟踪反斜杠的位置,并在需要时将其“移动”到末端:

int backSlashIndex = -1;

private void batchRootFolderText_TextChanged(object sender, EventArgs e)
{
    if (!batchRootFolderText.Text.EndsWith("\\"))
    {
        if(backSlashIndex != -1)
        {
            var fullText = batchRootFolderText.Text;

            var beforeBackslashText = fullText.Substring(0, backSlashIndex);
            var afterBackslashText = fullText.Substring(backSlashIndex + 1, fullText.Length - beforeBackslashText.Length - 1);

            batchRootFolderText.Text = beforeBackslashText + afterBackslashText;
        }

        batchRootFolderText.Text = batchRootFolderText.Text + "\\";
        backSlashIndex = batchRootFolderText.Text.Length - 1;
    }
}

当用户删除字符或用户自己键入反斜杠字符时,请记住添加处理。您可以添加一个变量,跟踪反斜杠的位置,并在需要时将其“移动”到末尾:

int backSlashIndex = -1;

private void batchRootFolderText_TextChanged(object sender, EventArgs e)
{
    if (!batchRootFolderText.Text.EndsWith("\\"))
    {
        if(backSlashIndex != -1)
        {
            var fullText = batchRootFolderText.Text;

            var beforeBackslashText = fullText.Substring(0, backSlashIndex);
            var afterBackslashText = fullText.Substring(backSlashIndex + 1, fullText.Length - beforeBackslashText.Length - 1);

            batchRootFolderText.Text = beforeBackslashText + afterBackslashText;
        }

        batchRootFolderText.Text = batchRootFolderText.Text + "\\";
        backSlashIndex = batchRootFolderText.Text.Length - 1;
    }
}

请记住,当用户删除字符或用户自己键入反斜杠字符时,请添加处理。您可以使用SelectionStart属性设置光标位置:

在SelectionChanged事件()中,您可以检查插入符号是否位于文本末尾,以及文本是否以反斜杠结尾,然后调整位置

if (textBox.SelectionStart == textBox.Length - 1 && textBox.Text.EndsWith(@"\")
    textBox.SelectionStart = textBox.Length - 2;

这段代码应该可以完成这项工作。

您可以使用SelectionStart属性设置光标位置:

在SelectionChanged事件()中,您可以检查插入符号是否位于文本末尾,以及文本是否以反斜杠结尾,然后调整位置

if (textBox.SelectionStart == textBox.Length - 1 && textBox.Text.EndsWith(@"\")
    textBox.SelectionStart = textBox.Length - 2;

这段代码应该可以完成这项工作。

如果你问我的话,这是非常奇怪的行为或
TextBox
。你能告诉我你为什么要这样做吗?关键是你可以在用户完成(焦点丢失或按下按钮)后做一些更改,不一定是在每次文本更改后,而他还没有完成。是的,这很奇怪,但用户明确要求每次输入任何文本时都进行更改。如果我能在他们最后按下一个按钮来使用该文本的时候做这件事会更好。如果你问我的话,这是非常奇怪的行为或
TextBox
。你能告诉我你为什么要这样做吗?关键是你可以在用户完成(焦点丢失或按下按钮)后做一些更改,不一定是在每次文本更改后,而他还没有完成。是的,这很奇怪,但用户明确要求每次输入任何文本时都进行更改。如果我能在他们最后按下一个按钮来使用该文本的时候做这件事会更好。这不会产生正确的行为。例如,键入
c
生成
c`。但是,如果用户将插入符号置于反斜杠右侧并再次键入
c`,则会出现c\`而不是cc\。这不会产生正确的行为。例如,键入
c
生成
c`。但是如果用户将插入符号放在反斜杠的右侧并再次键入
c`,则会出现c\`而不是cc\'。该事件仅在WPF中出现(我认为),这是针对winforms的。哦,这是正确的。我自己查过了。但您仍然可以在MouseUp和KeyUp事件中实现这一点。我认为鼠标和键盘应该是用户更改插入符号位置的唯一方式;)那个事件只在WPF中发生(我想),这是针对winforms的。哦,这是正确的。我自己查过了。但您仍然可以在MouseUp和KeyUp事件中实现这一点。我认为鼠标和键盘应该是用户更改插入符号位置的唯一方式;)