Как динамически увеличивать строки Datagridview и получать значения комбинированного списка сразу? - PullRequest
0 голосов
/ 19 января 2019

Я видел много вопросов, имеющих отношение к этому здесь, но ни один из них не имеет никакого смысла для меня. Так что любой, кто мог бы помочь мне здесь. Прежде всего я собираю данные с сайта Amazon и сохраняю данные в этом DataGridView

dataGridViewScraping Data:

enter image description here

dataGridViewASINs:

enter image description here

Я успешно очищаю данные первой страницы, но когда я пытаюсь почистить вторые данные и пытаюсь поместить данные в таблицу данных, я получаю сообщение об ошибке

индекс вне диапазона. Должен быть неотрицательным и **

Я также получаю сообщение об ошибке, когда цикл возвращается во второй раз, и первые данные, которые я помещаю в свой 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;
}

Я использую этот код для помещения данных в таблицу данных, все остальные столбцы кода аналогичны тому, что я использую

Ряды [индекс] .Cells [Indexing]

для всех столбцов, но для столбцов Combobox я не использовал это индексирование, я думаю, что это также работает только для первой итерации

 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 Data. Я хочу получить данные в список строк из datagridviewScrapingData, где я сохранил все свои данные. Я также видел много вопросов, имеющих отношение к этому, здесь, на stackoverflow, но ни один из них не имеет для меня никакого смысла.

1 Ответ

0 голосов
/ 19 января 2019

Похоже, ваш подход к работе с 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 вы можете сначала сохранить параметры в продукте, а затем добавить их в комбинированный список.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...