2009-03-20 6 views
0

J'ai une classe sous forme de base qui contient une méthode qui renvoie un DataTable:Databound DataGridView vide Malgré la pleine DataSource

protected DataTable GetTableData(string sql, OracleConnection connection) 
{ 
    DataTable table = null; 
    OracleDataAdapter adapter = null; 

    try 
    { 
    table = new DataTable(); 
    adapter = new OracleDataAdapter(sql, connection); 
    table.Locale = System.Globalization.CultureInfo.InvariantCulture; 
    adapter.Fill(table); 
    } 
    catch (Exception e) 
    { 
    MessageBox.Show("An error occurred while trying to process your request:\n\n" + e.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
    } 
    finally 
    { 
    if (null != adapter) 
    { 
     adapter.Dispose(); 
    } 
    } 
    return table; 
} 

Une autre fenêtre est une sous-classe, et il invoque comme suit:

private void LoadViewData(OracleConnection connection) 
{ 

    DataTable table = null; 

    try 
    { 
    var sql = "SELECT * FROM " + this.ObjectName; 
    table = GetTableData(sql, connection); 
    this.resultBindingSource.DataSource = table; 
    } 
    catch (Exception e) 
    { 
    MessageBox.Show("An error occurred while trying to process your request:\n\n" + e.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
    } 
    finally 
    { 
    this.sqlEditor.Focus(); 
    } 
} 

resultBindingSource est un System.Windows.Forms.BindingSource. Il est défini comme la propriété DataSource d'un System.Windows.Forms.DataGridView. (L'expression this.ObjectName évalue le nom d'une table ou d'une vue dans la base de données.)

Lorsque je parcours le code dans le débogueur, je constate que le code SQL s'exécute correctement. Je peux voir que le DataTable contient des données. Je peux voir que le contrôle DataGridView est correctement lié à la source de données, et que je peux voir les données dans la table de données à travers sa propriété DataSource. Cependant, aucune donnée n'est affichée dans le contrôle lui-même. Il n'y a aucun en-tête de ligne ou de colonne et aucune donnée n'est affichée.

J'ai essayé tout ce que je pouvais penser pour déterminer la cause de ce problème. Ce code fonctionne exactement comme indiqué sur un autre formulaire. J'ai essayé de supprimer les contrôles en question et de les recréer en vain. J'ai consulté les articles sur MSDN sur la façon de bien connecter à un contrôle DataGridView. Je l'ai essayé avec et sans OracleCommandBuilder (ce qui ne me semble pas nécessaire, puisqu'il s'agit d'une vue en lecture seule des données).

Je suis franchement à court d'idées. C'est probablement quelque chose d'assez évident que j'ai oublié. Je sais que la liaison de données fonctionne, parce que je l'ai déjà fait avec beaucoup de succès.

Tout pointeur dans la bonne direction serait grandement apprécié.

Répondre

1

J'ai essayé de recréer votre programme en utilisant les pièces que vous avez mentionnées ici. Je n'ai pas réellement obtenu de données à partir d'un datatable, mais ce n'est pas pertinent. Voici ce que j'ai fait:

public partial class Form1 : BaseForm 
    { 
     BindingSource source = new BindingSource(); 
     public Form1() 
     { 
      InitializeComponent(); 
      this.dataGridView1.DataSource = source; 

     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      DataTable table = GetDataTable(); 
      this.source.DataSource = table; 
     } 
    } 

    public class BaseForm : Form 
    { 
     protected DataTable GetDataTable() 
     { 
      DataTable result = new DataTable(); 
      result.Columns.Add("Name"); 
      result.Columns.Add("Age", typeof(int)); 
      result.Rows.Add("Alex", 27); 
      return result; 
     } 
    } 

Est-ce à peu près la même chose que vous? Je n'ai eu aucun problème du tout. Sur la base de ce que vous publiez ceci DEVRAIT fonctionner. Etes-vous sûr que vous vous liez tous les uns aux autres correctement? Postez plus de code de liaison si possible ...

+0

Le code que j'ai posté est tout le code de liaison de données qu'il y a. Cela fonctionne comme ailleurs dans l'application. L'utilisateur choisit une table/vue et affiche les lignes de données. Ma compréhension est que le DataTable a suffisamment de métadonnées pour permettre à la DGV de générer automatiquement des colonnes, donc je n'ai pas à le faire. –

Questions connexes