【问题标题】:Listing integers from a text file into a listview将文本文件中的整数列出到列表视图中
【发布时间】:2013-12-08 01:38:34
【问题描述】:

我正在使用 vs 2013 在 winforms c# 中创建一个应用程序。

在应用程序中,我有一个文本文件,我使用时间选择下拉列表中的自定义格式以 int 格式表示时间。

然后我想在一个可选择的列表视图中显示该文本文件中的内容,我可以从中将其从文本文件等中删除。我几乎就在那里,但是当我尝试将项目添加到他们所做的列表框中时似乎添加了但是它们不能正确显示。

例如说在我​​的文本文件中有

22102210
19101610
17182218
10272227

这就是它应该如何在列表视图中显示为可供删除的可选选项。

目前显示不正确,显示为 1.. 2.. 1..

有人可以帮我指出正确的方向吗?为什么会发生这种情况?非常感谢任何帮助。这是我的课。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Chronos
{
    public partial class Interface : Form
    {
        private string[] getTimes = System.IO.File.ReadAllLines(@"G:\Dropbox\University\Chronos\Application\Chronos\Chronos\AdminAccount\Times.txt");
    public Interface()
    {
        InitializeComponent();
    }

    private void Interface_Load(object sender, EventArgs e)
    {
        PopulateList();
    }

    private void PopulateList()
    {
        int size = getTimes.Length;
        lstTime.Items.Clear();
        GetTimes();
        for (int i = 0; i < size; i++)
        {
            lstTime.Items.Add(getTimes[i]);
        }
    }

    private void GetTimes()
    {
        string[] getTimes = System.IO.File.ReadAllLines(@"G:\Dropbox\University\Chronos\Application\Chronos\Chronos\AdminAccount\Times.txt");
    }

    private void btnAdd_Click(object sender, EventArgs e)
    {
        string time = pickerTimeStart.Value.Hour.ToString() + pickerTimeStart.Value.Minute.ToString() + pickerTimeEnd.Value.Hour.ToString() + pickerTimeEnd.Value.Minute.ToString();

        System.IO.File.AppendAllText(@"G:\Dropbox\University\Chronos\Application\Chronos\Chronos\AdminAccount\Times.txt", time + Environment.NewLine);

        PopulateList();

        MessageBox.Show("Time added", "Ok");





        //PopulateList();
    }


}
}

【问题讨论】:

    标签: c# winforms listview


    【解决方案1】:

    正如目前所写,GetTimes 除了读取文件之外什么都不做:

    private void GetTimes()
    {
        // "string[]" here overrides the outer scope
        string[] getTimes = System.IO.File.ReadAllLines(@"G:\Dropbox\University\Chronos\Application\Chronos\Chronos\AdminAccount\Times.txt");
    }
    

    如果你把它改成这个,它会变得更有用:

    private string[] GetTimes()
    {
        return File.ReadAllLines(@"G:\Dropbox\University\Chronos\Application\Chronos\Chronos\AdminAccount\Times.txt");
    }
    

    ...然后PopulateList 可以简单地变成:

    lstTime.Items.Clear(); //so you aren't getting a bunch of dupes
    lstTime.Items.AddRange(GetTimes().Select(t => new ListViewItem(t)).ToArray());
    

    您也可以删除此行,因为您不需要在类中保留数据的副本:

    private string[] getTimes = ...
    

    注意:如果您决定将数据源保留在本地,而不是单独针对文件工作,那么大部分情况都会发生变化。

    【讨论】:

    • 我已经把你所有的 cmets 都带上了,我没有从文件中存储字符串数组的部分非常有意义。出于某种原因,当我执行 lstTime.Items.AddRange(GetTimes()) 时,它会引发错误: 'System.Windows.Forms.Listview.ListViewItemCollection.AddRange(System.Windows.Forms.ListView.ListViewItemCOllection 的最佳重载方法匹配)' 有一些无效的论点。我猜是因为 .AddRange() 方法不接受字符串数组?
    • @Jagga - 它没有。我假设ListBox,确实如此。
    • 是的,这是有效的,而且从看起来我首先做的事情来看,实际上也正确地填充了它。只是格式不对。所以你的回答我当然接受了,但是我仍然有同样的问题,它不能正确显示。我不确定这个 1 将如何修复。这是一个屏幕截图,正如您所看到的,当我选择其中一个条目时,它会完全显示它,尽管格式非常无用(尚未完成格式化)i.imgur.com/8QOmot6.jpg
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-29
    • 2023-02-10
    • 2018-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多