出于某种原因,当我读取剪贴板数据并将其写入文件时,读取该文件并将其设置为列表,然后用¢描述它,它会在第一次加载时加载我的列表框,就像我的表单一样首先加载。但是我在按钮单击时有以下触发器,由于某种原因,将多个行部分拆分为单独的列表项,这不是我想要的,而不是表单首次加载时相同的代码所执行的操作。这有点令人沮丧,因为它正在以相同的方式写入文本文件和所有内容。
private void button2_Click_1(object sender, EventArgs e)
{
// until next comment this is the same as what I have run at the start of the
// program, it loads up multiple lines into one list item as it should
string checkForDupe = File.ReadAllText(@"C:\temp\testfile.txt");
string checkResponses = File.ReadAllText(@"C:\temp\testfile2.txt");
if (Clipboard.ContainsText() && !checkForDupe.Contains(Clipboard.GetText()))
{
if (!checkResponses.Contains(Clipboard.GetText()))
{
var text = "\n" + Clipboard.GetText() + "¢";
File.AppendAllText(@"C:\temp\testfile.txt", text);
}
}
//The following has no affect on the issue stated in my question I have tried with out it.
string[] responseTags2 = File.ReadAllLines(@"C:\temp\testfile.txt");
List<string> _responseTags2 = new List<string>(responseTags2);
var count = _responseTags2.Count;
// Perform a reverse tracking.
for (var i = count - 1; i > -1; i--)
{
if (_responseTags2[i] == string.Empty) _responseTags2.RemoveAt(i);
}
// Keep only the unique list items.
_responseTags2 = _responseTags2.Distinct().ToList();
listBox1.BeginUpdate();
listBox1.DataSource = _responseTags2;
listBox1.EndUpdate();
}
输入示例: “这是多行 用于测试的文本文件 这个应用程序“
右输出示例(在加载表单之前,在程序开始时运行相同代码时得到的结果): “这是多行 用于测试的文本文件 这个应用程序“,
“这是另一条线路 用于测试的文本文件 这个应用程序“,
“这是一行”
错误的输出(当我按下按钮时我得到的东西点击最终更新UI):
“这是多行”, “用于测试的文本文件”, “这个应用程序”
答案 0 :(得分:0)
这段代码对我来说很好,但我认为它基本上就是你正在做的事情,只是稍微清理一下(我没有使用第二个文件,因为你没有在示例中使用它。)
我的建议是创建一个执行此操作的方法,然后从您需要的任何地方调用该方法。这样你就可以确保你在两个(所有)地方做同样的事情。
<强>更新强>
我更新了保存剪贴板文本的方法,并在保存到文件时添加了str(as.matrix(mydf3))
# chr [1:4, 1:2] "1" "2" "x" "4" "y" "3" "4" "-"
# - attr(*, "dimnames")=List of 2
# ..$ : NULL
# ..$ : chr [1:2] "A" "B"
字符。然后,在第二次读取文件时,首先使用空格字符连接所有行,然后在mydf3[] <- as.numeric(as.matrix(mydf3))
# Warning message:
# NAs introduced by coercion
str(mydf3)
# 'data.frame': 4 obs. of 2 variables:
# $ A: num 1 2 NA 4
# $ B: num NA 3 4 NA
字符上拆分,并将该列表用于数据源。
¢
答案 1 :(得分:0)
您的列表框中有多行,因为您没有按¢
分隔文本,只是将它们读成行。这是你的代码:
string[] responseTags2 = File.ReadAllLines(@"C:\temp\testfile.txt");
这样做。阅读所有文字:
var contents = File.ReadAllText(@"C:\temp\testfile.txt");
现在使用字符¢
分割它们:
var lines = s.Split('¢');
这是删除所有空格并返回不同项目的最终linq:
var lines = s.Split('¢')
.Where(item => item != string.Empty)
.Distinct()
.ToList();
然后将lines
设置为数据源:
listBox1.BeginUpdate();
listBox1.DataSource = lines;
listBox1.EndUpdate();
答案 2 :(得分:0)
我最终做的是以下内容;
string responseTags2 = checkForDupe.Replace('\n', '╜');
我用很少使用的字符替换了新行,然后用¢拆分来填充列表。
要替换特殊字符以便再次正确格式化,我只需在使用\ n再次设置剪贴板文本时替换它。