如何动态地增加Datagridview的行并一次获得所有组合框值?

时间:2019-01-19 07:23:16

标签: c# wpf datagridview

我在这里看到了许多与此相关的问题,但对我来说,这些问题都没有。所以任何可以在这里帮助我的人。 首先,我要从Amazon网站上抓取数据并将数据保存在此DataGridView中

dataGridViewScraping数据:

enter image description here

dataGridViewASIN:

enter image description here

我成功抓取了第一页数据,但是当我尝试抓取第二个数据并将数据放入datagridview时,我得到了错误

  

索引超出范围。必须为非负且**

当循环第二次返回并且我放入DataGridView的第一个数据是标题时,我在这里也遇到错误:

 for (int i = 0; i < dataGridViewASINs.Rows.Count - 1; i++)
    {
 //Getting Title
            string title = driver.FindElement(By.Id("productTitle")).GetAttribute("innerText");
            dataGridViewScrapingData.Rows[i].Cells[cols].Value = title;
}

我正在使用此代码将数据放入datagridview中,所有其他列的代码都与我正在使用的

  

行[index] .Cells [索引]

对于所有列,但对于组合框列,我认为我没有使用此索引,因此也仅适用于第一次迭代

 for (int i = 0; i < dataGridViewASINs.Rows.Count - 1; i++)
        {
 List<IWebElement> imageCounts = driver.FindElements(By.XPath("//ul[@class='a-unordered-list a-nostyle a-button-list a-vertical a-spacing-top-extra-large']//li[@class='a-spacing-small item imageThumbnail a-declarative']//span[@class='a-button-text']//img")).ToList();        
                element = driver.FindElement(By.Id("landingImage"));
                comboState.Items.Add(element.GetAttribute("src"));        
                for (int j = 0; j < imageCounts.Count - 1; j++)
                {
                    //Clicking that Element
                    string GenricXpath = "//ul[@class='a-unordered-list a-nostyle a-button-list a-vertical a-spacing-top-extra-large']//li[" + (j + 5).ToString() + "]//span[1]//span[1]//span[1]//input[1]";
                    element = driver.FindElement(By.XPath(GenricXpath)); element.Click();
                    //Extracting URL now
                    string AnotherXpath = "//li[@class='image item itemNo" + (j + 1).ToString() + " maintain-height selected']//img";
                    element = driver.FindElement(By.XPath(AnotherXpath)); comboState.Items.Add(element.GetAttribute("src"));
                }
                dataGridViewScrapingData.Columns.Add(comboState);
}

除此之外,在将数据放入datagridviewScrapingData之后,我也想知道。我不知道如何获取DataGridViewScraping数据的combobox列中的全部数据。我想将数据从datagridviewScrapingData获取到字符串列表中,在此我已保存了全部数据。在stackoverflow上,我也看到了许多与此相关的问题,但是对我来说,这些问题都没有。

1 个答案:

答案 0 :(得分:0)

看起来您使用dataGridView的方法有点不正确。您尝试直接使用数据网格行,但其想法是要有一个像List<Product>这样的单独集合,并通过绑定源进行显示。

1。首先创建一个代表您的产品的类,例如:

public class Product
{
    public string Title { get; set; }
    public string Asin { get; set; }
}

2。创建产品列表并将其刮到该列表。

3。在表单设计器中单击dataGridView,然后注意右上角的箭头按钮。单击它,然后通过选择您的Product类来生成新的数据源。 DataGridBindingSource将出现在表单设计器的底部。假设它的名称为dataGridViewBindingSource

4。将您的产品集合分配给绑定源:

dataGridViewBindingSource.DataSource = products;

现在,您可以通过调用dataGridView.Refresh()方法来修改产品集合并在网格中显示更新的产品。此时,您应该摆脱“索引超出范围”异常,并且可以引用产品集合,因此不必从数据网格行中显式“提取”它们。

5。不必从ComboBox中获取值,您可以先将选项存储在产品中,然后将其添加到组合框。