Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Программирование в среде .NET (ASP.NET,ADO.NET) на C#/VB.NET

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162

Открыть новую тему     Написать ответ в эту тему

Solnake



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Lihonosov
Про реляционную БД слышал? Про вторичные ключи и т.д?
Если нет - советую почитать.
 
А насчет дочерних форм - точно не скажу, но сответую перед сосзданием формы пробежатся по коллекции дочерних форм и посмотреть -есть ли уже она там или нету, если нету - создавать, а если есть то делать то что надо. Думаю зделать это не сложно.

Всего записей: 826 | Зарегистр. 16-09-2004 | Отправлено: 12:10 08-01-2008 | Исправлено: Solnake, 12:12 08-01-2008
Lihonosov

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Про реляционную БД слышал? Про вторичные ключи и т.д?
Если нет - советую почитать.  

У меня в каждой таблице есть PRIMARY KEY, с котором связана какая-то другая таблица.
 
А какую книжку посоветуешь, чтобы было написано понятным языком и чтобы побольше примеров (MSSQL, но не ACCESS!!!). Сейчас читаю "Теория и практика построения баз данных. 8-е издание. Д.Крёнке, Питер, 2003".
 
Добавлено:

Цитата:
А насчет дочерних форм - точно не скажу, но сответую перед сосзданием формы пробежатся по коллекции дочерних форм и посмотреть -есть ли уже она там или нету, если нету - создавать, а если есть то делать то что надо. Думаю зделать это не сложно.
 

Ты имел ввиду, что-то такое:
{ foreach (Form childForm in MdiChildren)
            {  childForm.Show();    }
 }

Всего записей: 537 | Зарегистр. 05-07-2007 | Отправлено: 16:34 08-01-2008
eLLoco



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Lihonosov

Цитата:
в Access можно было указать типу столбца выпадающий список со значениями из другой таблицы, но в MSSQL я такого не нашел!?

Думается, что Access просто "писал" за тебя некий код, ответственный за удобный интерфейс связывания данных из некой таблицы с источником данных контрола.
Solnake

Цитата:
Про реляционную БД слышал? Про вторичные ключи и т.д?

Я думаю, что здесь вопрос немного другой - как без особых хлопот воплотить это дело в интерфейсе. Приходят мысли о создании дочернего контрола с некими свойствами DataTable и DataField. Плюс сюда же ConnectionString. Полет фантазии в общем. Кстати, совсем по-хорошему будет, если это вписывается в идеологию разрабатываемой программы, забацать некий класс FormBuilder, который создает форму по предоставленным данным (таблице / нескольким таблицам по join), сам заполняет ComboBox'ы по вторичным ключам. Чтобы не пересоздавать каждый раз - сериализация. Но это уже зависит от масштабов программы и зарплаты.

Всего записей: 217 | Зарегистр. 03-08-2007 | Отправлено: 16:46 08-01-2008
Solnake



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
eLLoco
ну такой правильный класс написать очень даже не просто. Всегда появляется задача которая может просто розрушить полностью все то что перед этим работало. Знакомо такое.
 
Ну а насчет создания комбика - так это все просто. Как я понял вместимое комбика - это некий справочник. Писаться класс для этого справочника думаю должен был. Вот в нем и пишется какой-то метод Get(int id) который возвращает DataTable или еще что-то (тут уже как кому нравитсо) по результатам соответствующего запроса с нужным значением ключа. Ну и потом этот метод или через ОбжектДатаСорс или на на открытие формы или еще на какое-то нужное событие цепляется к нужному комбику. Все очень просто.
Если не понятно, роскажу более подробно, если понятно - гуд.
 
Насчет книжек по MSSQL - хм... чесно, сам не прочитал ни одной. Работаю с этой СУБД уже 3 года, вроде более менее дружу.
Ну пока почитай то что читаеш, будет полезно, а там если че не ясно - спрашивай или тут, или чтобы не офтопить в разделе по MSSQL Server-у, что знаю - тем помогу.
 

Цитата:
Ты имел ввиду, что-то такое:
{ foreach (Form childForm in MdiChildren)
            {  childForm.Show();    }
 }

да, чтото типа этого. Просто работаю восновном под веб, такчто более конкретно не помогу, ну думаю сам розберешся.

Всего записей: 826 | Зарегистр. 16-09-2004 | Отправлено: 17:03 08-01-2008
Lihonosov

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Как я понял вместимое комбика - это некий справочник

У меня это значения размеров: м, кг, мл, гр...

Цитата:
Писаться класс для этого справочника думаю должен был. Вот в нем и пишется какой-то метод Get(int id) который возвращает DataTable или еще что-то (тут уже как кому нравитсо) по результатам соответствующего запроса с нужным значением ключа. Ну и потом этот метод или через ОбжектДатаСорс или на на открытие формы или еще на какое-то нужное событие цепляется к нужному комбику. Все очень просто.

Отдельно класс не писал. Создал для комбика новый адаптер и датасет и связал его с ними.
В DataGridView есть возможность назначить отдельным колонкам тип комбобокс, например, для моего случая и указать ему тот датасет кот. нужен.
Может есть какой-нибудь "правильный" способ?

Всего записей: 537 | Зарегистр. 05-07-2007 | Отправлено: 17:29 08-01-2008
eLLoco



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Solnake

Цитата:
Ну а насчет создания комбика - так это все просто. Как я понял вместимое комбика - это некий справочник. Писаться класс для этого справочника думаю должен был. Вот в нем и пишется какой-то метод Get(int id) который возвращает DataTable или еще что-то (тут уже как кому нравитсо) по результатам соответствующего запроса с нужным значением ключа. Ну и потом этот метод или через ОбжектДатаСорс или на на открытие формы или еще на какое-то нужное событие цепляется к нужному комбику.

Хм, это уже конечно дело вкуса, но я имел ввиду решение, привязанное только к БД. DataTable и DataField - имя таблицы и поля в БД, указанной в ConnectionString. Так контрол становится универсальней. Впрочем, решение с классами тоже ничего, возможности пошире. Вот только лучше использовать события не формы, а собственные события контрола.
 
Lihonosov

Цитата:
А какую книжку

Можно почитать в MSDN Microsoft SQL Server 2005 Books Online.

Всего записей: 217 | Зарегистр. 03-08-2007 | Отправлено: 17:34 08-01-2008
BlackVetal



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Lihonosov
Как вариант решения твоей проблемы могу посоветовать библиотеку компонентов "ComponentOne". В библиотеке много компонентов для работы с БД и они более гибкие для настройки.
По второму вопросу про дочерные окна - можно создать какую-нить структуру (дополнительный класс к примеру), который будет хранить хэдары и состояние дочерних окон (свернутое, не свернутое и т.д.)

Всего записей: 1094 | Зарегистр. 13-11-2005 | Отправлено: 08:51 09-01-2008
Lihonosov

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
По второму вопросу про дочерные окна - можно создать какую-нить структуру (дополнительный класс к примеру), который будет хранить хэдары и состояние дочерних окон (свернутое, не свернутое и т.д.)

 
Сделал так (В обработчике меню):
 
int n=0;
foreach (Form childForm in MdiChildren)
{
      n++;
      if(childForm.Text="Заголовок нужного мне окна")
      {
           childForm.WindowState=FormWindowState.Maximized;
       }
       else
       {
             n--;
        }
}
if(n<=0)
{
      Form1 myForm=new Form1();
      myForm.MdiParent=this;
      myForm.Show();
}
 
Может где-то и встречалось, но я это придумал сам.
Вдруг кому пригодится.
 
Сейчас подумал и думаю переменную n лючше сделать типа bool.  
Т.е. n++ => n=true;
      n--   => n=false;    =>   if(n==false){ ... }

Всего записей: 537 | Зарегистр. 05-07-2007 | Отправлено: 11:56 09-01-2008 | Исправлено: Lihonosov, 12:12 09-01-2008
Solnake



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Lihonosov

Код:
 
private Form GetMyForm(Form ВашаФорма)
{
   foreach (Form f in this.MdiChildren)
   {
    if (f is ВашаФорма)
    {
        return f;
    }
  }
return null;
}
 

Дальше сам поймеш что делать?
 
Хотя можеш и так как ты зделал.

Всего записей: 826 | Зарегистр. 16-09-2004 | Отправлено: 12:19 09-01-2008
Lihonosov

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Дело в том, что у меня задача:
Если дочернее окно запущено, то его нужно развернуть, а если нет, то создать. И каждый пункт меню должен управлять своим дочерним окном, т.е. если запущено много дочерних окон, то образобчик должен отыскать и развернуть свое окно, а если не нашел, то создать, поэтому как мне кажется, этот код:

Код:
 private Form GetMyForm(Form ВашаФорма)
{
   foreach (Form f in this.MdiChildren)
   {
    if (f is ВашаФорма)
    {
        return f;
    }
  }
return null;
}  

все равно как бы я не смотрел приводит к моему.
Кстати спасибо, что раньше не дали мне этот пример. Т.к. пока придумал свой пример, то по пути узнал много нового
 
Добавлено:
Подскажите в какую сторону думать.
Где реализовывать проверку введенных пользователем значений на корректность.

Всего записей: 537 | Зарегистр. 05-07-2007 | Отправлено: 12:35 09-01-2008
Solnake



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Lihonosov
В сторону валидаторов думай.
смотря какую проверку хочеш поставить? По шаблону или еще по чемуто то валидаторы тебе в помощь, а если посложнее - то пиши свой класс проверок.

Всего записей: 826 | Зарегистр. 16-09-2004 | Отправлено: 15:50 09-01-2008
Lihonosov

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
смотря какую проверку хочеш поставить? По шаблону или еще по чемуто то валидаторы тебе в помощь

1. Чтобы пользователь не ввел большее количество символов чем нужно.
2. Если пользователь ввел буквы, а разрешено только цифры.
3. Самое непонятное для меня сейчас, как сделать, чтобы если пользователь удаляет строку, кот. является ключом для другой таблицы.
Я так понял нудно переопределить метод Validate???
 
Добавлено:
На 1. - сделал так - в текстовом поле установил MaxLendth равной максимальному числу допустимых символов.

Всего записей: 537 | Зарегистр. 05-07-2007 | Отправлено: 16:01 09-01-2008
Solnake



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

Цитата:
1. Чтобы пользователь не ввел большее количество символов чем нужно.  

Правильно зделал.

Цитата:
2. Если пользователь ввел буквы, а разрешено только цифры.  

или юзаеш компоненты например девелоперовские или еще какието где в самом компоненте указано что пользователь должон вводить. Или пишеш свой контрол, в котором делаеш такое поле. Или на событие типа онКейАп или еще чето проверяш введенный символ напримет Int.TryParse().  
Я бы юзал готовые контролы девелоперов.

Цитата:
3. Самое непонятное для меня сейчас, как сделать, чтобы если пользователь удаляет строку, кот. является ключом для другой таблицы.

Если ты поставиш там все форинкеи то пользователь эту строку не сможет удалить впринцыпе.  
Разьве что поставиш каскадное удаление.
А если ты этого не зделаеш, то я не завидую тебе потом когда проект будет работать и ты будеш искать "ну где же тут бага?"

Цитата:
Я так понял нудно переопределить метод Validate???  

Может так... Не скажу точно, потому как не юзал.
Скоро буду писать небольшой проект, то подскажу, поскольку буду сам такое делать.

Всего записей: 826 | Зарегистр. 16-09-2004 | Отправлено: 16:28 09-01-2008
Lihonosov

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Я бы юзал готовые контролы девелоперов.  

Это что-то наподобие ComponentOne?
 
Добавлено:

Цитата:
Если ты поставиш там все форинкеи то пользователь эту строку не сможет удалить впринцыпе.  

Да я сам для примера пробовал удалять - не удаляет, пишет, что-мол удалить нельзя т.к. с ней связана другая таблица... Меня интересует как вывести пользователю более понятное сообщение, например, "Еще раз так сделаешь - уволю" Чтобы он понял что произошло.

Всего записей: 537 | Зарегистр. 05-07-2007 | Отправлено: 16:57 09-01-2008
Solnake



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

Цитата:
Это что-то наподобие ComponentOne?  

угу.

Цитата:
Меня интересует как вывести пользователю более понятное сообщение

делаеш удаление в блоке

Код:
try
{
 
}
catch catch (Exception ex)
{
    Функция_Вывода_ошибки(ex.Message);
}

 
ну а можеш почитать MSDN какое исключение вызывается когда ошибка удаления изза форинкея и при таком екцепшине говорить пользователю именно  

Код:
Функция_Вывода_ошибки("Еще раз так сделаешь - уволю");


Всего записей: 826 | Зарегистр. 16-09-2004 | Отправлено: 17:25 09-01-2008
Lihonosov

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Solnake
СпасибО!!!!!

Всего записей: 537 | Зарегистр. 05-07-2007 | Отправлено: 17:28 09-01-2008
Solnake



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Кстати, вот нашол решение как именно указать что за ошибка.

Код:
 
 try
{
 
}
catch catch (Exception ex)
{
    if (Ex is SqlException && ex.Message.IndexOf("REFERENC") >= 0)
    {
        Функция_Вывода_ошибки("Еще раз так сделаешь - уволю");
    }
    else
    {
         Функция_Вывода_ошибки(ex.Message);
    }
}
 
 

Всего записей: 826 | Зарегистр. 16-09-2004 | Отправлено: 17:35 09-01-2008
Lihonosov

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Кстати, вот нашол решение как именно указать что за ошибка.
 
Код:
 
 try
{
 
}
catch catch (Exception ex)
{
    if (Ex is SqlException && ex.Message.IndexOf("REFERENC") >= 0)
    {
        Функция_Вывода_ошибки("Еще раз так сделаешь - уволю");
    }
    else
    {
         Функция_Вывода_ошибки(ex.Message);
    }
}  

Попробую.

Всего записей: 537 | Зарегистр. 05-07-2007 | Отправлено: 17:48 09-01-2008
BlackVetal



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Lihonosov
У мене только не большое добавление про удаление связанных строк в таблицах: тебе уже посоветовали почитать книги про реляционные БД - не поленись, сделай - если связь между строчками правильно настроить, то тебе будет достаточно удалить одну строчку в главной таблицы, во второстепенных удаление произойдет автоматически ...

Всего записей: 1094 | Зарегистр. 13-11-2005 | Отправлено: 06:25 10-01-2008
Solnake



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
BlackVetal
Да, каскадное удаление - это все гуд. Но. Каскадное удаление на связь со справочником делать нельзя. Такое ставить можно на связь таблиц типа документ-детализация и т.д.
А то если злоупотреблять каскадным удалением то удалив одну запись из какогото сильно заюзаного справочника можно пол-базы навернуть

Всего записей: 826 | Зарегистр. 16-09-2004 | Отправлено: 09:51 10-01-2008
Открыть новую тему     Написать ответ в эту тему

Страницы: 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 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Программирование в среде .NET (ASP.NET,ADO.NET) на C#/VB.NET


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru