2012-03-16 79 views
0

我想编写一个应用程序,它将从源复制并粘贴到RichTextBox区域的文本随机排序。RichTextBox - 随机排序

但是,有一个条件 - 文本被格式化(有些单词用粗体,下划线等)。那么有什么建议?它应该是什么样子?

我想我应该使用RichTextBox.Rtf什么的,但我真的是一个初学者,我很欣赏每一个提示或示例代码。

感谢

+0

http://stackoverflow.com/questions/1287567/c-is-using-random-and-orderby-a-good-shuffle-algorithm – sll 2012-03-16 21:09:59

+0

所以,你想保持格式,而源未知:rtf, HTML,单词等? – 2012-03-16 22:41:43

回答

0

这是有点棘手。您可以检索格式化的RTF文本行这样

string[] rtfLines = new string[richTextBox1.Lines.Length]; 
for (int i = 0; i < rtfLines.Length; i++) { 
    int start = richTextBox1.GetFirstCharIndexFromLine(i); 
    int length = richTextBox1.Lines[i].Length; 
    richTextBox1.Select(start, length); 
    rtfLines[i] = richTextBox1.SelectedRtf; 
} 

现在你可以洗牌线这样

var random = new Random(); 
rtfLines = rtfLines.OrderBy(s => random.NextDouble()).ToArray(); 

清除RichtTextBox

richTextBox1.Text = ""; 

插入线最好是在反向做订购,因为它更容易选择文本的开头

// Insert the line which will be the last line. 
richTextBox1.Select(0, 0); 
richTextBox1.SelectedRtf = rtfLines[0]; 

// Prepend the other lines and add a line break. 
for (int i = 1; i < rtfLines.Length; i++) { 
    richTextBox1.Select(0, 0); 

    // Replace the ending "}\r\n" with "\\par }\r\n". "\\par" is a line break. 
    richTextBox1.SelectedRtf = 
     rtfLines[i].Substring(0, rtfLines[i].Length - 3) + "\\par }\r\n"; 
} 
+0

谢谢,这似乎工作得很好:)但还有一件事。我添加了上下文菜单到richboxtext只有一个功能“粘贴”。哪些代码会将我的剪贴板内容粘贴到richboxtext表单中?我尝试过: private void PasteToolStripMenuItem_Click_1(object sender,EventArgs e) { richTextBox1.Text = Clipboard.GetText(); } 但它粘贴非格式文本。我如何粘贴格式文本? – user1188235 2012-03-17 10:13:58

+0

'richTextbox1.Paste();'或者您可以使用组合键“Ctrl-C”。 – 2012-03-17 16:28:42

0

的任务看起来并不复杂(如果我理解正确的话)。 将您的剪贴板转换为字符串,然后解析到数组中 - 使用Split()。 然后确定您需要多少个随机事件并遍历每个单词;为每次迭代生成随机数(应与事件数量匹配),将该数字与其中一个事件相交,并将该案例应用于该特定单词。也许不是最有效的方式去做,但这是我想到的

+0

您不能使用'String.Split',因为RTF-Lines不仅与'\ r \ n'分开。由于OP希望保留RTF格式,因此情况会更复杂一些。 – 2012-03-16 22:07:24