多行不读入一个列表项

时间:2017-03-30 01:35:59

标签: c# io listbox text-files clipboard

出于某种原因,当我读取剪贴板数据并将其写入文件时,读取该文件并将其设置为列表,然后用¢描述它,它会在第一次加载时加载我的列表框,就像我的表单一样首先加载。但是我在按钮单击时有以下触发器,由于某种原因,将多个行部分拆分为单独的列表项,这不是我想要的,而不是表单首次加载时相同的代码所执行的操作。这有点令人沮丧,因为它正在以相同的方式写入文本文件和所有内容。

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

“这是多行”, “用于测试的文本文件”, “这个应用程序”

3 个答案:

答案 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再次设置剪贴板文本时替换它。