Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: Базы данных, ADO.NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
Simulkin Stas
76 / 76 / 11
Регистрация: 02.12.2011
Сообщений: 294
1

Отображение содержимого ячейки в PictureBox

10.05.2012, 14:50. Просмотров 1360. Ответов 2
Метки нет (Все метки)

Доброго времени суток, уважаемый форум!
Возникла такая проблема:
Имеется:
1. База данных, созданная в MS Access 2003, которая состоит из одной таблицы с тем же названием. Сама таблица состоит из четырёх полей: «id» – счетчик (ключевое поле); «Name» – текстовое; «Avg» – числовое; «Face» – поле объекта OLE (в него помещен рисунок).
2. Win-форма, на которой размещены dataGridView, PictureBox, а также элементы управления.
Вопрос: как отобразить содержимое поля/столбца «Face» в этом PictureBox, кликом мыши по соответствующей ячейке или перебором в bindingNavigator, а по умолчанию из первой строки.
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.05.2012, 14:50
Ответы с готовыми решениями:

Замена содержимого ячейки
Доброго времени суток! Подскажите плз как поменять значение определенной ячейки? OleDbCommand...

DataGridView запрет изменения содержимого ячейки
Здравствуйте, подскажите пожалуйста, как разрешить пользователю выделять содержимое ячейки...

Клик на элемент ListView отображение в pictureBox
Всем привет. Прошу помочь с вопросом отображения информации в picBox при клике на элемент...

Отображение содержимого DGV при смене DataSource
Уважаемые форумчане, ситуация такая - есть DGV и Combobox, при изменении значения которого ...

Динамическое отображение информации из ячейки БД в TextBox
Подключена БД к dataGridView,отображается нормально.Нужно при выборе определенной ячейки отображать...

2
Simulkin Stas
76 / 76 / 11
Регистрация: 02.12.2011
Сообщений: 294
12.05.2012, 21:22  [ТС] 2
Лучший ответ Сообщение было отмечено Simulkin Stas как решение

Решение

Приношу извиненния за не корректно поставленный вопрос...уточняю: для этой цели нужно создавать отдельный метод по схеме: подключение - запрос - создание потока и чтение в него - вывод в PictureBox или существует "волшебная кнопка" из семейства "свойства, "события" и т. п. ?

Добавлено через 12 часов 42 минуты
...в продолжение темы: написал метод, но при при попытке отработки события возникает исключение: "Отсутствует значение для одного или нескольких требуемых параметров". Не могу понять, похоже на то, что не верно записана процедура запроса. Вот код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
// Отработка нажатия кнопки "Показать изображение"
  private void btShowImage_Click(object sender, EventArgs e)
   {
   // Устанавливаем подключение к БД
      OleDbCommand cmd = new OleDbCommand();
      cmd.Connection = this.studentsTableAdapter.Connection;
   // Открываем соединение 
      cmd.Connection.Open();
   // Формируем запрос на вставку
      cmd.CommandType = CommandType.Text;
      cmd.CommandText = "SELECT image FROM students WHERE id = @id"; 
   // Делаем выборку
   /* На этой строке возникает исключение: "Отсутствует значение для одного или нескольких требуемых параметров". */                                                                                             
      OleDbDataReader oleDbDataReader = cmd.ExecuteReader();                                                      
   // Проверяем есть ли в выборке строки
     if (oleDbDataReader.HasRows)
      {
      // Создаём поток, в котором будем хранить изображение
         MemoryStream memoryStream = new MemoryStream();
      // Цикл для всех записей, полученных в результате выборки                                                                        
        foreach (DbDataRecord record in oleDbDataReader)
      // Пишем в поток                                                           
         memoryStream.Write((byte[])record["image"], 0, ((byte[])record["image"]).Length);
      // Получаем изображение из потока               
         Image image = Image.FromStream(memoryStream);
         this.pbFace.Image = Image.FromStream(memoryStream);
      // Освобождаем память
         memoryStream.Dispose();
      }
     else
   // Вывод сообщения
       {
          MessageBox.Show("Запрос вернул ноль строк!");
          return;
       }
   // Закрываем соединение с БД
      cmd.Connection.Close();
 }
0
Simulkin Stas
76 / 76 / 11
Регистрация: 02.12.2011
Сообщений: 294
15.05.2012, 19:28  [ТС] 3
Доброго времени суток, уважаемый форум! В продолжение (или развитие) поднятой темы возник такой вопрос.
На форме БД были добавлены две кнопки: «Добавить изображение» и «Показать изображение». Для них был составлен код, приведенный ниже. Первая часть («Добавить изображение») отрабатывает событие без каких-либо особых проблем, а вот вторая («Показать изображение») осуществляет выборку ТОЛЬКО изображения в ячейке самой первой строки. Как я подозреваю, причина заключается в том, что я не могу правильно написать запрос. Может кто-нибудь сможет подсказать, как правильно написать запрос?

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
// Обработка нажатия кнопки "Добавить изображение".
 private void btAddImage_Click(object sender, EventArgs e)
  {
  // Открываем FileDialog и выбираем файл с изображением
     OpenFileDialog ofdOpen = new OpenFileDialog();
     ofdOpen.Filter = "BMP files (*.bmp)|*.bmp| JPG files (*.jpg)|*.jpg| TIF files (*.tif)|*.tif| GIF files (*.gif)|*.gif| PNG files (*.png)|*.png";
     ofdOpen.FilterIndex = 2;
     ofdOpen.InitialDirectory = "c:\\";
  // Загружаем в картинку в PictureBox; его имя - "pbFace". 
     string sPathToCover = "";
    if (ofdOpen.ShowDialog() == DialogResult.OK)
     {
        pbFace.Load(ofdOpen.FileName);
        sPathToCover = ofdOpen.FileName;
  }
 // Устанавливаем подключение к БД
    OleDbCommand cmd = new OleDbCommand();
    cmd.Connection = this.studentsTableAdapter.Connection;
 // Формируем запрос на вставку
    cmd.CommandType = CommandType.Text;
    cmd.CommandText = "UPDATE students " + 
                      "SET Face = @Face " + 
                      "WHERE id = @id ";
 // Если изображение не введено - сообщаем
   if (sPathToCover == "")
    {
       MessageBox.Show("Нет изображения! ");
       return;
    }
 // Открываем поток и читаем изображение 
    FileStream fs = new FileStream(sPathToCover, FileMode.Open, FileAccess.Read);
 // Создаём массив и помещаем в него картинку
    byte[]  b = new byte[fs.Length]; 
    fs.Read(b, 0, b.Length); 
    fs.Close();
 // Выбираем столбец
    OleDbParameter pface = new OleDbParameter("@Face", OleDbType.LongVarBinary, b.Length);
    pface.Direction = ParameterDirection.Input;
    pface.Value = b;
    cmd.Parameters.Add(pface);
 // Делаем привязку к полю "id", которое является ключевым полем 
    OleDbParameter pid = new OleDbParameter("@id", OleDbType.Integer, sizeof(Int32)); 
    pid.Direction = ParameterDirection.Input;
    pid.Value = Convert.ToInt32(this.studentsDataGridView.CurrentRow.Cells[0].Value);  
    cmd.Parameters.Add(pid);
 // Устанавливаем соединение
    cmd.Connection.Open();
 // Выполняем запрос. 
    cmd.ExecuteNonQuery();
 // Закрываем соединение
    cmd.Connection.Close();
    this.studentsTableAdapter.Fill(this.studentsDataSet1.students);
 }
 
// А теперь нужно показать изображение
 
// Отработка нажатия кнопки "Показать изображение"
 private void btShowImage_Click(object sender, EventArgs e)
  {
  // Устанавливаем подключение к БД
     OleDbCommand cmd = new OleDbCommand();
     cmd.Connection = this.studentsTableAdapter.Connection;
  // Открываем соединение 
     cmd.Connection.Open();
  // Формируем запрос на вставку
     cmd.CommandType = CommandType.Text;
     cmd.CommandText = "SELECT Face FROM students WHERE id"; 
  // Делаем выборку
     OleDbDataReader oleDbDataReader = cmd.ExecuteReader();                                                      
  // Проверяем есть ли в выборке строки
    if (oleDbDataReader.HasRows)
     {
     // Создаём поток, в котором будем хранить изображение
        MemoryStream memoryStream = new MemoryStream();
     // Цикл для всех записей, полученных в результате выборки                                                                        
       foreach (DbDataRecord record in oleDbDataReader)
     // Пишем в поток                                                           
        memoryStream.Write((byte[])record["Face"], 0, ((byte[])record["Face"]).Length);
     // Получаем изображение из потока               
        Image image = Image.FromStream(memoryStream);
        this.pbFace.Image = Image.FromStream(memoryStream);
     // Освобождаем память
        memoryStream.Dispose();
     }
    else
  // Вывод сообщения
      {
         MessageBox.Show("Запрос вернул ноль строк!");
         return;
      }
  // Закрываем соединение с БД
     cmd.Connection.Close();
  }
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.05.2012, 19:28

Копирование содержимого одного PictureBox в другой PictureBox
Здравствуйте, допустим у меня есть paintbox1 в котором я рисую сложный график, и есть paintbox2....

Перемещение содержимого ячейки Б в ячейку А при удалении содержимого в ячейке А
Суть проблемы следующая. Имеется диапазон ячеек с текстом в каждой. При выделении любой из ячеек и...

Изменение содержимого одной ячейки Datagridview после изменения другой ячейки
Здравствуйте. Есть Datagridview с 2 столбцами. Столбцы типа ComboBox. В 1 столбце уже забиты...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru