Модераторы: gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как сделать такой DataBindings, DataBindings 
:(
    Опции темы
shark1
Дата 29.4.2008, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 274
Регистрация: 10.11.2007

Репутация: нет
Всего: нет



Как сделать такой DataBindings.Вобщем есть программа кот.работает с видео.Работает след.образом.
На складе стоит камера,например пришол один и тот же тавар(например дрель),у него один и тотже серийный номер только какие то детали отличаются.Теперь рабочий вносит в прогу сер.номер и фотографирует деталь(одну,затем другую и т.д).Теперь все это дело соответственно помещается в DB.Вопрос ,как например во время поиска если я набираю сер.номер,и у него есть две или пять фотографий(из db),как одновременно показать все сразу.У меня сейчас получается так.В поиске ввожу сер.номер в базе происходит сортировка(соответственно остаётся нужный сер.номер)но вот как сделать чтоб показывались сразу все фото(потому что,сейчас показывается фото из строки на кот.стоит курсор в db).Зарание спасибо.
PM MAIL   Вверх
thomas
Дата 29.4.2008, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент... почти
***


Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: " Сказочное королевство"

Репутация: 35
Всего: 65



shark1, 
Приветствую.
Решение одно, нормализация БД.
Твои фото должны храниться в отдельной таблице.
Каждая запись в которой имеет уникальный номер(первичный ключ, который лучше сделать автонумерационным) и включает в себя поле с фотографией (массив байтов или адрес файла с фото), а так же поле с указанием на номер детали с которой сделана фотография.

В таблице деталей номер будет являться первичным ключом таблицы, а в таблице фотографий это будет вторичный ключ.
Тогда получиться, что каждая твоя деталь может иметь много фотографий, которые храняться в таблице фотографий.

А что бы получить эти фото для определенной детали пишем команду на выборку с условием отбора
Код

SELECT foto FROM tblFotos WHERE detailID = 159357456

Эта команда выдаст тебе все имеющиеся фото этой детали.
А уж как ты их будешь юзверю показывать это твоя проблема.

Добавлено через 3 минуты и 18 секунд
Цитата

как сделать чтоб показывались сразу все фото

Например выведи все фото этой детали в DataGridView с прокруткой.


--------------------
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
PM MAIL   Вверх
shark1
Дата 29.4.2008, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 274
Регистрация: 10.11.2007

Репутация: нет
Всего: нет



Спасибо,я тоже начал подумывать о второй таблице,но вот вариант с DGV мне больше нравится,ведь сейчас я и так вывожу данные в DGV,а можно как то сделать размер ячейки в DGV под размер фотографии,а может можно как то поместить фото например рядом с DGV в ListBox или в ListView.Спасибо.
PM MAIL   Вверх
thomas
Дата 29.4.2008, 23:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент... почти
***


Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: " Сказочное королевство"

Репутация: 35
Всего: 65



shark1, 
Цитата

Спасибо,я тоже начал подумывать о второй таблице,но вот вариант с DGV мне больше нравится

Одно к другому не относиться.
Отдельная таблица для фотографий по любому нужна. Так как ты хочешь для одной детали несколько фотографий иметь. 


--------------------
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
PM MAIL   Вверх
shark1
Дата 29.4.2008, 23:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 274
Регистрация: 10.11.2007

Репутация: нет
Всего: нет



Понял ,завтра попробую создам новую таблицу.Спасибо.
PM MAIL   Вверх
thomas
Дата 29.4.2008, 23:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент... почти
***


Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: " Сказочное королевство"

Репутация: 35
Всего: 65



Иначе у тебя в основной таблице получаются для одной детали несколько идентичных записей, но с разными фотографиями.
А такого не может быть по определению.


--------------------
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
PM MAIL   Вверх
shark1
Дата 29.4.2008, 23:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 274
Регистрация: 10.11.2007

Репутация: нет
Всего: нет



А ка насчет увеличить ячейку в DGV до размера фото ? чтоб можно было прямо в DGV просматривать фото.Спасибо.
PM MAIL   Вверх
shark1
Дата 1.5.2008, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 274
Регистрация: 10.11.2007

Репутация: нет
Всего: нет



Сдрасте всем Возвращаясь к моему вопросу,что то я совсем запутался.Я разделил таблицу и сделал две:
1)ItemsNumber.
в ней:
CompanyName-Text
ItemNumber -Text(это номер детали)
InsertDate-Text
Remarks -Text
ID - AutoNumber(key)


2)Photos
в ней:
ItemNumber -Text(это номер детали)
Photo - OLE Object
Link - Text
IDPhoto-AutoNumber(key)

А теперь подскажите как их связать.Пробую :
Код

void GetImagesFromDatabase1()
        {

            try
            {
                
                conn1 = new OleDbConnection();
                
                conn1.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\Data\\storage_DB.mdb";
                //Initialize adapter.
               
                command1 = new OleDbCommand();
                command1.Connection = conn1;
                adapter1 = new OleDbDataAdapter(command1);
                adapter1 = new OleDbDataAdapter("SELECT * FROM Photos ", conn1);
                

                //Initialize Dataset.
                
                ds1 = new DataSet();
                dataTable1 = ds1.Tables.Add("Photos");

                //Fill dataset with ImagesStore table.
               

                adapter1.Fill(ds1, "Photos");

                //Fill Grid with dataset.
                
                dataGridView2.DataSource = ds1.Tables["Photos"];

                

                foreach (DataGridViewColumn column in dataGridView2.Columns) column.SortMode = DataGridViewColumnSortMode.NotSortable;

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }

но что то ни как.Зарание спасибо.
PM MAIL   Вверх
thomas
Дата 1.5.2008, 19:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент... почти
***


Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: " Сказочное королевство"

Репутация: 35
Всего: 65



shark1, 
Привествую.
Если твои детали имеют уникальные номера, то убери из таблицы ItemsNumber (таблица названа по тарабарски  smile ) поле ID, поле с номером детали сделай первичным ключом.
А потом по нему связывай таблицы детали <=> фото

А для отображения фотографий твоих деталей можно сделать так:
- первый грид заполняешь списком деталей и их данными;
-при выделении нужной детали, заполняй вторую таблицу в Датасет фотками этой детали (запрос к базе с параметром WHERE в котором указываешь номер выбранной в гриде детали);
-вот эту вторую таблицу указываешь как DataSource для второго грида, в котором сделай ячейки для отображения фото.
 Или как вариант, создавай динамически нужное кол-во PictureBox-ов и выводи в них фото из таблицы.

Запрос на фото
Код

SELECT Photo, Link FROM Photos WHERE ItemNumber = ?

это запрос с параметром. Присваиваешь параметру значение номера детали и получишь, не все фото всех деталей, а только нужной.

Добавлено через 3 минуты и 18 секунд
ЗЫ для именования таблиц в БД лучше использовать простое правило.
Именовать именем существительным во множественном числе, которое определяет содержание таблицы.
Добавлять префикс tbl, тогда в коде программы будешь четко знать где имя таблицы из БД, а где имя таблицы из ДатаСет (именование без префиксов)
tblPhotos в БД, photos в ДатаСет.


--------------------
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
PM MAIL   Вверх
shark1
Дата 2.5.2008, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 274
Регистрация: 10.11.2007

Репутация: нет
Всего: нет



thomas здраствуй.Вот так изменил DB.
Теперь:
1)tbl_ItemsNumber.
в ней:
CompanyName-Text
ItemNumber -Text(key)
InsertDate-Text
Remarks -Text

2)tbl_Photos
в ней:
ItemNumber -Text(это номер детали)
Photo - OLE Object
Link - Text
IDPhoto-AutoNumber(key)
затем пытаюсь связать две таблици но что то я так намудрил,что невыходит .DataBindings работает только на первую таблицу а если во второй функции открываю DataBindings,то он пишет что два DataBindings не может быть.Подскажи плиззз где я намудрил если разберёшся в моих каракулях.Зарание огромное спасибо.

Код

void GetImagesFromDatabase()
        {

            try
            {
                conn = new OleDbConnection();
                
                conn.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\Data\\storage_DB.mdb";
                
                //Initialize adapter.
                command = new OleDbCommand();
                command.Connection = conn;
                adapter = new OleDbDataAdapter(command);
                adapter = new OleDbDataAdapter("Select * from tbl_ItemsNumber", conn);                

                //Initialize Dataset.
                ds = new DataSet();
                dataTable = ds.Tables.Add("ItemsNumber");

                //Fill dataset with ImagesStore table.
                adapter.Fill(ds, "ItemsNumber");
               

                //Fill Grid with dataset.
                dataGridView1.DataSource = ds.Tables["ItemsNumber"];              


                this.txt_ItemNumber.DataBindings.Add("Text", dataTable, "ItemNumber", true, DataSourceUpdateMode.OnPropertyChanged);
                this.txt_CompanyName.DataBindings.Add("Text", dataTable, "CompanyName", true, DataSourceUpdateMode.OnPropertyChanged);
                this.txt_InsertDate.DataBindings.Add("Text", dataTable, "InsertDate", true, DataSourceUpdateMode.OnPropertyChanged);
                this.rtb_Remarks.DataBindings.Add("Text", dataTable, "Remarks", true, DataSourceUpdateMode.OnPropertyChanged);             

                foreach (DataGridViewColumn column in dataGridView1.Columns) column.SortMode = DataGridViewColumnSortMode.NotSortable;

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }
        void GetImagesFromDatabase1()
        {
            try
            {                
                conn1 = new OleDbConnection();
                
                conn1.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\Data\\storage_DB.mdb";
                //Initialize adapter.
               
                command1 = new OleDbCommand();
                command1.Connection = conn1;
                adapter1 = new OleDbDataAdapter(command1);
                adapter1 = new OleDbDataAdapter("SELECT Photo FROM tbl_Photos ", conn1);
               

                //Initialize Dataset.
                
                ds1 = new DataSet();
                dataTable1 = ds1.Tables.Add("Photos");

                //Fill dataset with ImagesStore table.
               

                adapter1.Fill(ds1, "Photos");

                //Fill Grid with dataset.
                
                dataGridView2.DataSource = ds1.Tables["Photos"];

                //this.txt_ItemNumber.DataBindings.Add("Text", dataTable1, "ItemNumber", true, DataSourceUpdateMode.OnPropertyChanged);
                //this.txt_CompanyName.DataBindings.Add("Text", dataTable, "CompanyName", true, DataSourceUpdateMode.OnPropertyChanged);
                //this.txt_InsertDate.DataBindings.Add("Text", dataTable, "InsertDate", true, DataSourceUpdateMode.OnPropertyChanged);
                //this.rtb_Remarks.DataBindings.Add("Text", dataTable, "Remarks", true, DataSourceUpdateMode.OnPropertyChanged);
                //this.pictureBox10.DataBindings.Add("Image", dataTable1, "Photo", true, DataSourceUpdateMode.OnPropertyChanged);


                foreach (DataGridViewColumn column in dataGridView2.Columns) column.SortMode = DataGridViewColumnSortMode.NotSortable;

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }
private void dataGridView2_CellEnter(object sender, DataGridViewCellEventArgs e)
        {
            try
            {
                //Get image data from gridview column.
                byte[] imageData = (byte[])dataGridView2.Rows[e.RowIndex].Cells["Photo"].Value;

                //Initialize image variable
                Image newImage;
                //Read image data into a memory stream
                using (MemoryStream ms = new MemoryStream(imageData, 0, imageData.Length))
                {
                    ms.Write(imageData, 0, imageData.Length);

                    //Set image variable value using memory stream.
                    newImage = Image.FromStream(ms, true);
                }

                //set picture
                pictureBox10.Image = newImage;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }


PM MAIL   Вверх
akizelokro
Дата 2.5.2008, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: нет
Всего: 5



я бы сделал немножко по-другому.

1.Companies

id - biging (autoinc) primary key
CompanyName

2.Items

id - biging (autoinc) primary key
ItemNumber nvarchar(50) - еще нужно будет создать уникальный индекс
Company_Id (ссылка на id из Companies)
InsertDate - smalldatetime
Remarks - nvarchar(max)

3.Photos
id - biging (autoinc) primary key
Items_Id (ссылка на id из Items)
Photo - OLE объект или BLOB, если ты хочешь помещать фотки в базу
Thumbnail -OLE объект или BLOB, если ты хочешь помещать фотки в базу

Комментарии.
У меня привычка ставить первичные ключи целочисленными и autoincrement (99%). Я, возможно неправильно, считаю, что такой подход по крайней мере не замедляет производительность БД. Поэтому (только из-за своих привычек) я изменил вариант thomas'а c таблицей Items.
Я выбросил из Photos поле Link, потому что я не знаю его назначение. Если это ссылка, то его можно добавить в Items
Я добавил в таблицу Photos поле Thumbnail, потому что это логично и просто принято. Тебе просто нужно будет при добавлении фото сформировать на лету его thumbnail не больше заданного размера, которые ты потом и будешь выводить в датагриде.
Я добавил таблицу Companies. Это всем должно быть понятно зачем.



Это сообщение отредактировал(а) akizelokro - 2.5.2008, 13:04


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
shark1
Дата 2.5.2008, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 274
Регистрация: 10.11.2007

Репутация: нет
Всего: нет



Спасибо.Базу я переделал.Link это путь к фото на диске(прога работает с видео и по линку забирает фото в базу).
Теперь попорядку.Вот например рабочий код :
Код

void GetImagesFromDatabase()
        {

            try
            {
                conn = new OleDbConnection();
                
                conn.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\Data\\storage_DB.mdb";
                
                //Initialize adapter.
                command = new OleDbCommand();
                command.Connection = conn;
                adapter = new OleDbDataAdapter(command);
                adapter = new OleDbDataAdapter("Select * from tbl_ItemsNumber", conn);                

                //Initialize Dataset.
                ds = new DataSet();
                dataTable = ds.Tables.Add("ItemsNumber");

                //Fill dataset with ImagesStore table.
                adapter.Fill(ds, "ItemsNumber");
               

                //Fill Grid with dataset.
                dataGridView1.DataSource = ds.Tables["ItemsNumber"];              


                this.txt_ItemNumber.DataBindings.Add("Text", dataTable, "ItemNumber", true, DataSourceUpdateMode.OnPropertyChanged);
                this.txt_CompanyName.DataBindings.Add("Text", dataTable, "CompanyName", true, DataSourceUpdateMode.OnPropertyChanged);
                this.txt_InsertDate.DataBindings.Add("Text", dataTable, "InsertDate", true, DataSourceUpdateMode.OnPropertyChanged);
                this.rtb_Remarks.DataBindings.Add("Text", dataTable, "Remarks", true, DataSourceUpdateMode.OnPropertyChanged);
                this.pictureBox1.DataBindings.Add("Image", dataTable, "Photo", true, DataSourceUpdateMode.OnPropertyChanged);
                

                foreach (DataGridViewColumn column in dataGridView1.Columns) column.SortMode = DataGridViewColumnSortMode.NotSortable;

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }
private void dataGridView1_CellEnter(object sender, DataGridViewCellEventArgs e)
        {
            try
            {
                //Get image data from gridview column.
                byte[] imageData = (byte[])dataGridView1.Rows[e.RowIndex].Cells["Photo"].Value;

                //Initialize image variable
                Image newImage;
                //Read image data into a memory stream
                using (MemoryStream ms = new MemoryStream(imageData, 0, imageData.Length))
                {
                    ms.Write(imageData, 0, imageData.Length);

                    //Set image variable value using memory stream.
                    newImage = Image.FromStream(ms, true);
                }

                //set picture
                pictureBox1.Image = newImage;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }

,кот. уже работает но показывает в зависимости от выбранного в :
private void txt_Find_TextChanged(object sender, EventArgs e)
        {
            if (chb_Items.Checked == true)
            {
                dataTable.DefaultView.RowFilter = "ItemNumber LIKE '" + txt_Find.Text + "%'";
            }
},показывает по одному фото в pictureBox1,мне нужно без потерь(желательно и чтоб я не сильно запутался)как мне его обновить под новую задачу.Зарание спасибо.
PM MAIL   Вверх
akizelokro
Дата 2.5.2008, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: нет
Всего: 5



Я правильно понимаю, что ты не только выводишь поля в DataGridView, но и дублируешь их в дополнительных TextBox и PictureBox?


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
shark1
Дата 2.5.2008, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 274
Регистрация: 10.11.2007

Репутация: нет
Всего: нет



Да я делаю бандинг,и например как только я нахожу нужный номер,в техст боксах появляется соответствующая информация и фото появляется в picBox
PM MAIL   Вверх
akizelokro
Дата 2.5.2008, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: нет
Всего: 5



Оставь один PictureBox1, с текстбоксами ты наживешь геморой на месяц-два. их удали, а редактируй их значения в датагриде. Там куча закавык, притом не сразу видных. Например, добавление новой записи.
PictureBox1 прогружай по RowEnter (CellEnter вызывается даже когда ячейка меняется в пределах одной строки). TextChanged не обрабатывай, оно вызывается после каждого символа чтоли(проверь в дебаггере) и ты можешь гонять фильтры, еще и не успев набрать текст для поиска.

Это сообщение отредактировал(а) akizelokro - 2.5.2008, 15:11


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
stab
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, stab, mr.DUDA, Exception.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Базы данных под .NET | Следующая тема »


 




[ Время генерации скрипта: 0.0703 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.