+1
В среду напишу подробно с примерами варианты как это сделать, сейчас сильно занят. Там в зависимости от выбранной стратегии либо будет быстрее работать, либо код значительно проще. Я правильно понимаю — файл со справочником в вашем случае лежать будет на ТСД?..
Потому что если на сервере — то лучше работать с какой либо из баз данных.
avatar

Roman

  • 30 апреля 2012, 14:07
+1
Возможно дело просто в том что pictureBox — пустой, перед Dispose — надо в него что нибудь (изображение) положить.
avatar

Roman

  • 22 марта 2012, 21:13
0
Ошибочку бы, что выдаёт при этом?
avatar

Roman

  • 22 марта 2012, 21:11
+1
Вот например — делал маленькую графическую менюшку, для мобильного устройства из четырёх пунктов.
Процедурка прорисовывает выбранный элемент активным и предыдущий выбранный неактивным.

— В ImageList1 — изображения неактивных менюшек.
— В ImageList2 — изображения активных менюшек.

— num_prev_menu — индекс предыдущего выбранного пункта (для отмены выделения).
— num_menu — индекс текущего выбранного пункта меню (для выделения).

private void repaint_menu()
        {
            switch (num_prev_menu)
            {
                case 1:
                    pictureBox1.Image.Dispose();
                    pictureBox1.Image = imageList1.Images[0];
                    break;
                case 2:
                    pictureBox2.Image.Dispose();
                    pictureBox2.Image = imageList1.Images[1];
                    break;
                case 3:
                    pictureBox3.Image.Dispose();
                    pictureBox3.Image = imageList1.Images[2];
                    break;
                case 4:
                    pictureBox4.Image.Dispose();
                    pictureBox4.Image = imageList1.Images[3];
                    break;
            }

            switch (num_menu)
            {
                case 1:
                    pictureBox1.Image.Dispose();
                    pictureBox1.Image = imageList2.Images[0];
                    break;
                case 2:
                    pictureBox2.Image.Dispose();
                    pictureBox2.Image = imageList2.Images[1];
                    break;
                case 3:
                    pictureBox3.Image.Dispose();
                    pictureBox3.Image = imageList2.Images[2];
                    break;
                case 4:
                    pictureBox4.Image.Dispose();
                    pictureBox4.Image = imageList2.Images[3];
                    break;
            }

        }


— Если убрать Dispose — и зажать кнопку перебора менюшек — спустя непродолжительное время получим memory error.
avatar

Roman

  • 19 марта 2012, 00:25
0
«Connector/Net no longer supports server versions prior to 5»

Перевод: Connector/Net более не поддерживает сервера ниже 5-ой версии.
Ваш коннектор 6.4.4.0 не умеет работать с такими старыми версиями сервера, к которому вы обращаетесь.

Следовательно, чтобы решить данную проблему, можно:
1 — использовать более старый Connector — который поддерживает версии MySQL 4.X
2 — использовать MySQL сервер версии 5.X.
avatar

Roman

  • 12 марта 2012, 14:43
0
Установить альтернативную кодировку — буквы станут русскими, вот так:
ZipFile zf = new ZipFile();
zf.ProvisionalAlternateEncoding = Encoding.GetEncoding("cp866");
           
zf.AddDirectory(@"C:\\TEMP\\Папака по русски");//Добавляем папку
zf.Save(@"C:\\TEMP\\arhiv.zip"); //Сохраняем архив.
avatar

Roman

  • 1 марта 2012, 21:04
0
Элементарно:
comboBox.DataSource = result.ResultData.DefaultView;
comboBox.ValueMember = "ID"; //Поле со значениями
comboBox.DisplayMember = "NAME"; //Поле которое содержит отображаемые данные

//Чтобы получить выбранное значение делаем так
переменная = comboBox1.SelectedValue;
avatar

Roman

  • 26 января 2012, 19:47
0
Кстати «SAP Crystal Reports, version for Visual Studio 2010» — бесплатный. Только установится на студию не ниже Professional (на экспресс версиях работать не будет).
avatar

Roman

  • 10 января 2012, 18:15
0
Для 2010 студии нужен «SAP Crystal Reports, version for Visual Studio 2010»
Он отличается от того что идёт в комплекте с 2008 студией, и скачивается и устанавливается отдельно.
Проект автоматически из версии 2008 в 2010 наврядли — скомпилируется. Во всяком случае я делал отдельный, новый проект.
avatar

Roman

  • 10 января 2012, 18:13
0
Если нет необходимости часто динамически менять данные с разных клиентов, то на мой взгляд лучше выбрать, крутить в памяти и не грузить зря сервер большой кучей запросов.

Тут всегда всё сводится к выбору — либо загрузить клиента и расходовать на нём больше ресурсов, либо загрузить сервер и сеть.
avatar

Roman

  • 13 декабря 2011, 21:59
0
Обыкновенной рекурсией.
Похожим образом как здесь организовано удаление: http://kbss.ru/blog/fbdb/218.html
Но это пример процедуры с рекурсией для удаления (её можно позволить делать самой базе), для выборки в дерево, лучше выбирать полностью за раз всё дерево в память а потом фильтрами его быстренько отстраивать (если дерево сравнительно небольшое) если дерево ооооочень большое, то подгружать кусочками при раскрытии веток.

Вот пример рекурсивной процедуры выборки из одного моего приложения (сильно не комментирую, думаю и так понятно):
public static TreeNode nodepaint_fast(TreeNode node)
        {
	    //Фильтруем наш источник данных.
            DataView dw11 = new DataView(dw_classif.Table);
            //Выбираем все ветки чьим родителем является переданная в процедуру ветка.  
            dw11.RowFilter = "`PARENT_ID` = " + node.Tag.ToString();

			
            for (int i1 = 0; i1 < dw11.Count - 1; i1++)
            {
		//Тут получаем данные из DataView и заводим новую ветку дерева.                
                string result = dw11[i1].Row[2].ToString();
                int id_node = int.Parse(dw11[i1].Row[0].ToString());
                int pid_node = int.Parse(dw11[i1].Row[1].ToString());
                int batch = int.Parse(dw11[i1].Row[8].ToString());

                TreeNode nd = new TreeNode();
                nd.Tag = id_node; //Сюда помещаю числовй идентичикатор (код ветки).
                nd.Text = id_node.ToString() + "." + result;
		
		//Запускаем для вновь созданной ветки - поиск веток потомков (рекурсия).
                nodepaint_fast(nd);

		//Добавляем ветку со всеми потомками в родительскую ветку.
                node.Nodes.Add(nd);
            }
            return (node);

        }


А вообще это делается рекурсией.

Есть ещё всякие хитрости для того чтобы обойтись без рекурсии — но это касается высоко нагруженных проектов и делается в основном за счёт особенности структуры данных.
avatar

Roman

  • 13 декабря 2011, 00:53
0
По файлу даже не знаю, можно ли так сделать — чтобы по самому файлу определить весь он уже или нет, можно лишь определить больше он того что мы уже скачали или нет.
Но вообще в быту для всяких задач обмена данными — это делается так: источником сначала ложится файл флаг — затем загружаются файлы — когда файлы загружены флаг удаляется, клиент проверяет наличие файла флага — если есть то ничего не делает и ждёт дальше — если нет — скачивает.

Можно ещё в сам файл-флаг разную информацию помещать, для информирования клиента.
avatar

Roman

  • 7 декабря 2011, 17:18
0
Вообще класс был написан изначально в качестве примера написания класса. Сам по себе подобного рода класс я создаю как прослойку с которой в итоге программа работает, правда добавляю в него постраничную выборку результатов и другие удобности, чтобы не реализовывать их по 10 раз в коде.

В примере показана только выборка, вообще можно делать и вставку, изменение, и удаление позиций, для этого есть метод:
MySqlLib.MySqlData.MySqlExecute.SqlNoneQuery

Вот, пример того как заставить его работать:
MySqlLib.MySqlData.MySqlExecute.MyResult result = new MySqlLib.MySqlData.MySqlExecute.MyResult();

            result = MySqlLib.MySqlData.MySqlExecute.SqlNoneQuery("insert into table (field1, field2) values ('value1','value2')", "Database=inventar_alleya;Data Source=localhost;User Id=root;Password=240580");
            
            if (result.HasError == false)
            {
                MessageBox.Show("Запрос успешно выполнен!");
            }
            else
            {
                MessageBox.Show(result.ErrorText);
            }


Ещё есть метод при помощи которого можно запускать запросы возвращающие один параметр (значение). Например выборку количества записей или максимального значения поля.
MySqlLib.MySqlData.MySqlExecute.SqlScalar

Вот пример:
MySqlLib.MySqlData.MySqlExecute.MyResult result = new MySqlLib.MySqlData.MySqlExecute.MyResult();

            result = MySqlLib.MySqlData.MySqlExecute.SqlScalar("select count(*) from table1", "Database=inventar_alleya;Data Source=localhost;User Id=root;Password=240580");

            if (result.HasError == false)
            {
                MessageBox.Show("Количество строк в таблице: "+result.ResultText);
            }
            else
            {
                MessageBox.Show(result.ErrorText);
            }
avatar

Roman

  • 16 октября 2011, 21:42
0
У TextBox-а на событие TextChanged повесить например вот это:
private void textBox1_TextChanged(object sender, EventArgs e)
        {
            if (textBox1.Text.Length > 0)
            {
                textBox1.Text = textBox1.Text[0].ToString().ToUpper()+textBox1.Text.Substring(1,textBox1.Text.Length-1);
                textBox1.SelectionStart = textBox1.Text.Length;
                textBox1.SelectionLength = 0;
            }
        }
И всё.
avatar

Roman

  • 12 августа 2011, 20:18
+1
Ну если просто надо один найденный файл любой, то берем допустим последний, для этого меняем строчку в функции поиска с:
result = result + file.FullName + "\n";
На:
result = file.FullName;


Затем присваиваем строке, так:
string file = search_file("путь с которого ищем", "файл который ищем").Replace("\\","\\\\");


P.S. А вообще, из твоего описания, совершенно не понятно что конкретно не работает. «Для того чтобы получить правильный ответ, необходимо сначала задать правильный вопрос.»
avatar

Roman

  • 12 августа 2011, 09:58
0
Я так понимаю проблема в том, чтобы найти файл, или файлы.

Файл можно найти перебором по всему вложенному содержимому, начиная с указанной папки, вот так:
private string search_file(string begin_path, string file_name)
        {
            string result= "";
            DirectoryInfo dir_inf = new DirectoryInfo(begin_path);
            
            //Перебираем все вложенные папки -- РЕКУРСИЯ!!!
            foreach (DirectoryInfo dir in dir_inf.GetDirectories())
            {
                result += search_file(dir.FullName, file_name);
            }

            //Переюираем файлы в папке - ищем совпадение по file_name
            foreach (FileInfo file in dir_inf.GetFiles())
            {
                if (file.Name == file_name)
                {
                    result = result + file.FullName + "\n";
                }
            }

            return result;
        }

Функция на входе получает путь до начальной папки, и имя файла который ищем, возвращает в строке полные пути до всех найденных файлов.

Для работы функции необходимо включить System.IO

Вот как это выглядит в примере:


Вот сам пример с исходником: SearchFileExample.rar

Если надо совершить поиск по всем дискам то можно перебрать и диски сделав примерно так:
string[] drives = System.Environment.GetLogicalDrives();

            foreach (string drive in drives)
            {
                System.IO.DriveInfo dev_inf = new System.IO.DriveInfo(drive);

                if (!dev_inf.IsReady) //Пропускаем диск если не читается. 
                {
                    Console.WriteLine("The drive {0} could not be read", dev_inf.Name);
                    continue;
                }
                else //В противном случае узнаём корневую папку и ищем файл.
                {
                    result += search_file(dev_inf.RootDirectory, textBox1.Text);
                }
            }
avatar

Roman

  • 11 августа 2011, 17:34
+1
Когда говорят похожи синтаксисом, я так понимаю имеют ввиду похожесть синтаксиса основных основных операторов: for, while, if… else. и т.п.
Было бы странно если бы на PHP работу с FTP было бы сложнее реализовать, это очень близко к основной области его применения.
avatar

Roman

  • 28 июля 2011, 21:57
0
Возможно…
У меня по какой то причине каталог не менялся. Работало.
Тем не менее, про RestoreDirecory — стоит взять на заметку. Спасибо.
avatar

Roman

  • 27 июля 2011, 17:10
0
Абсолютно не важно откуда будет взято изображение, хоть из базы данных.
Просто помещаешь его в источнике данных в таблице в поле с типом «System.Byte[]» как массив Byte[] и передаешь источник данных в отчёт.
avatar

Roman

  • 27 июля 2011, 15:52
+1
Кнопка взять картинку — просто позволяет выбрать изображение, которое добавляется в источник данных а сам источник данных сохраняется в dataset.xml

Кнопка показать отчёт — просто берёт источник данных из xml-ки и выводит сам отчёт.

Создавать xml — файл не обязательно можно просто создавать источник данных (DataSet), подключать его напрямую к отчёту и выводить.

В xml-ку я кидаю для наглядности и для удобства настройки отчётной формы. Там в проекте есть папка ReportFile — вот в ней проект с отчётом в нём мы просто настраиваем форму отчёта, всё что из него потом забираем это сам *.rpt файл.

Проще говоря, можно туда сюда myDS не сохранять и не загружать — а просто напрямую использовать в отчёте, после создания.

Вместо вот этого в коде первой кнопки:
//Записываем источник данных в XML
myDS.WriteXml(@".\dataset.xml",XmlWriteMode.WriteSchema);


Написать вот это:
ReportDocument myReport = new ReportDocument();
//Загружаем форму отчёта
myReport.Load(@".\CrystalReport1.rpt");

//Указываем отчёту откуда брать данные.
myReport.SetDataSource(myDS);
//Создаём форму на которой лежит crystalReportViewer!
Form2 frm = new Form2();
//Указываем отчёт для CrystalReportViewer
frm.crystalReportViewer1.ReportSource = myReport;
//Открываем форму.
frm.Show();
avatar

Roman

  • 27 июля 2011, 13:41