2010-07-07 4 views
1

J'essaye de faire une boucle dans mes boucles foreach et de cracher une sortie vers mon datagridview.Problèmes liés à DataGridView

Le datagridview a 3 colonnes définies: Chemin, ancien nom de fichier, nouveau nom de fichier

Cependant, je continue à frapper des erreurs.

Tout d'abord, voici le code:

public partial class SanitizeFileNames : Form 
{ 

    public SanitizeFileNames() 
    { 
     InitializeComponent(); 
    } 

    public void Sanitizer(List<string> paths) 
    { 
    string regPattern = (@"[~#&!%+{}]+"); 
     string replacement = ""; 

     Regex regExPattern = new Regex(regPattern); 
     List<string> existingNames = new List<string>(); 

     StreamWriter errors = new StreamWriter(@"C:\Documents and Settings\bob.smith\Desktop\SharePointTesting\Errors.txt", true); 
     StreamWriter resultsofRename = new StreamWriter(@"C:\Documents and Settings\bob.smith\Desktop\SharePointTesting\Results of File Rename.txt", true); 

     dataGridView1.Rows.Clear(); 
     var filesCount = new Dictionary<string, int>(); 


      try 
      { 

       foreach (string files2 in paths) 
       { 

       string filenameOnly = Path.GetFileName(files2); 
       string pathOnly = Path.GetDirectoryName(files2); 
       string sanitizedFileName = regExPattern.Replace(filenameOnly, replacement); 
       string sanitized = Path.Combine(pathOnly, sanitizedFileName); 


       if (!System.IO.File.Exists(sanitized)) 
       { 
        System.IO.File.Move(files2, sanitized); 
        DataGridViewRow dgr2 = new DataGridViewRow(); 
        dgr2.Cells[0].Value = pathOnly; 
        dgr2.Cells[1].Value = filenameOnly; 
        dgr2.Cells[2].Value = sanitized; 
        resultsofRename.Write("Path: " + pathOnly + "\r\n" + "Old File Name: " + filenameOnly + "\r\n" + "New File Name: " + sanitized + "\r\n" + "\r\n"); 

       } 

       else 
       { 
        if (filesCount.ContainsKey(sanitized)) 
        { 
         filesCount[sanitized]++; 
        } 
        else 
        { 
         filesCount.Add(sanitized, 1); 
        } 
        string newFileName = String.Format("{0}{1}{2}", 
        Path.GetFileNameWithoutExtension(sanitized), 
        filesCount[sanitized].ToString(), 
        Path.GetExtension(sanitized)); 
        string newFilePath = Path.Combine(Path.GetDirectoryName(sanitized), newFileName); 
        System.IO.File.Move(files2, newFilePath); 
        DataGridViewRow dgr2 = new DataGridViewRow(); 
        dgr2.Cells[0].Value = pathOnly; 
        dgr2.Cells[1].Value = filenameOnly; 
        dgr2.Cells[2].Value = newFileName; 
        resultsofRename.Write("Path: " + pathOnly + "\r\n" + "Old File Name: " + Path.GetFileNameWithoutExtension(files2) + "\r\n" + "New File Name: " + newFileName + "\r\n" + "\r\n"); 
       } 
       } 
       } 
      catch (Exception e) 
      { 

      errors.Write(e); 

      } 





    } 

    private void SanitizeFileNames_Load(object sender, EventArgs e) 
    { 

    } 

    private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e) 
    { 

    } 

} 

Tout d'abord, je suis nouveau sur C#, donc je ne suis même pas 100% sûr que ce soit correct. Ce que fait ce code est de prendre les chemins qui sont passés d'une autre méthode et de "nettoyer" les noms de fichiers en supprimant les caractères invalides (tels que définis dans mon modèle regex). Si le nom du fichier existe déjà, ajoutez le nom du fichier avec un nombre croissant (par exemple, ~ test.txt et% test.txt seront tous les deux renommés test.txt avec mon code, ~ test.txt deviendra test.txt et% test.txt devient test1.txt). Je essaie essentiellement d'ajouter ces données à mon datagridview (si le fichier aller à l'autre si (filesCount.ContainsKey (boucle aseptisé)).

J'obtiens des erreurs avec Path.GetFileNameWithoutExtension(), Path.GetExtension (.), Path.Combine(), Path.GetDIrectoryName() L'erreur est la suivante:

'System.Windows.Forms.DataGridViewTextBoxColumn' ne contient pas de définition pour 'GetFileName' et aucune méthode d'extension 'GetFileName' acceptant un premier argument de type 'System.Windows.Forms.DataGridViewTextBoxColumn' se trouve (vous manque une avec la directive ou un ensemble de référence ?)

Je ne sais pas ce que cela signifie ou comment résoudre ce problème. Quelqu'un peut-il aider?

+0

à partir du code que vous avez affiché Je ne vois pas où l'erreur de compilation serait. pouvez-vous indiquer la ligne (s) que vous obtenez l'erreur. – aqwert

+0

Je ne vois pas comment vous pourriez obtenir cette erreur basée sur le code ci-dessus. Mais laissez-moi vous poser une question, y a-t-il une raison pour laquelle vous devez utiliser une grille de données? Il serait peut-être plus simple d'utiliser un si vous voulez générer les lignes et les colonnes manuellement et ne pas vous lier à quoi que ce soit. Si vous pensez que cela pourrait fonctionner, je pourrais vous fournir un exemple de code pour cela. – CodingGorilla

Répondre

3

Je suppose que vous avez une variable/un champ DataGridViewTextBoxColumn appelé 'Path' quelque part. Renommez cette variable et/ou utilisez le nom complet System.IO.Path.GetFileName() etc.

De manière plus générale, arrêtez d'utiliser DatagridView en tant que structure de données. Faites-vous une faveur, définissez une classe avec les propriétés (colonne) que vous voulez, déclarez BindingList<MyFileClass> et liez DataGridView à cette liste.

+0

Je pense que c'est System.IO.Path.GetFileName() 'Aussi, ++ avoir une colonne nommée Path. C'est presque garanti à 100% ce qui se passe ... –

+0

@Tim: Oui, j'ai ajouté le .IO. –

0

Exemple:

public ArrayList GetSelectedRows(DataGrid datagrid) 
{ 
ArrayList arrSelectedRows = new ArrayList(); 
DataSet dset = (DataSet)datagrid.DataSource; 
for (int i=0; i<dset.Tables[0].Rows.Count; i++) 
{ 
if (datagrid.IsSelected(i)) 
{ 
DataRow drow = dset.Tables[0].Rows[i]; 
arrSelectedRows.Add(drow); 
} 
} 
return arrSelectedRows; 
} 

Cela devrait vous obtenir étiez vous voulez aller ... mais, de toute évidence pas tout à fait ce que vous étiez après non plus.

This should get you were you want to go...though, obviously not quite like what you were after either. 
Questions connexes