2016-03-20 33 views
1

kullanılabilir önce iki kez yüklenmesi gerekiyor Bu görüntüyü iki kez yükledikten sonra sadece iki şey yapmak. bunu yaparC# Picturebox.Image ben bu komutla doldurulur bir windows Form PictureBox sahip kod

Positioning.CenterHorizontally(pBProcess, pBProcess.Image.Width); 

:

ilk şey

public static void CenterHorizontally(this Control control, int Width) 
{ 
    Rectangle parentRect = control.Parent.ClientRectangle; 
    control.Left = (parentRect.Width - Width)/2; 
} 

ve ben yapmaya çalışıyorum ikinci şey bir SQLDatabase görüntüyü kurtarmaktır.

cmdLine = "INSERT INTO " + processToSave + " (Picture) VALUES (@Image);"; 
MemoryStream stream = new MemoryStream(); 
pBProcess.Image.Save(stream, System.Drawing.Imaging.ImageFormat.Png); 
byte[] pic = stream.ToArray(); 
using (SqlCommand sqlCmd = new SqlCommand(cmdLine, connection)) 
{ 
//Parameter definieren 
    sqlCmd.Parameters.Add("@Image", SqlDbType.Image); 
    sqlCmd.Parameters["@Image"].Value = pic; 
    sqlCmd.ExecuteNonQuery(); 
} 

Picturebox.image dosyasını ikinci kez yükledikten sonra her iki eylem de doğru bir şekilde yürütülür.

Bunun nedeni nedir ve nasıl düzeltebilirim?

Düzenleme:

Bu ben resmi kaydetmek istediğiniz tablo oluşturmak nasıl:

//Tabelle wird erstellt und anschließend gefüllt 
strInsert = "CREATE TABLE " + processToSave + "(Attributes NVARCHAR(50), Value TINYINT, Picture IMAGE);"; 
using (SqlCommand sqlCmd = new SqlCommand(strInsert, connection)) 
{ 
    sqlCmd.ExecuteNonQuery(); 
} 
strInsert = "INSERT INTO " + processToSave + " (Attributes, Value) VALUES (@Attributes, @Value);"; 
foreach (ListViewItem item in checkedItems) 
{ 
    using (SqlCommand sqlCmd = new SqlCommand(strInsert, connection)) 
    { 
     //Parameter definieren 
     sqlCmd.Parameters.Add("@Attributes", SqlDbType.NVarChar); 
     sqlCmd.Parameters["@Attributes"].Value = item.Text; 
     sqlCmd.Parameters.Add("@Value", SqlDbType.Int); 
     sqlCmd.Parameters["@Value"].Value = Convert.ToInt32(item.SubItems[1].Text); 
     sqlCmd.ExecuteNonQuery(); 
    } 
} 
strInsert = "INSERT INTO " + processToSave + " (Picture) VALUES (@Image);"; 
MemoryStream stream = new MemoryStream(); 
pBProcess.Image.Save(stream, System.Drawing.Imaging.ImageFormat.Png); 
byte[] pic = stream.ToArray(); 
using (SqlCommand sqlCmd = new SqlCommand(strInsert, connection)) 
{ 
    //Parameter definieren 
    sqlCmd.Parameters.Add("@Image", SqlDbType.Image); 
    sqlCmd.Parameters["@Image"].Value = pic; 
    sqlCmd.ExecuteNonQuery(); 
} 

Ve bu DB'den resmini okumak nasıl:

MemoryStream stream = new MemoryStream(); 
strInsert = "SELECT [Picture] FROM " + processToLoad; 
SqlCommand sqlCmd2 = new SqlCommand(strInsert, connection); 
byte[] image = (byte[])sqlCmd2.ExecuteScalar(); 
stream.Write(image, 0, image.Length); 
Bitmap bitmap = new Bitmap(stream); 
pBProcess.Image = bitmap; 

bu çalışmıyor. Bunun için kod DbType Image ile sadece "resmi" var "Bilder" denilen DB bir tablo oluşturmak ve değiştirmek Ama ne zaman:

strInsert = "INSERT INTO Bilder (Picture) VALUES (@Image);"; 
MemoryStream stream = new MemoryStream(); 
pBProcess.Image.Save(stream, System.Drawing.Imaging.ImageFormat.Png); 
byte[] pic = stream.ToArray(); 
using (SqlCommand sqlCmd = new SqlCommand(strInsert, connection)) 
{ 
    //Parameter definieren 
    sqlCmd.Parameters.Add("@Image", SqlDbType.Image); 
    sqlCmd.Parameters["@Image"].Value = pic; 
    sqlCmd.ExecuteNonQuery(); 
} 

... 

MemoryStream stream = new MemoryStream(); 
strInsert = "SELECT [Picture] FROM Bilder"; 
SqlCommand sqlCmd2 = new SqlCommand(strInsert, connection); 
byte[] image = (byte[])sqlCmd2.ExecuteScalar(); 
stream.Write(image, 0, image.Length); 
Bitmap bitmap = new Bitmap(stream); 
pBProcess.Image = bitmap; 

Aslında çalışır. Orijinal kodumdaki sorun nedir?

+0

UI iş parçacığının dışına yüklenebilir mi? – TaW

+0

Bir combobox – Stef

+0

Hm'nin bir SelectionChangeCommitted Olayı'nın bir parçası, yine de, 'LoadCompleted''in beklemesi yardımcı olabilir mi? – TaW

cevap

0

Burada iki problemi karıştırıyordum.

Positioning.CenterHorizontally(pBProcess, pBProcess.Image.Width); 

sorun PictureBox içinde LoadCompleted Olay bu cümleyi koyarak giderilmiştir.

İkinci sorun, aslında çok sayıda satırını tablomun içine yerleştirdiğim (özellikler + değer) ve sonunda yalnızca görüntüyü içeren başka bir satır ekledim. Tabloyu görüntülerken okuduğumda sadece ilk satırı okuyorum (sanırım) ama bulunacak bir resim yoktu. Bu yüzden kodu değiştirdim, görüntüyü ilk satırın içine koyup komut satırını değiştirdim: