为什么我没有获得真正的当前char我点击/选择?

时间:2013-11-25 09:29:48

标签: c# winforms

这是代码:

private void richTextBox1_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                if (mouseisup == false)
                {
                    textBox1.Text = "";
                    int positionToSearch = richTextBox1.GetCharIndexFromPosition(new Point(e.X, e.Y));
                    richTextBox1.SelectionStart = positionToSearch;
                    textBox1.Text = richTextBox1.Text.Substring(positionToSearch, 1);
                    previousChar = positionToSearch;
                    textBox2.Text = "";
                    mouseisup = true;//add this statement
                }
                else
                {
                    currentChar = richTextBox1.GetCharIndexFromPosition(new Point(e.X, e.Y));
                    if (currentChar > previousChar + 2 || currentChar < previousChar - 2)
                    {
                        richTextBox1.SelectionStart = currentChar;
                        textBox2.Text = richTextBox1.Text.Substring(currentChar, 1);
                        button1.Enabled = true;
                    }
                    mouseisup = false;
                }
            }
        }

        private void richTextBox1_MouseUp(object sender, MouseEventArgs e)
        {
            if (textBox2.Text == "")
            {
                mouseisup = true;
                button1.Enabled = false;
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            button1.Enabled = false;
            string[] text = Parse_Text.ParseText(richTextBox1.Text, textBox1.Text, textBox2.Text);
            for (int i = 0; i < text.Length; i++)
            {
                richTextBox2.Text = text[i];
            }
        }

我为测试创建了一个文本新文本文件并输入了文本文件:

“Daniel&gt;较小&gt;&lt;然后daniel或Daniel依赖于D&gt;但是&lt;&lt;&gt;” 然后在程序中第一次点击是第一个丹尼尔的第一个D,第二个点击是在第二个丹尼尔的第二个D上。

然后在此代码中的parse_text中的新类中:

List<string> parsedText = new List<string>();
            string[] entries = null;
            int startIndex = text.IndexOf(startTag);
            if (startIndex >= 0)
            {
                int endIndex = text.IndexOf(endTag, startIndex);

startIndex为0但endIndex为0.但是endTag是第二个D,它不应该是索引0。 所以这也是一个问题。

1 个答案:

答案 0 :(得分:1)

你的问题是你接受了一个确实会给你第一次出现的角色的IndexOf。 为避免这种情况,请使用角色的位置而不是实际角色。

您已经在该行上提供了该信息:

currentChar = richTextBox1.GetCharIndexFromPosition(new Point(e.X, e.Y));

修改

您应该更改Parse_Text方法以用于位置而不是字符。 在我的头顶,你应该得到像:

    public static string[] ParseText(string text, int startPos, int endPos)
    {
        List<string> parsedText = new List<string>();
        string[] entries = null;

        if (startPos >= 0 && endPos > startPos)
        {
            string images = text.Substring(startPos + 1, endPos - startPos - 1);
            entries = images.Split(new[] { ',' });
            for (var i = 0; i < entries.Length; i++)
            {
                entries[i] = entries[i].Replace("\"", "");
            }

            for (int i = 0; i < entries.Length; i++)
            {
                parsedText.Add(entries[i]);
            }
        }

        return entries;
    }

显然,您应该添加一些关于允许参数的额外测试。 例如:

  • text不能是string.Empty
  • startPos不能小于零
  • endPos必须大于startPos