2017-02-10 84 views
1

我做如何将上下文菜单添加到richTextBox控件?

private void richTextBox1_MouseDown(object sender, MouseEventArgs e) 
{ 
    if (e.Button == System.Windows.Forms.MouseButtons.Right) 
    { 
     MessageBox.Show("you got it!"); 
    } 

} 

但我想要的是:

  1. 在做在RichTextBox的线右击考虑行项目,以便菜单命令才会生效的特定的行我没有右键点击。像删除,粘贴,复制

  2. 如果我选择粘贴,它会将新文本粘贴到richTextBox的底部(结尾)。但是,如果我点击复制或删除它会考虑到特定的行,我做了正确的点击。

  3. 若要制作一行或一批行的粘贴,并将它们添加为richTextBox底部(末尾)的行。

这就是我今天将文本作为行添加到richTextBox。这些线是链接。 richTextBox中的每一行都是一个链接。而我想粘贴到richTextBox的链接不仅仅是文本。因此,我粘贴到richTextBox的每个链接都应该像我这样做:for循环仅用于构造函数的第一次。

for (int i = 0; i < lines.Count; i++) 
      { 
       RichTextBoxExtensions.AppendText(richTextBox1, "Ready: ", Color.Red, 8.25f); 
       richTextBox1.AppendText(lines[i] + (i < lines.Count - 1 ? Environment.NewLine : String.Empty)); 
      } 

      richTextBox1.AppendText(Environment.NewLine); 

      for (int i = 0; i < newList.Count; i++) 
      { 
       RichTextBoxExtensions.AppendText(richTextBox1, "Ready: ", Color.Red, 8.25f); 
       richTextBox1.AppendText(newList[i] + (i < newList.Count - 1 ? Environment.NewLine : String.Empty)); 
      } 

线和newList是列表

这只是如何我添加链接到RichTextBox的一个例子。 所以当我粘贴链接或链接时,他们应该以这种方式添加,就像我正在做的那样。

这是怎样的RichTextBox貌似现在例如:

Ready: http://www.sat24.com/image2.ashx?region=is&time=201702101330&ir=true 
Ready: http://www.sat24.com/image2.ashx?region=is&time=201702101330&ir=false 
Ready: http://www.sat24.com/image2.ashx?region=is&time=201702101345&ir=true 
Ready: http://www.sat24.com/image2.ashx?region=is&time=201702101345&ir=false 
Ready: http://www.sat24.com/image2.ashx?region=is&time=201702101400&ir=true 
Ready: http://www.sat24.com/image2.ashx?region=is&time=201702101400&ir=false 
Ready: http://www.sat24.com/image2.ashx?region=is&time=201702101415&ir=true 
Ready: http://www.sat24.com/image2.ashx?region=is&time=201702101415&ir=false 
Ready: http://www.sat24.com/image2.ashx?region=is&time=201702101430&ir=true 
Ready: http://www.sat24.com/image2.ashx?region=is&time=201702101430&ir=false 
Ready: http://www.sat24.com/image2.ashx?region=is&time=201702101445&ir=true 
Ready: http://www.sat24.com/image2.ashx?region=is&time=201702101445&ir=false 
Ready: http://www.sat24.com/image2.ashx?region=is&time=201702101500&ir=true 
Ready: http://www.sat24.com/image2.ashx?region=is&time=201702101500&ir=false 
Ready: http://www.sat24.com/image2.ashx?region=is&time=201702101515&ir=true 

所以,如果我现在在做一个链接,例如膏:http://microsoft.com 现在RichTextBox的内容将是这样的:

Ready: http://www.sat24.com/image2.ashx?region=is&time=201702101330&ir=true 
Ready: http://www.sat24.com/image2.ashx?region=is&time=201702101330&ir=false 
Ready: http://www.sat24.com/image2.ashx?region=is&time=201702101345&ir=true 
Ready: http://www.sat24.com/image2.ashx?region=is&time=201702101345&ir=false 
Ready: http://www.sat24.com/image2.ashx?region=is&time=201702101400&ir=true 
Ready: http://www.sat24.com/image2.ashx?region=is&time=201702101400&ir=false 
Ready: http://www.sat24.com/image2.ashx?region=is&time=201702101415&ir=true 
Ready: http://www.sat24.com/image2.ashx?region=is&time=201702101415&ir=false 
Ready: http://www.sat24.com/image2.ashx?region=is&time=201702101430&ir=true 
Ready: http://www.sat24.com/image2.ashx?region=is&time=201702101430&ir=false 
Ready: http://www.sat24.com/image2.ashx?region=is&time=201702101445&ir=true 
Ready: http://www.sat24.com/image2.ashx?region=is&time=201702101445&ir=false 
Ready: http://www.sat24.com/image2.ashx?region=is&time=201702101500&ir=true 
Ready: http://www.sat24.com/image2.ashx?region=is&time=201702101500&ir=false 
Ready: http://www.sat24.com/image2.ashx?region=is&time=201702101515&ir=true 
Ready: http://www.microsoft.com 

如果我粘贴多个链接,那么它会将链接添加到底部。

我觉得这是从剪贴板文本追加的最快方法:

string newText = Clipboard.GetText(); 
richTextBox1.SelectionStart = richTextBox1.TextLength; 
richTextBox1.SelectionLength = 0; 
richTextBox1.SelectedText = newText; 

但我想它被添加到年底的RichTextBox的底部和格式我对这个做准备好了:

在什么情况下我应该这样做?如何在代码中添加上下文菜单并使用粘贴菜单?

更新

现在我想是这样的:

private void richTextBox1_MouseDown(object sender, MouseEventArgs e) 
     { 
      if (e.Button == System.Windows.Forms.MouseButtons.Right) 
      { 
       var startIndex = richTextBox1.Text.IndexOf("Ready:") + "Ready:".Length; 
       var length = richTextBox1.Text.IndexOf("Ready:", startIndex) - startIndex; 

       int index = richTextBox1.SelectionStart; 
       int line = richTextBox1.GetLineFromCharIndex(index); 

       var code = richTextBox1.Text.Substring(startIndex + index, length - line - 1); 

       label1.Text = code; 
     } 

我尝试添加了两行:

int index = richTextBox1.SelectionStart; 
int line = richTextBox1.GetLineFromCharIndex(index); 

这两条线我试图让鼠标cursour当我点击一行时的位置。所以它会解析鼠标所在的行文本,就像listView中的项目一样。

但子串我不正确。

如果我做这样说:

private void richTextBox1_MouseDown(object sender, MouseEventArgs e) 
     { 
      if (e.Button == System.Windows.Forms.MouseButtons.Right) 
      { 
       var startIndex = richTextBox1.Text.IndexOf("Ready:") + "Ready:".Length; 
       var length = richTextBox1.Text.IndexOf("Ready:", startIndex) - startIndex; 

       var code = richTextBox1.Text.Substring(startIndex, length - 1); 

       label1.Text = code; 
      } 
     } 

它会给我LABEL1总是第一线链接。 而不是鼠标光标位置点击的那一行。 如果我在第7行单击然后我想在第7行 的label1的全部文本,看看我就行65点击然后在label1的看线的全部文本65

相同的思路ListView中如果我点击物品。

+1

尝试GetCharFromPosition提供鼠标的位置,然后GetLineFromCharIndex从该位置。 – LarsTech

回答

1

你的问题很简单,但其后跟很多不相关的东西。我只是继续尝试回答开放问题,询问如何将上下文菜单添加到richtextbox。

private void txtbx_text1_MouseUp(object sender, MouseEventArgs e) 
    { 
     if (e.Button != MouseButtons.Right) 
     { 
      return; 
     } 
     ContextMenu cm = new ContextMenu();//make a context menu instance 
     MenuItem item = new MenuItem();//make a menuitem instance 
     item.Text = "remove all";//give the item a header 
     item.Click += DoNothing;//give the item a click event handler 
     cm.MenuItems.Add(item);//add the item to the context menu 
     item = new MenuItem();//recycle the menu item 
     item.Text = "load from file";//give the item a header 
     item.Click += DoNothing;//give the item a click event handler 
     cm.MenuItems.Add(item);//add the item to the context menu 
     item = new MenuItem();//recycle item into a new menuitem 
     item.Text = "save list";//give the item a header 
     item.Click += DoNothing;//give the item a click event handler 
     cm.MenuItems.Add(item);//add the item to the context menu 
     ((RichTextBox)sender).ContextMenu = cm;//add the context menu to the sender 
     cm.Show(txtbx_text1, e.Location);//show the context menu 
    } 


    private void DoNothing(object sender, EventArgs e) 
    { 
     //doing nothing 
     return; 
    } 

一直在追求与您的其他需求,以下可能会让你去。它需要一些爱,但前提是存在的,工作原理:利用

private void txtbx_text1_MouseUp(object sender, MouseEventArgs e) 
    { 
     if (e.Button != MouseButtons.Right) 
     { 
      return; 
     } 
     ContextMenu cm = new ContextMenu();//make a context menu instance 
     MenuItem item = new MenuItem();//make a menuitem instance 
     item.Text = "remove line";//give the item a header 
     item.Click += (sendingelement, eventargs) => RemoveLine(item, e);//give the item a click event handler 
     cm.MenuItems.Add(item);//add the item to the context menu 
     ((RichTextBox)sender).ContextMenu = cm;//add the context menu to the sender 
     cm.Show(txtbx_text1, e.Location);//show the context menu 
    } 

    private void RemoveLine(object sender, MouseEventArgs e) 
    { 
     if (txtbx_text1.Text.Length == 0) 
     { 
      return; 
     } 
     int charNextToCursor = txtbx_text1.GetCharIndexFromPosition(e.Location); 
     int lineNumFromChar = txtbx_text1.GetLineFromCharIndex(charNextToCursor); 
     int firstCharOfLine = txtbx_text1.GetFirstCharIndexFromLine(lineNumFromChar); 
     int lineLength = txtbx_text1.Lines[lineNumFromChar].Length; 
     string firstchar = txtbx_text1.Text.Substring(firstCharOfLine, 1); 
     //txtbx_text1.Text = txtbx_text1.Text.Remove(firstCharOfLine, lineLength); 
     if (lineNumFromChar == 0) 
     { 
      if (txtbx_text1.Lines.Length > 1) 
      { 
       txtbx_text1.Text = txtbx_text1.Text.Remove(firstCharOfLine, lineLength + 1); 
      } 
      else 
      { 
       txtbx_text1.Text = txtbx_text1.Text.Remove(firstCharOfLine, lineLength); 
      } 

     } 
     else 
     { 
      txtbx_text1.Text = txtbx_text1.Text.Remove(firstCharOfLine - 1, lineLength + 1); 
     } 

     ((MenuItem)sender).Parent.Dispose(); 

     return; 
    } 
+0

不知道这是做到这一点的正确方法,但我的答案的第二部分完成了你所要求的。它删除创建上下文菜单的行,而不考虑插入位置。 –

+0

非常感谢。 –

相关问题