Comment augmenter dynamiquement les lignes de Datagridview et obtenir les valeurs de la liste déroulante en même temps?


Oxama Baig

J'ai vu de nombreuses questions pertinentes à ce sujet ici, mais aucune d'entre elles n'a de sens pour moi. Donc, tous ceux qui pourraient m'aider ici. Tout d'abord, je récupère les données du site Amazon et je sauvegarde les données dans ce DataGridView

dataGridViewScraping Données:

entrez la description de l'image ici

dataGridViewASINs:

entrez la description de l'image ici

J'ai réussi à gratter les données de la première page, mais lorsque j'essaie de gratter la deuxième donnée et d'essayer de mettre les données dans le datagridview, je reçois l'erreur

index hors limites. Doit être non négatif et **

J'obtiens également une erreur ici lorsque la boucle revient pour la deuxième fois et les premières données que je mets dans mon DataGridView sont le titre:

 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;
}

J'utilise ce code pour mettre les données dans le datagridview tout le code des autres colonnes est similaire à celui que j'utilise

Lignes [index] .Cellules [Indexation]

pour toutes les colonnes mais pour les colonnes Combobox, je n'ai pas utilisé cette indexation, je pense que cela ne fonctionne également que pour la première itération

 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);
}

Autre que cela, je veux aussi savoir après avoir mis des données dans datagridviewScrapingData. Je ne sais pas comment je peux récupérer toutes les données qui se trouvent dans la colonne combobox dans les données DataGridViewScraping. Je veux obtenir les données dans la liste de chaînes à partir du datagridviewScrapingData où j'ai enregistré toutes mes données. J'ai également vu de nombreuses questions pertinentes à ce sujet ici sur stackoverflow, mais aucune d'entre elles n'a de sens pour moi.

opewix

Il semble que votre approche de travail avec dataGridView soit un peu incorrecte. Vous essayez de travailler directement avec les lignes de la grille de données, mais l'idée est d'avoir une collection distincte comme List<Product>et de l'afficher via une source de liaison.

1. Créez d'abord une classe représentant votre produit comme:

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

2. Créez une liste de produits et ajoutez-les à cette liste.

3. Cliquez sur le dataGridView dans le concepteur de formulaires et notez le bouton fléché dans le coin supérieur droit. Cliquez dessus et générez une nouvelle source de données en sélectionnant votre Productclasse. DataGridBindingSource apparaîtra au bas du concepteur de formulaire. Supposons que son nom soit dataGridViewBindingSource.

4. Attribuez votre collection de produits à la source de liaison:

dataGridViewBindingSource.DataSource = products;

Vous pouvez maintenant modifier la collection de produits et afficher les produits mis à jour dans la grille en appelant dataGridView.Refresh()method. À ce stade, vous devez vous débarrasser de l'exception «Index hors plage» et vous avez une référence à votre collection de produits, vous n'avez donc pas à les «extraire» explicitement des lignes de grille de données.

5. Au lieu d'obtenir des valeurs de ComboBox, vous pouvez d'abord stocker des options dans un produit, puis les ajouter à une combobox.

Articles connexes