簡體   English   中英

如何將上下文菜單添加到 RichTextBox 控件?

[英]How can i add a context menu to a richTextBox control?

我做了

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));
            }

行和新列表是列表

這只是我如何將鏈接添加到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 底部的末尾,並采用我正在使用 Ready 的格式:

在什么情況下我應該這樣做? 如何在代碼中添加上下文菜單並使用粘貼菜單?

更新

我現在嘗試了這樣的事情:

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);

當我點擊一條線時,這兩條線我試圖獲得鼠標光標位置。 所以它會像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 行,那么我想在 label1 中看到第 7 行的整個文本。如果我點擊第 65 行,然后在 label1 中查看第 65 行的整個文本。

如果我單擊項目,則與 listView 中的想法相同。

你的問題很直接,但后面有很多不相關的東西。 我只是繼續嘗試回答開始問題,該問題詢問如何將上下文菜單添加到富文本框。

    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;
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM