2016-09-15 4 views
0

Я пытаюсь сделать этот каталог приложение, которое отображать изображения с его «название» и «категории», но я не могу показаться, чтобы отобразить изображение из-за ошибки на линии, которая говоритРисование изображений в ListView

images.Images.Add(row["id"].ToString(), new Bitmap(image_stream)); 

Это весь мой код. Мне нужно решение, чтобы я мог распечатать изображение с его соответствующими деталями в виде списка. Спасибо.

namespace WindowsFormsApplication2 
    { 
     public partial class Form1 : Form 
     { 
      public Form1() 
      { 
       InitializeComponent(); 

       comboBox1.Items.Add("Books"); 
       comboBox1.Items.Add("Games"); 
       comboBox1.Items.Add("Music"); 
      } 

      SqlConnection connection = new SqlConnection("Data Source=DESKTOP-4T5BLQ6\\SQLEXPRESS;Initial Catalog=CatalogDB;Integrated Security=True"); 
      SqlCommand command = new SqlCommand(); 
      SqlDataAdapter dataAdapter = new SqlDataAdapter(); 
      SqlDataReader dataReader; 
      DataTable dataTable = new DataTable(); 
      MemoryStream stream1; 
      byte[] photo_array; 

      private void Form1_Load(object sender, EventArgs e) 
      { 

      } 

      private void button1_Click(object sender, EventArgs e) 
      { 
       connection.Open(); 
       int i = 0; 

       MemoryStream stream = new MemoryStream(); 
       command.CommandText = "insert into EntryTable(Title,Category,Image) values('" + textBox1.Text + "','" + comboBox1.Text + "','" + pictureBox1.Image + "')"; 
       pictureBox1.Image.Save(stream, System.Drawing.Imaging.ImageFormat.Jpeg); 
       byte[] pic = stream.ToArray(); 

       if (i > 0) 
       { 
        MessageBox.Show("Saved new item in index" + i); 
       } 

       connection.Close(); 
       MessageBox.Show("Made New Entry"); 
       showData(); 
       clear(); 
      } 

      void clear() 
      { 
       textBox1.Clear(); 
       pictureBox1.Image = null; 
       comboBox1.SelectedIndex = -1; 
      } 

      private void button2_Click(object sender, EventArgs e) 
      { 
       OpenFileDialog ofd = new OpenFileDialog(); 
       ofd.Filter = "Images only. |*.jpg; *jpeg; *.png; *.gif; *.bmp;"; 
       DialogResult result = ofd.ShowDialog(); 
       if (result == DialogResult.OK) 
       { 
        pictureBox1.Image = Image.FromFile(ofd.FileName); 
       } 
      } 
      private void showData() 
      { 
       connection.Open(); 
       listView1.Clear(); 
       ImageList images = new ImageList(); 
       images.ColorDepth = ColorDepth.Depth32Bit; 
       listView1.LargeImageList = images; 
       listView1.LargeImageList.ImageSize = new System.Drawing.Size(100 , 100); 
       command.Connection = connection; 
       command.CommandText = "SELECT * FROM EntryTable"; 
       dataAdapter.SelectCommand = command; 
       dataTable.Clear(); 
       dataAdapter.Fill(dataTable); 
       foreach (DataRow row in dataTable.Rows) 
       { 
        var image_buffer = (byte[])(row["Image"]); 
        MemoryStream image_stream = new MemoryStream(image_buffer, true); 
        image_stream.Write(image_buffer, 0, image_buffer.Length); 
        images.Images.Add(row["id"].ToString(), new Bitmap(image_stream)); 
        image_stream.Close(); 
        ListViewItem listItem = new ListViewItem(); 
        listItem.Text = row["Title"].ToString(); 
        listItem.ImageKey = row["Image"].ToString(); 
        listView1.Items.Add(listItem); 
        listView1.Items.Add(row["Category"].ToString()); 
        listView1.Items.Add(row["Title"].ToString()); 

       } 



       connection.Close(); 
      } 
     } 
    } 
+0

Вполне вероятно, что image_stream равна нулю в то время. Если вы посмотрите на подпись метода ImageList.Add, то это говорит об исключении из NULL-аргументов. Вы должны перенести этот оператор в блок catch try. Я предполагаю, что изображение возвращается обратно из базы данных. –

+0

Как это сделать? :) –

+0

В каком формате вы храните его в БД? Изображение или байты? –

ответ

0

Xoriel,

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

Теперь вы спрашиваете, как реализовать попытку поймать? Вы должны сделать немного исследований самостоятельно. Что касается попытки поймать, вы можете начать Here.

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

foreach (DataRow row in dataTable.Rows) 
    { 
    var image_buffer = (byte[])(row["Image"]); 
    MemoryStream image_stream = new MemoryStream(image_buffer, true); 
    image_stream.Write(image_buffer, 0, image_buffer.Length); 
    try 
    { 
     images.Images.Add(row["id"].ToString(), new Bitmap(image_stream)); 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine(ex.Message); 
    } 
    image_stream.Close(); 
    ListViewItem listItem = new ListViewItem(); 
    listItem.Text = row["Title"].ToString(); 
    listItem.ImageKey = row["Image"].ToString(); 
    listView1.Items.Add(listItem); 
    listView1.Items.Add(row["Category"].ToString()); 
    listView1.Items.Add(row["Title"].ToString()); 
    } 

Ваша истинная проблема заключается в формате, в котором вы храните изображения в базу данных и способ, в котором вы извлекаете его.

С уважением,

Марк

+0

Большое вам спасибо за это. Я лечу с окнами. Простите мое невежество. –

+0

Невежество легко исправить, глупость намного сложнее ... Желаю вам удачи в вашем обучении. –

Смежные вопросы