2017-08-05 1 views
0

J'ai deux formes (Menu, Base de données) à la fois avec datagridviews. Le premier formulaire a une colonne de bouton qui copie les informations de ligne à la vue datagridview sur l'autre formulaire et l'affiche. Il y a aussi un bouton sur le premier formulaire qui est destiné à ouvrir simplement l'instance de la deuxième forme précédemment ouverte. J'ai 2 problèmes principaux qui se produisent. La première est que la ligne se copie, mais lorsque j'appuie sur un autre bouton de colonne d'une autre ligne de la première forme, elle ouvre un nouveau formulaire au lieu d'ajouter sa valeur à l'instance du formulaire déjà ouvert. Le deuxième problème est que lorsque le bouton X en haut du second formulaire est enfoncé et que le formulaire se ferme, l'information est perdue. Cela ne me dérange pas de perdre l'information une fois l'application fermée, mais je veux la conserver indépendamment de la fermeture de la seconde forme. J'ai essayé d'utiliser singleton pour garder l'instance et Hide() pendant les événements de fermeture de formulaire pour empêcher la fermeture du second formulaire mais, peut-être que quelque chose manque ou n'est pas correct avec mon code.Comment puis-je conserver des informations datagridview sur un formulaire et empêcher un bouton .Show() de créer de nouvelles instances?

Première forme Menu

//Open Database 
    private void DB_Btn_Click(object sender, EventArgs e) 
    { 
     SendRow = false; 
     DataGridViewRow DB_GridViewRow = new DataGridViewRow(); 
     DataTable DB_Table = new DataTable(); 
     Database DB = new Database(DB_GridViewRow, SendRow); 
     DB = Database.GetInstance(); 
     DB.Show(); 
    } 

    //Copy To Database 

    private void LeadsDataGridView_CellContentClick(object sender, DataGridViewCellEventArgs e) 
    { 
     SendRow = true; 
     DataTable DB_Table = new DataTable(); 
     DataGridView DB_GridView = new DataGridView(); 

     if (!_DB.Visible) 
     { 
      _DB = new Database(LeadsDataGridView.Rows[e.RowIndex], SendRow); 
      _DB.Show(); 
     } 

     else 
     { 
      SendRow = false; 
      _DB = Database.GetInstance(); 
      _DB.BringToFront(); 
     } 
    } 

Formulaire deuxième base de données

DataTable DB_Table; 
    BindingList<DataPile> DB_GridViewList = new BindingList<DataPile>(); 

    private static Database _instance = null; 

    public static Database GetInstance() 
    { 
     bool SendRow = new bool(); 
     DataGridViewRow DB_GridViewRow = new DataGridViewRow(); 


     if (_instance == null) _instance = new Database(DB_GridViewRow, SendRow); 
     return _instance; 
    } 

    public Database() 
    { 
     InitializeComponent(); 
     InitDBTable(); 
     GetInstance(); 
     DB_GridView.DataSource = DB_GridViewList; 
    } 

    public Database(DataGridViewRow DB_GridViewRow, bool SendRow) 
    { 
     InitializeComponent(); 
     InitDBTable(); 
     DB_GridView.DataSource = DB_GridViewList; 

     if (DB_GridViewList != null && SendRow == true) 
     { 
      DB_GridViewList.Add(new DataPile { BusinessName = (string)DB_GridViewRow.Cells[1].FormattedValue, 
               PhoneNumber = (string)DB_GridViewRow.Cells[2].FormattedValue }); 
     } 

    } 

    public class DataPile 
    { 
     public string BusinessName { get; set; } 
     public string PhoneNumber { get; set; } 
     public string MobileNumber { get; set; } 
     public string ContactName { get; set; } 
     public string Email { get; set; } 
     public string MonthlyRevenue { get; set; } 
    } 

    private void InitDBTable() 
    { 
     DB_Table = new DataTable("DB_GridTable"); 
     DB_Table.Columns.Add("Business Name", typeof(string)); 
     DB_Table.Columns.Add("Phone Number", typeof(string)); 
     DB_Table.Columns.Add("Mobile Number", typeof(string)); 
     DB_Table.Columns.Add("Contact Name", typeof(string)); 
     DB_Table.Columns.Add("Email", typeof(string)); 
     DB_Table.Columns.Add("Monthly Revenue", typeof(string)); 
     DB_GridView.DataSource = DB_Table; 
    } 

    private void Database_Load(object sender, EventArgs e) 
    { 

    } 

    private void Database_FormClosing(object sender, FormClosingEventArgs e) 
    { 
     Hide(); 
     e.Cancel = true; // this cancels the close event. 
    } 
} 
+0

Chaque seconde fois que vous cliquez sur la ligne, il crée une nouvelle base de données. Get_Instance() définit la propriété .Visible sur false, ce qui crée ensuite une nouvelle base de données() au prochain clic. –

Répondre

0

code Vous est source de confusion et l'utilisation _instance n'est pas nécessaire. Ce n'est pas mon premier choix de code, mais voici une approche plus simple pour vous aider à démarrer. Vous remarquerez que _instance est complètement disparu maintenant que le formulaire principal a toujours un accès direct à votre base de données via _DB. En outre, vous étiez en train de créer DataTable, DataGridView & DataGridViewRows lorsqu'il n'était pas nécessaire, de sorte que ceux-ci ont été supprimés. Enfin, j'ai créé une nouvelle ligne appelée UniqueID. Assurez-vous simplement que cette ligne crée un nouvel ID à chaque fois. De cette façon, une seule copie de votre ligne sera transférée dans le nouveau formulaire.

Vous devrez gérer le transfert des modifications à votre formulaire principal si c'est ce qui est nécessaire.

Le formulaire principal:

bool SendRow; 
    Database _DB = new Database(); 

    public Form2() 
    { 
     InitializeComponent(); 
     LeadsDataGridView.Rows.Add("1", "ABCD", "555-1234", "555-5555", "john doe", "[email protected]", "1"); 
     LeadsDataGridView.Rows.Add("2", "EFGH", "555-9876", "555-1111", "jane white", "[email protected]", "21"); 
    } 

    //Copy To Database 
    private void LeadsDataGridView_CellContentClick(object sender, DataGridViewCellEventArgs e) 
    { 
     //if (e.ColumnIndex == LeadsDataGridView.Columns.GetFirstColumn(DataGridViewElementStates.None, DataGridViewElementStates.ReadOnly).Index) 
     // DB_Btn_Click(sender, e); 
     SendRow = true; 
     DataTable DB_Table = new DataTable(); 
     DataGridView DB_GridView = new DataGridView(); 

     _DB.AddRow(LeadsDataGridView.Rows[e.RowIndex], SendRow); 
     if (!_DB.Visible) 
     { 
      _DB.Show(); 
     } 
     else 
     { 
      _DB.BringToFront(); 
     } 
    } 

    private void pictureBox1_Click(object sender, EventArgs e) 
    { 
     pictureBox1.Hide(); 
    } 
} 

Le formulaire de base de données:

public DataTable DB_Table; 
    BindingList<DataPile> DB_GridViewList = new BindingList<DataPile>(); 

    public Database() 
    { 
     InitializeComponent(); 
     InitDBTable(); 
     DB_GridView.DataSource = DB_GridViewList; 
    } 

    public void AddRow(DataGridViewRow DB_GridViewRow, bool SendRow) 
    { 
     if (DB_GridViewList != null && SendRow == true) 
     { 
      foreach (DataGridViewRow dr in DB_GridView.Rows) 
       if (dr.Cells[0].Value == DB_GridViewRow.Cells[0].Value) 
        return; 
      DB_GridViewList.Add(new DataPile 
      { 
       UniqueID = (string)DB_GridViewRow.Cells[0].FormattedValue, 
       BusinessName = (string)DB_GridViewRow.Cells[1].FormattedValue, 
       PhoneNumber = (string)DB_GridViewRow.Cells[2].FormattedValue 
      }); 
     } 

    } 

    public class DataPile 
    { 
     public string UniqueID { get; set; } 
     public string BusinessName { get; set; } 
     public string PhoneNumber { get; set; } 
     public string MobileNumber { get; set; } 
     public string ContactName { get; set; } 
     public string Email { get; set; } 
     public string MonthlyRevenue { get; set; } 
    } 

    private void InitDBTable() 
    { 
     DB_Table = new DataTable("DB_GridTable"); 
     DB_Table.Columns.Add("UniqueID", typeof(string));    
     DB_Table.Columns.Add("Business Name", typeof(string)); 
     DB_Table.Columns.Add("Phone Number", typeof(string)); 
     DB_Table.Columns.Add("Mobile Number", typeof(string)); 
     DB_Table.Columns.Add("Contact Name", typeof(string)); 
     DB_Table.Columns.Add("Email", typeof(string)); 
     DB_Table.Columns.Add("Monthly Revenue", typeof(string)); 
     DB_GridView.DataSource = DB_Table; 
     // Hide UniqueID column 
     //DB_GridView.Columns[0].Visible = false; 
    } 

    private void Database_FormClosing(object sender, FormClosingEventArgs e) 
    { 
     Hide(); 
     e.Cancel = true; // this cancels the close event. 
    } 
} 
+0

Merci Troy Mac1ure, je suppose que j'étais trop penser au problème original, mais votre logique était exactement ce dont j'avais besoin pour compléter le bouton de copie. +1 Cheers! –