【问题标题】:c# Add Specific columns from a TEXT file to DataGridViewc#将文本文件中的特定列添加到DataGridView
【发布时间】:2014-09-25 09:44:52
【问题描述】:

大家好,

如上图所示,我想将文本文件中的十进制数字列添加到数据网格控件。

下面是我的代码sn-p

List<string> str = new List<string>();
        String st = "";
        int k = 0;
        string[] s ;
        //Path to write contents to text file
        string filename = @"E:\Vivek\contentcopy\clientlist.txt";
        Form.CheckForIllegalCrossThreadCalls = false;
        OpenFileDialog ofd = new OpenFileDialog();
        ofd.FileName = "";

        ofd.ShowDialog();
        st = ofd.FileName;

        if (string.IsNullOrEmpty(ofd.FileName))
            return;
        string Name = "", No1 = "",No2="";
        string[] lines = File.ReadAllLines(st).Where(sw => !string.IsNullOrWhiteSpace(sw)).ToArray();
        for (int i = 0; i < lines.Length; i++)
        {

            if (lines[i].Contains("VENTURA SECURITIES LIMITED (NSE F&O)")) continue;
            if (lines[i].Contains("ALL EXCHANGES DERIVATIVES CLIENTWISE STATEMENT AS ON 16-05-2012")) continue;
            if (lines[i].Contains("-------------------------------------------------------")) continue;
            s = lines[i].Split(' ');
            if (s[0] == "PARTY" || s[0] == "") continue;
            int z;
            Name = "";

            for (z = 1; z < s.Length; z++)
            {
                if (s[z] == "") continue;                    
                if (s[z].Contains('.'))
                {
                    No1+=s[z]+" ";
                    No2 = No1 + " ";  

                } 
                else
                {
                    Name += s[z];
                    str.Add(s[0]+"  "+Name);

                }



            }

            dataGridView1.Rows.Add();
            dataGridView1.Rows[k].Cells[0].Value = s[0];
            dataGridView1.Rows[k].Cells[1].Value = Name;
            dataGridView1.Rows[k].Cells[2].Value = No1;
            dataGridView1.Rows[k].Cells[3].Value =  No2;
            k++;
        }


        File.WriteAllLines(filename, str);
        dataGridView1.ReadOnly = true;
    }

No1=s[z] 行直接取最后一列的值,即 46,123.19 等。我想从文本文件中获取每一列并将其存储在字符串变量中,然后将其分配给数据网格视图 我希望我的疑问很清楚。如果没有,请告诉我

【问题讨论】:

  • 究竟是什么不起作用?您是否遇到错误或值未显示?
  • @DionV。感谢您的回复。实际上,当我分配 no1=s[z] 时,它直接占用最后一列,即 46,123.19 1,990.20 和儿子,我希望将每列分配给一个变量,例如 1st Column,其值为 200.0 0.0

标签: c# datagridview datagrid


【解决方案1】:

假设你的测试文件中有 for 行,那么你需要做以下事情:

  1. 使用 StreamReader.ReadLine(),一次读取一行。
  2. 使用 split(' ') 分割行并将其存储在数组中
  3. 从数组中删除所有空的
  4. 现在在结果数组的索引 2,3,4,5,6 处将具有与十进制数字等效的字符串。
  5. 对每个 StreamReader.ReadLine() 重复此操作

希望这会有所帮助。

【讨论】:

  • 感谢您的帮助。但我已完成上述所有步骤。我想我无法执行第 4 步和第 5 步
  • 字符串文件名 = @"E:\Vivek\contentcopy\clientlist.txt"; Form.CheckForIllegalCrossThreadCalls = false; OpenFileDialog ofd = new OpenFileDialog(); ofd.FileName = ""; ofd.ShowDialog(); st = ofd. 文件名; if (string.IsNullOrEmpty(ofd.FileName)) 返回;字符串名称 = "", No1 = "",No2=""; string[] lines = File.ReadAllLines(st).Where(sw => !string.IsNullOrWhiteSpace(sw)).ToArray();
  • 这似乎很完美。只需遍历您的最终数组并获取值。
  • 我是 c# 的新手,要迭代哪个数组..你能给出一个代码 sn-p 来实现同样的效果
【解决方案2】:

这是最简单的解决方案:

给Form添加一个DataGrid View并添加一个Button:

 private void button1_Click(object sender, EventArgs e)
    {
        ReadAndFileter();
    }
    private void ReadAndFileter()
    {
        try
        {
            using(System.IO.StreamReader reader = new System.IO.StreamReader("file.txt"))
            {
                string line;
                string []array;
                int rowcount= 0;
                decimal number;
                string[] separators = { "\t", " " };
                int columnCount = 0;
                while ((line = reader.ReadLine()) != null)
                {

                   array = line.Split(separators, StringSplitOptions.RemoveEmptyEntries); 
                   dataGridView1.Rows.Add();
                   foreach  (string str in array)
                   {

                       if (Decimal.TryParse(str,out number))
                       {
                           dataGridView1.Rows[rowcount].Cells[columnCount++].Value = number;                               
                       }                           
                   }
                   rowcount++;
                   columnCount = 0;
                }
            }
        }
        catch (Exception ex)
        {
        }
    }

文件内容为:

Abc         20.122      69.33   0.00        693.25  0.00
def         36.20       96.20   1.15        69.56   8.96

最后的输出:

【讨论】:

  • 谢谢@Daredevil,我已经更新并添加了完整的代码,你能帮我写代码吗?
  • @user2614235:你需要什么样的帮助?
  • 我已经添加了我的完整代码..你能通过建议对我的代码进行更改来帮助我将内容加载到 DataGridView 吗?
  • 这正是我的建议。 :)
【解决方案3】:

您的问题是每次读取字符串时都会覆盖No1,这解释了为什么您只获得最后一个值。你可以做的是;

追加字符串:

   No1 += s[z] + " ";

这会将所有值放在后面,用空格分隔。

或者,您可以创建一个 List&lt;String&gt; 并将每个值添加到列表中,这意味着您将它们分开存储:

   List<String> values = new List<String>();
   foreach(...)
   {
      if (s[z] == "") continue;                    
      if (s[z].Contains('.'))
      {
            values.Add(s[z])
      } 
      else
      {
             Name += s[z];
             str.Add(s[0] + "  " + Name);
      }
   }

之后您可以循环遍历列表并将每个值添加到一行。考虑你的代码;

int i = 2;
foreach(string value in values)
{
   dataGridView1.Rows[k].Cells[i].Value = value;
   i++;
}

这应该可行。

希望这会有所帮助。

【讨论】:

  • 谢谢 但是如何将这些值分别添加到 datagrid 上的每一列,即 datagrid1.rows[i].column[0].value=?
  • 好吧,如果您选择 list 选项并考虑您的代码片段,那将是一个简单的 foreach 循环。我会将其添加到答案中,因为代码段会变得太大而无法评论。
  • 请添加...谢谢我是 C# 新手
  • 谢谢 会试一试:)
  • V.其抛出的参数超出范围异常
【解决方案4】:

这里是编辑过的代码:但对于未来我必须建议至少尝试一下..

private void ReadAndFileter1()
    {
        try
        {
            using (System.IO.StreamReader reader = new System.IO.StreamReader("file.txt"))
            {
                string line;
                string[] array;
                int rowcount = 0;
                decimal number;
                string[] separators = { "\t", " " };
                int columnCount = 1;
                string[] lines = File.ReadAllLines("file.txt");
                for (int i = 0; i < lines.Length; i++)
                {
                    if (lines[i].Contains("VENTURA SECURITIES LIMITED (NSE F&O)")) continue;
                    if (lines[i].Contains("ALL EXCHANGES DERIVATIVES CLIENTWISE STATEMENT AS ON 16-05-2012")) continue;
                    if (lines[i].Contains("-------------------------------------------------------")) continue;

                    array = lines[i].Split(separators, StringSplitOptions.RemoveEmptyEntries);
                    if (array[0] == "PARTY" || array[0] == "") continue;

                    dataGridView1.Rows.Add();
                    foreach (string str in array)
                    {
                        if (Decimal.TryParse(str, out number))
                        {
                            dataGridView1.Rows[rowcount].Cells[columnCount++].Value = number;
                        }
                    }
                    dataGridView1.Rows[rowcount].Cells[0].Value = array[0];
                    rowcount++;
                    columnCount = 1;
                }
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }
}

【讨论】:

    【解决方案5】:

    这里是:

    static void Main(string[] args)
        {
            Decimal result;
            string[] splitchar = new string[]{" "};
    
            using(StreamReader reader = new StreamReader(@"C:\Users\Dell\Desktop\input.txt"))
            {
                while(!reader.EndOfStream)
                {
                    string[] splittedArray = reader.ReadLine().Split(splitchar,                      StringSplitOptions.RemoveEmptyEntries).Where(x => Decimal.TryParse(x, out result)).ToArray();
    
                    // put your code here to get insert the values in datagrid
                }
            }
    
        }
    

    【讨论】:

      猜你喜欢
      • 2014-08-25
      • 1970-01-01
      • 2016-09-13
      • 2021-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-03
      相关资源
      最近更新 更多