2017-10-10 5 views
0

Je travaille sur ce petit projet C# pour le travail et j'ai besoin d'ajouter des données à un contrôle DataGridView. Je l'avais travaillé avant mais malheureusement depuis que j'ai fait quelques changements sur mon code, je ne me souviens pas comment je l'avais avant. Tout ce dont je me souviens, c'est que dans VisualStudio, je revenais dans le Form.Designer.cs et que je changeais certains contrôles en public static avant de tester afin de pouvoir ajouter des lignes. J'ai lu quelque chose en ligne à ce sujet et ils ont suggéré de ne pas le faire, c'est pourquoi j'ai changé mon code.Impossible d'ajouter des lignes C# DataGridView

De toute façon aller de l'avant, j'ai la classe principale AutoCheck.cs qui a les méthodes suivantes:

public void addNASDestination(string[] info){ 
     /*string[0] = Name 
     * string[1] = Path 
     * string[2] = Username 
     * string[3] = Password - Needs to be passed to XML encrypted. Not displayed in the table at all 
     */ 
     destinationsTable.Rows.Add(info[0], "NAS", info[1], info[2], info[3]); 
     destinationsTable.Update(); 
     destinationsTable.Refresh(); 
     checkTableRowCount(); 
    } 

public void addBDRDestination(string[] info){ 
     /*string[0] = Name 
     * string[1] = Path 
     */ 
     destinationsTable.Rows.Add(info[0], "BDR", info[1]); 
     //destinationsTable.Update(); 
     //destinationsTable.Refresh(); 
     checkTableRowCount(); 
    } 

Ces méthodes ont déjà travaillé pour ajouter des lignes à la DataGridView. La valeur du tableau info est passé d'une autre classe appelée AddDialog.cs de la méthode:

private void destAddButton_Click(object sender, EventArgs e) 
    { 
     ac = new AutoCheck(); 
     if(destNameTextbox.TextLength <= 0 || destNameTextbox.Text == null){ 
      MessageBox.Show("Please enter a name","Error",MessageBoxButtons.OK,MessageBoxIcon.Error); 
     }else if(destPathTextbox.TextLength <= 0 || destPathTextbox.Text == null){ 
      MessageBox.Show("Please select a path", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
     }else if (!Directory.Exists(destPathTextbox.Text)){ 
      MessageBox.Show("Please select a valid path", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
     }else if (isNAS()) 
     { 
      if((destUserTextbox.TextLength <= 0 || destUserTextbox.Text == null) || (destPassTextbox.TextLength <= 0 || destPassTextbox.Text == null)){ 
       MessageBox.Show("Please enter a Username and Password", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
      }else{ 
       //If Name and User/Pass are good, add info to temp array and pass by reference to addNASDestination 
       string[] temp = new string[] { destNameTextbox.Text, destPathTextbox.Text, destUserTextbox.Text, AutoCheck.Encrypt(destPassTextbox.Text) }; 
       ac.addNASDestination(temp); 
       this.Dispose(); 
      } 
     }else{ 
      //Assume its a BDR and add info to temp array and pass by reference to addBDRDestination 
      string[] temp = new string[] {destNameTextbox.Text,destPathTextbox.Text}; 
      ac.addBDRDestination(temp); 
      this.Dispose(); 
     } 
    } 

AddDialog est que le nom décrit, une boîte de dialogue qui demande à l'utilisateur d'entrée, il saisit alors l'entrée et le met dans un tableau, passe le tableau par référence à addBDRDestination ou addNASDestination et ils doivent ajouter la nouvelle ligne au DataGridView.

Ce ne fonctionne pas pour moi et j'ai essayé de voir si les données sont même envoyées vers addBDRDestination ou addNASDestination par l'utilisation de Console.WriteLine pour produire les données passées et il est atteindre ces méthodes, mais la nouvelle La ligne n'est pas ajoutée.

J'ai essayé de rafraîchir la DataGridView en ajoutant ceci (Ceci est également toujours sur mon code affiché):

destinationsTable.Update(); 
destinationsTable.Refresh(); 

J'ai aussi essayé ce tutoriel: http://csharp.net-informations.com/datagridview/csharp-datagridview-add-column.htm Son sur la même chose que ce que je fais maintenant, mais il ajoute le tableau au lieu de le décomposer comme je le fais.

J'ai aussi essayé de créer un DataRow comme indiqué ici: https://social.msdn.microsoft.com/Forums/windows/en-US/f12158b3-4510-47cb-b152-409489c3a51a/how-to-add-rows-in-datagridview-programmatically?forum=winformsdatacontrols

DataRow dr = this.dt.NewRow(); 
dr["a"] = "ax"; 
dr["b"] = "add item"; 
destinationsTable.Rows.Add(dr); 

J'ai essayé activation et la désactivation AllowUserToAddRows mais qui n'a eu aucun effet.

J'ai aussi essayé ceci:

DataGridViewRow row = (DataGridViewRow)destinationsTable.Rows[0].Clone(); 
row.Cells[0].Value = info[0]; 
row.Cells[1].Value = "BDR"; 
row.Cells[2].Value = info[1]; 
destinationsTable.Rows.Add(row); 

Je ne suis pas sûr de ce que je peux essayer que cela a fonctionné pour moi avant et maintenant ses pas.

Je pense que la peine de mentionner que AddDialog.cs et AutoCheck.cs sont différents fichiers de classe/source, mais sont dans le même espace de noms AutoCheck.

Dans AddDialog.cs im accéder aux méthodes de AutoCheck.cs en ajoutant AutoCheck ac = new AutoCheck();. Et il en va de même pour AutoCheck à AddDialog.

Existe-t-il un autre moyen d'ajouter des lignes? ou peut-être que je fais quelque chose de mal avec mon code actuel? Merci beaucoup!

+0

Avez-vous ajouté vos colonnes? Voir à DataGridView.Columns. Et s'il vous plaît, ajoutez votre exception jetée, quand il y en a une. – Bagerfahrer

+0

Eh bien, j'ai ajouté les colonnes déjà dans le concepteur si c'est de cela que vous parlez. Sauf si j'ai besoin de les définir à nouveau lors de l'ajout de lignes. En ce qui concerne les exceptions, je ne reçois aucune exception et je ne sais pas quelle exception ajouter si j'ajoute manuellement une clause try catch. – xR34P3Rx

+0

S'il n'y a pas d'erreur, alors vous devriez surpasser votre conception. Il est cirtique, que nous ne pouvons pas regarder dans votre code pour le problème spécifique. Déboguer à travers vos méthodes jusqu'à ce que votre ligne devrait être ajoutée. Ou réécrivez votre code. – Bagerfahrer

Répondre

0

Je ne suis pas sûr de problème que vous rencontrez:

public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
      dgv.Columns.Add("cell_one", "Cell 1"); 
      dgv.Columns.Add("cell_two", "Cell 2"); 
      dgv.Columns.Add("cell_three", "Cell 3"); 
      dgv.Columns.Add("cell_four", "Cell 4"); 
      dgv.Columns.Add("cell_five", "Cell 5"); 
      addNASDestination(new string[] { "1", "3", "4", "5" }); 
     } 

     public void addNASDestination(string[] info) 
     { 
      /*string[0] = Name 
      * string[1] = Path 
      * string[2] = Username 
      * string[3] = Password - Needs to be passed to XML encrypted. Not displayed in the table at all 
      */ 
      dgv.Rows.Add(info[0], "NAS", info[1], info[2], info[3]); 
      //checkTableRowCount(); 
     } 
    } 

Il compile et fonctionne comme prévu.


Même ceci:

public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 

      DataTable dt = new DataTable("main"); 
      dt.Columns.Add("column_one", typeof(string)); 
      dt.Columns.Add("column_two", typeof(string)); 
      dt.Columns.Add("column_three", typeof(string)); 
      dt.Columns.Add("column_four", typeof(string)); 
      dt.Columns.Add("column_five", typeof(string)); 
      dgv.DataSource = dt; 
      addAnyRow(); 
     } 

     public void addAnyRow() { 
      var dt = (DataTable)dgv.DataSource; 
      var row = dt.NewRow(); 
      row["column_one"] = "1"; 
      row["column_two"] = "2"; 
      row["column_three"] = "3"; 
      row["column_four"] = "4"; 
      row["column_five"] = "5"; 
      dt.Rows.Add(row); 
    } 
} 

Ici, je les seperated:

namespace StackOverflow___46658777 
{ 
    public static class Global 
    { 
     public static DataGridView DestinationTable; 
    } 

    public partial class Form1 : Form 
    { 
     public Form1(bool dataTableOrManual = false) 
     { 
      InitializeComponent(); 
      Global.DestinationTable = dgv; 

      if (dataTableOrManual) { 
       var dt = new DataTable("main"); 
       dt.Columns.Add("column_one", typeof(string)); 
       dt.Columns.Add("column_two", typeof(string)); 
       dt.Columns.Add("column_three", typeof(string)); 
       dt.Columns.Add("column_four", typeof(string)); 
       dt.Columns.Add("column_five", typeof(string)); 
       dgv.DataSource = dt; 
       new TAutoCheck().AddAnyRow(); 
       new TAutoCheck().AddAnyRow(); 
       new TAutoCheck().AddAnyRow(); 
      } else { 
       dgv.Columns.Add("cell_one", "Cell 1"); 
       dgv.Columns.Add("cell_two", "Cell 2"); 
       dgv.Columns.Add("cell_three", "Cell 3"); 
       dgv.Columns.Add("cell_four", "Cell 4"); 
       dgv.Columns.Add("cell_five", "Cell 5"); 
       new TAutoCheck().AddNASDestination(new string[] { "1", "3", "4", "5" }); 
      } 
     } 
    } 

    public class TDialog : Form 
    { 
     public TDialog() 
     { 
      //anyButton.Click += validateRequest; 
     } 

     void validateRequest(object sender, EventArgs args) 
     { 
      new TAutoCheck().AddNASDestination(new string[] { "your", "validated", "strings", "are", "here" }); 
     } 
    } 

    public class TAutoCheck 
    { 
     public TAutoCheck() { } 

     public void AddAnyRow() 
     { 
      var dt = (DataTable)Global.DestinationTable.DataSource; 
      var row = dt.NewRow(); 
      row["column_one"] = "1"; 
      row["column_two"] = "2"; 
      row["column_three"] = "3"; 
      row["column_four"] = "4"; 
      row["column_five"] = "5"; 
      dt.Rows.Add(row); 
     } 

     public void AddNASDestination(string[] info) 
     { 
      /*string[0] = Name 
      * string[1] = Path 
      * string[2] = Username 
      * string[3] = Password - Needs to be passed to XML encrypted. Not displayed in the table at all 
      */ 
      Global.DestinationTable.Rows.Add(info[0], "NAS", info[1], info[2], info[3]); 
      //checkTableRowCount(); 
     } 
    } 
} 

fonctionne comme prévu. J'espère que c'est aussi proche que vous les avez séparés, parce que vous n'avez pas dit beaucoup sur la façon dont votre communication est entre vos classes et DataGridView. Séparer les classes dans les propres fichiers source ne change pas le comportement des classes et des fonctions à l'intérieur.

+0

Séparez-les. La façon dont je l'ai est qu'ils sont sur différents fichiers source, classe différente mais même espace de noms. Oui, si vous gardez tout dans la même classe, bien sûr, cela fonctionne mais ce n'est pas comment je l'ai configuré. – xR34P3Rx

+0

Votre DataTable est-il lié à votre DataGridView.DataSource? Vous parlez de deux classes, où définissez-vous/liez-vous DataTable à DataGridView? Vous devez uniquement utiliser celui-ci et le même DataTable sauf si vous liez un autre DataTable à DataGridView.DataSource. – Bagerfahrer

+0

Les classes séparées ou la logique dans les fichiers source ne sont pas une raison pour ne pas être fonctionnelle, sauf si vous faites des erreurs de conception et que vous interrompez la communication entre les classes. Jetez un oeil à la réponse éditée. Essayez d'adapter à partir de cela. – Bagerfahrer