2009-03-20 7 views
0

У меня есть базовый класс формы, содержащий метод, который возвращает DataTable:DataBound DataGridView Empty Несмотря на полное 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; 
} 

Другое окно является подклассом его, и вызывает его следующим образом:

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 является System.Windows.Forms.BindingSource. Он устанавливается как свойство DataSource объекта System.Windows.Forms.DataGridView. (Выражение this.ObjectName оценивает имя таблицы или представление в базе данных.)

Когда я просматриваю код в отладчике, я вижу, что SQL выполняется просто отлично. Я вижу, что данные DataTable содержат данные. Я вижу, что элемент управления DataGridView должным образом привязан к источнику данных и что я могу видеть данные в таблице данных через его свойство DataSource. Однако в самом элементе управления данные не отображаются. Нет заголовков строк или столбцов, и никакие данные не отображаются вообще.

Я пробовал все, что я могу придумать, чтобы определить причину этой проблемы. Этот код работает точно так же, как показано на другой форме. Я попробовал удалить элементы управления и воссоздать их, но безрезультатно. Я консультировался с статьями о MSDN о том, как правильно привязывать данные к элементу управления DataGridView. Я пробовал его с OracleCommandBuilder (что мне не кажется нужным, так как это просмотр данных только для чтения).

Я откровенно из идей. Вероятно, это довольно очевидно, что я забыл. Я знаю, что привязка данных работает, потому что я сделал это с большим успехом.

Любые указатели в правильном направлении были бы очень признательны.

ответ

1

Я пробовал воссоздать вашу программу, используя фрагменты, которые вы упомянули здесь. Я действительно не получал данные из данных, но это не имеет значения. Вот что я сделал:

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

Это примерно то же самое, что у вас есть? У меня не было никаких проблем. Основываясь на том, что вы публикуете, это СЛЕДУЕТ работать. Вы уверены, что правильно привязываете друг к другу? Отправьте больше своего кода привязки, если это возможно ...

+0

Код, который я опубликовал, - это все код привязки данных, который есть. Он работает как в другом месте приложения. Пользователь выбирает таблицу/представление, и я показываю строки данных. Я понимаю, что DataTable имеет достаточно метаданных в нем, чтобы позволить DGV автоматически генерировать столбцы, поэтому мне не нужно. –