【问题标题】:C# Node Collection using HTMLAgilityPack to Data table使用 HTMLAgilityPack 到数据表的 C# 节点集合
【发布时间】:2018-10-24 06:40:24
【问题描述】:

我正在尝试从该站点抓取数据。我能够获取数据,但现在我需要将所选数据添加到数据表中。以下内容非常接近完成,但它只返回最后一条记录。我知道它很简单,但就是想不通。本质上,for 循环中 Console.Writeline 部分的注释掉部分将是 datagridview 中所需的结果,毕竟说了又做了。

    private void button1_Click(object sender, EventArgs e)
    {
        var doc = new HtmlWeb().Load("https://www.sportingcharts.com/nba/defense-vs-position/");
        HtmlAgilityPack.HtmlNodeCollection teams = doc.DocumentNode.SelectNodes("//div[@class='col col-md-3']//tr/td[2]");
        HtmlAgilityPack.HtmlNodeCollection points = doc.DocumentNode.SelectNodes(".//div[@class='col col-md-3']//tr/td[3]");
        HtmlAgilityPack.HtmlNodeCollection positions = doc.DocumentNode.SelectNodes(".//div[@class='col col-md-3']//span[1]");

        DataTable dvp_dt = new DataTable();
        dvp_dt.Columns.Add("Team", typeof(string));
        dvp_dt.Columns.Add("Points", typeof(string));
        dvp_dt.Columns.Add("Position", typeof(string));

        string[] positions_aux = positions.Where(x => x.InnerText.Length >= 6).Select(y => y.InnerText).ToArray();


        DataRow row = dvp_dt.NewRow();

        for (int i = 0; i < teams.Count - 1; i++)
        {
            var aux = i / 30;
            row["Team"] = (teams[i].InnerText);
            row["Points"] = (points[i].InnerText);
            row["Position"] = (positions_aux[aux]);
           // Console.WriteLine(teams[i].InnerText + ' ' + points[i].InnerText + ' ' + positions_aux[aux]);
        }


         dvp_dt.Rows.Add(row);
        dataGridView2.DataSource = dvp_dt;
    }

【问题讨论】:

    标签: c# datagridview datatable


    【解决方案1】:

    尝试以下:

    for (int i = 0; i < teams.Count - 1; i++)
    {
        DataRow row = dvp_dt.NewRow();
        var aux = i / 30;
        row["Team"] = (teams[i].InnerText);
        row["Points"] = (points[i].InnerText);
        row["Position"] = (positions_aux[aux]);
    }
    
    dataGridView2.DataSource = null;        
    dataGridView2.DataSource = dvp_dt;
    

    【讨论】:

    • 这不起作用。通过在循环中添加新行并清除数据源然后重新应用它,我看到了您得到的广告,但是当我尝试以这种方式加载运行它时,没有显示任何值。它只是填充列标题。
    • 我的更改是正确的。之前使用过代码数千次。变量团队中没有项目,因此您看不到任何显示。
    • 我现在是否需要添加一个循环来让团队、积分和位置在按钮按下后显示在每列中?
    • 没有。一旦数据在 DataTable 中,DGV 将自动更新。
    • 我想我的最后一个问题是 row["Team"] = (teams[i].InnerText);为空白但 Console.WriteLine(teams[i].InnerText);显示输出
    猜你喜欢
    • 1970-01-01
    • 2011-10-11
    • 2012-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多