2016-09-10 2 views
2

Ich habe eine Fensterformularanwendung gemacht, indem ich die Daten zum datagridview gezeigt habe. Aber es gab ein Problem, wenn die Daten in der Datagridview angezeigt wurden.Gibt es Unterschiede in der Aufruffunktion in form_load und button_click?

Die Funktion:

private void MySQL_ToDatagridview4() 
{ 
    dataGridView3.Columns.Clear(); 
    mcon.Close(); 
    mcon.Open(); 
    MySqlDataAdapter MyDA = new MySqlDataAdapter(); 
    string sqlSelectAll = "SELECT Item_Name,Item_Pic from stockitem ORDER BY Main_Category_ID ASC, Item_Name ASC"; 
    MyDA.SelectCommand = new MySqlCommand(sqlSelectAll, mcon); 
    DataTable table = new DataTable(); 
    MyDA.Fill(table); 
    BindingSource bSource = new BindingSource(); 
    bSource.DataSource = table; 
    this.dataGridView3.DataSource = bSource; 
    DataGridViewImageColumn imageColumn = new DataGridViewImageColumn(); 
    imageColumn.HeaderText = "Pic"; 
    dataGridView3.Columns.Insert(0, imageColumn); 
    for (int i = 0; i < table.Rows.Count; i++) 
    { 
     try 
     { 
      String pic = table.Rows[i]["Item_Pic"].ToString(); 
      Byte[] bitmapData = Convert.FromBase64String(FixBase64ForImage(pic)); 
      System.IO.MemoryStream streamBitmap = new System.IO.MemoryStream(bitmapData); 
      def = new Bitmap((Bitmap)Image.FromStream(streamBitmap)); 
     } 
     catch (Exception e) 
     { 
      MessageBox.Show(e.StackTrace); 
     } 
     dataGridView3.Rows[i].Cells[0].Value = def; 
    } 
    dataGridView3.Columns.Remove("Item_Pic"); 
    foreach (DataGridViewRow row in dataGridView3.Rows) 
    { 
     row.Height = 110; 
    } 
    foreach (DataGridViewColumn col in dataGridView3.Columns) 
    { 
     col.Width = 110; 
    } 

    for (int i = 0; i < dataGridView3.ColumnCount; i++) 
    { 
     dataGridView3.Columns[i].SortMode = DataGridViewColumnSortMode.NotSortable; 
     dataGridView3.AutoResizeColumns(); 
     dataGridView3.Columns[i].DefaultCellStyle.Font = new System.Drawing.Font("Verdana", 8F, FontStyle.Bold); 
    } 
    mcon.Close(); 
} 

in Form_Load Called

private void Form1_Load(object sender, EventArgs e) 
{ 
    MySQL_ToDatagridview4(); 
} 

Ergebnis:

Image

Dann, wenn ich auf die Schaltfläche klicken

private void button6_Click(object sender, EventArgs e) 
{ 
    MySQL_ToDatagridview4(); 
} 

Ergebnis:

Image2

Warum das Ergebnis so anders? Es ruft dieselbe Funktion auf.

+0

Kontext ist alles. Das 'Load'-Ereignis wird nur einmal ausgelöst, wenn das' Form'-Objekt initialisiert wird. Offensichtlich wurde etwas, von dem die Ansicht abhängt, noch nicht vollständig initialisiert, wenn das Ereignis 'Laden' ausgelöst wird. Was das ist, kann ich nicht sagen. Sie haben kein gutes [mcve] hinzugefügt, das das Problem in Ihrer Frage zuverlässig reproduziert. Bitte verbessern Sie die Frage, wenn Sie eine gute Antwort wünschen. –

Antwort

1

ja. da ist ein Unterschied. Siehe Form events life cycle. Form Load-Ereignis tritt auf, bevor ein Formular zum ersten Mal angezeigt wird.

Verwenden Sie das Formular Event gezeigt. Es kann Ihnen helfen, stellen Sie sicher, dass UI-Thread glatt ist (ich meine, zu vermeiden, Message-Box Art von Sachen zu verwenden, bis die Seite vollständig angezeigt und bemalt ist).

+0

Aber warum scheitert es im Falle des Ereignisses form_Load? Ist es etwas, das für das Steuerelement der Datagrid-Ansicht spezifisch ist oder wenn die Bitmap-Bilder in die Rasteransicht geladen werden? Ich mache so oft Datenquelle von Steuerelementen wie Dropdown-Liste usw. und es funktioniert auch in Form_load-Ereignis. – RBT

Verwandte Themen