C# - csv形成文本字段(复制和粘贴)

时间:2015-12-04 16:13:21

标签: c# winforms csv

我有表格:

http://i.imgur.com/f7Af6Qz.png

和包含这些值的csv文件:

110977,3871933,317731,0,

如何在一次复制和粘贴操作中复制CSV数据并将其粘贴到所有正确的字段中? (所有数据将按照正确的顺序)

提前致谢!

2 个答案:

答案 0 :(得分:2)

我建议通过打开它来读取CSV文件,然后用逗号分割,将值放入字符串数组中,然后更新textBoxes。 请参阅this问题的答案。 您还可以使用OpenFileDialog提供用于打开文件的UI。

修改

我准备了一些基本的例子来处理完全您要求的案例。它假设您在复制的CSV行中有4个值,用逗号分隔(无论如何,如果复制行中只有4个,则前4个将放入textBoxes)。它只需复制CSV行并使用Ctrl + V将其粘贴到第一个文本框(txtValue1)中,然后由,分割,并将复制的CSV行中的所有值放入相应的文本框中(txtValue1txtValue2txtValue3txtValue4连续)。

我的表单看起来就像那样:

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);
            txtValue1.KeyDown += TxtValue1_KeyDown;
        }

        private void TxtValue1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Control && e.KeyCode == Keys.V)
            {
                string csvLine = Clipboard.GetText();
                if (String.IsNullOrEmpty(csvLine))
                    return;
                string[] values = csvLine.Split(',');

                if (values.Count() < 4)
                    return;

                txtValue1.Text = values[0];
                txtValue2.Text = values[1];
                txtValue3.Text = values[2];
                txtValue4.Text = values[3];

                e.SuppressKeyPress = true;
            }
        }
    }

当然可以使它更通用并处理可能的异常。这只是为了说明如何轻松解决您的需求。

答案 1 :(得分:0)

复制/粘贴?更像是从流中读取CSV?

使用任何类型的流阅读器开始阅读CSV后,创建一个模型,即一个类来存储值。当您从CSV中读取字段的位置时,您可以开始将它们存储到模型中,然后从那里轻松实现。您可能想要将所有内容都读入List中,因此您只需阅读一次。

这是你的班级

public class Model
{
    public string InvoiceNumber { get; set; }
    ...
}

这是CSV阅读片

        using (StreamReader sr = new StreamReader(sourceFileName))
        {
            List<Model> modelList = new List<Model>();
            string headerLine = sr.ReadLine();
            string currentLine;
            for (int i = 0; i < strArray.Length; i++)
            {       
                while ((currentLine = sr.ReadLine()) != null)
                {
                 string[] strArray = currentLine.Split(',');
                 Model myModel = new Model();

                 switch (i)
                    {
                        case 0: myModel.InvoiceNumber =  = strArray[i]; break;
                        case 1: myModel.InvoiceHeaderId = strArray[i]; break;
                    }
                }
            }
         modelList.Add(myModel);
        }

        }

从这里你可以将它分配给UI。它取决于你想要读取哪一行,可能过滤结果以获取id,或者过滤我的其他数据。由您决定,您可以在每个循环中添加这些过滤器。或者甚至更好,看看LINQ。 :d

foreach (var item in modelList)
{
    txtInvoiceNumber.Text = mymodel.InvoiceNumber;
    txtinvoiceHeaderId.Text = mymodel.InvoiceHeaderId;


}