【问题标题】:Remove spreadsheet formatting in rich text box删除富文本框中的电子表格格式
【发布时间】:2018-01-11 23:00:38
【问题描述】:

我想将一些行从 MS Excel 复制并粘贴到我的 C# Winforms 应用程序中的 RichTextBox。用户将按键盘上的 CTRL+V 并显示 Excel 网格线。如何确保粘贴的内容仅显示为文本?#

这似乎不起作用:

private void richTextBox1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.Control == true && e.KeyCode == Keys.V)
    {
        e.Handled = true;
        string st = Clipboard.GetText();
        richTextBox1.Text = st;
    }
}

我无法使用文本框,因为我的代码如下所示:

private void button1_Click(object sender, EventArgs e)
{
    richTextBox2.Clear();
    richTextBox2.Focus();

    string strValues;
    strValues = richTextBox1.Text;

    var textInEachLine = richTextBox1.Text.Split(new string[] { "\n" }, StringSplitOptions.RemoveEmptyEntries);
    string whereClause = string.Join("', '", textInEachLine).ToString();
    richTextBox2.AppendText(" IN ( '" + whereClause + "')");
}

【问题讨论】:

  • 一种解决方案可能是使用textbox 并将multiline 选项设置为true 而不是richtextbox
  • 用我的代码更新了我的问题。我不能使用文本框,因为我使用的是字符串数组。除非你能改写给我看
  • 对我来说,您提供的代码正在运行,问题一定出在其他地方。这个richtextbox还有更多活动吗?
  • 当您说它的工作时,您是否从 Excel 中复制了单元格并尝试粘贴它?如果您看到网格线,则说明它不起作用...
  • 相信我,我没有看到任何网格线。所以这个 Richtextbox 上没有更多事件了吧?

标签: c# winforms


【解决方案1】:

更好的解决方案是将richTextBox 转换为多行文本框。

【讨论】:

    【解决方案2】:

    试试这个代码

     private void richTextBox1_KeyDown(object sender, KeyEventArgs e)
            {
                if (e.KeyCode == Keys.V && e.Modifiers == Keys.Control)
                {
                    e.Handled = true;
                    string st = Clipboard.GetText();
                    richTextBox1.Text = st;
                }
                base.OnKeyDown(e);
            }
    
    
    
     private void richTextBox1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
        {
            if (e.Control == true && e.KeyCode == Keys.V) { e.IsInputKey = true; }
        }
    

    【讨论】:

    • 不起作用...我仍然从 excel 中获取粘贴的网格
    【解决方案3】:

    一段时间以来,我一直在寻找更好的答案。我想出了自己的解决方案,因为我无法摆脱我支持的应用程序中的 RichTextBox。我编写了一个表单应用程序来查看原始 RTF 数据并从 excel 中粘贴了一些单元格。 空白的 TextBox 产生了...

    {\rtf1\ansi\ansicpg1252\deff0\deflang1033{\fonttbl{\f0\fnil Calibri;}} \viewkind4\uc1\pard\f0\fs22\par }

    当粘贴一些带有一些彩色文本的单元格时,它会显示...

    {\rtf1\ansi\ansicpg1252\deff0\deflang1033{\fonttbl{\f0\fnil Calibri;}} {\colortbl ;\red255\green0\blue0;\red0\green0\blue0;} \viewkind4\uc1\trowd\trgaph30\trleft-30\cellx1002\cellx2034\pard\intbl\cf1\f0\fs22 好文\cell\cf2 好文\cell\row \intbl 好文本\单元格\cf1 好文本\单元格\行 \pard\cf0\par }

    我发现删除 '\cell' 或 \cellx####' 并将文本返回到另一个 RichTextBox 会导致所有相关格式都被删除。 RichTextBox 似乎会去除无效的格式。 有了这个,我在将文本粘贴到 RichTextBox 之前编写了以下要执行的方法。

    private void CleanClipboardText()
        {
            string cleaned = Clipboard.GetText(TextDataFormat.Rtf);
            if (cleaned != null & cleaned != String.Empty)
            {
                Regex regex = new Regex(@"\\cellx\d{4}?");
                cleaned = regex.Replace(cleaned, " ");
                regex = new Regex(@"\\cell");
                cleaned = regex.Replace(cleaned, " ");
                Clipboard.SetText(cleaned, TextDataFormat.Rtf);
            }
        }
    

    而这个事件为“KeyDown”事件。

    private void RTB_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Control && e.KeyCode == Keys.V)
            {
                RichTextBox rtb = sender as RichTextBox;
                e.Handled = true;
                CleanClipboardText();
                rtb.Paste();
            }
        }
    

    我使用了.Paste();,因为我不想像richTextBox1.Text = st; 那样覆盖整个框的文本。但是,如果您愿意,您可能希望 CleanClipboardText 方法返回一个 rtf 数据字符串,然后改为设置 RichTextBox.Rtf

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-07
      相关资源
      最近更新 更多