![]() |
Модераторы: gambit |
![]() ![]() ![]() |
|
Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: нет Всего: 11 |
Они хоть чего нибудь сделали в этой либе!? Значения по умолчанию нельзя. Где спрашивать подтверждение удаления -- тоже непонятно. Предусмотрено в DataGridView, но это неподходящее место, так как я могу удалять не только там, но и из навигатора какого-нибудь...
|
|||
|
||||
Экскалупатор |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1746 Регистрация: 1.4.2009 Где: г. Минск Репутация: 3 Всего: 24 |
Dims, я вот читаю твои темы и удивляюсь. откуда у тебя такая логика? контрол должен только отображать пользователю результаты, при этом всю работу с базой надо реализовывать(самому или при помощи мастера настройки, но самому). если тебе надо спрашивать что то у пользователя то реализуй соответствующую логику(в обработчике кнопок к примеру), базе в принципе все равно, как и контролу.
|
|||
|
||||
Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: нет Всего: 11 |
По-твоему, если я могу удалить запись в нескольких различных местах (с помощью кнопки, в гриде, с помощью клавиатурной комбинации), то я должен в каждом из этих мест спрашивать подтверждения? По-твоему, это нормально? Если есть ОДНО действие -- удаление записи -- то почему не предусмотреть ОДНО место, где об этом спрашивать?
Вот например, существует же ОДНО событие FormClosing. И неважно, как ты закроешь форму -- крестиком, кнопкой, Alt-F4 или двухкратным кликом на иконке -- всё равно это событие вызовется и там можно будет спросить подтверждения. А с удалением записи будет куча мест. Причём даже нельзя будет написать одну функцию и отовсюду её вызывать. Потому что метод обработки подтверждения везде разный: при обработке UserDeletingRow в гриде надо поставить e.Cancel=true, а при обработке кнопки навигатора нужно будет эту кнопку перевести в режим none, а потом самому, если надо, отдать команду удаления! То есть, в библиотеке у нас имеется куча разношёрстных деталей, кое-как подходящих друг к другу. Такое впечатление, что сборщики советских жигулей всем скопом переключились на производство библиотек Windows! |
|||
|
||||
Экскалупатор |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1746 Регистрация: 1.4.2009 Где: г. Минск Репутация: 3 Всего: 24 |
Dims, почему куча мест? ты не путай контролы и процесс который они запускают. для примера. у тебя есть база, надо базой есть к примеру надстройка которая выполняет к базе запросы. и это одно место через которое происходит общение с базой. там и спрашивай.
ты не путай оргинизацию своей программы с оргинизацией библиотеки(кстати, о какой конкретно библиотеке идет речь?). библиотека тебе предоставляет возможность что то сделать, а как ты будешь это делать ее волновать не должно. это как будто тебе дали шариковую ручку, она должна писать а будешь ты ей писать или в ухе ковыряться производителю все равно, он об этом заботиться не должен. и о том будешь ли ты писать завещание или требования от имени террористов ручку и производителя ручки это не волнует, это ты так все организовал и решил так использовать... и контролы тоже самое, их задача отобразить, по сути грид даже не знает будешь ты из него что то удалять или нет, ему все равно, он не знает откуда он данные получил и куда они денутся, и что именно он отображает он тоже не знает. это принцип ООП. отделять все и вся. контрол не должен отвечать за логику, продумать логику это твоя задача. вот и продумывай. а если ты не можешь продумать все грамотно то кури паттерны и учебники по объектно-ориентированному мышлению... Добавлено через 2 минуты и 23 секунды это потому что форма одна и код выполняется каждый раз один и тот же, а не потому что все знают как закрывать форму. сделай работу с базой по такому же принципу и будет тебе счастье... |
|||
|
||||
-Mikle- |
|
|||
![]() Невидимка Vingrad'а ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1672 Регистрация: 22.6.2003 Где: Казахстан, Астана Репутация: 1 Всего: 59 |
Dims, вот тебе задача: есть одна форма, которая отображает данные из таблицы Тееу1 в режиме ридонли. Есть еще одна форма, которая отображает данные из той же таблицы (не важно по какой причине требуется две такие формы). Вопрос, где разместить код запроса одних и тех же данных из одной и той же таблицы так, чтобы можно было легко поддерживать код?
-------------------- Если тебе плюют в спину, значит ты впереди... |
|||
|
||||
Dims |
|
||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: нет Всего: 11 |
Ну так посоветуй.
Рассмотрим простейщий пример. В базе ОДНА таблица.
Ничего ведь сложного, банальность, правда? Я делаю на форме DataGridView и BindingNavigator, всё подсоединяю -- и сразу не работает. Почему? Потому что не понимает значения по умолчанию для поля Added. Ладно, хрен с ним, делаем вручную. Приходится делать это сразу в двух местах:
Обрати внимание, какой кретинский код! Лучше я не смог придумать! Может, ты подскажешь? Смотри, как через задницу определяется местоположение поля, которому требуется значение по умолчанию: сперва происходит обращение к объекту колонки, который был создан мастером, определяется его индекс, а потом по этому индексу ищется поле среди клеток. Я не нашёл способа адресовать колонку по имени НИГДЕ. Подскажи, плиз, если знаешь. Теперь второй метод. Он делает то же самое, но совершенно через другую задницу. Записать это в виде одной функции не представляется возможным. Обрати внимание, что если у DataGridView происходит вмешательство в существующий процесс, то у BindingNavigator-а совершенно другая идеология: у него штатную функцию приходится отключать в визуальном дизайнере и полностью выполнять операцию самостоятельно. Такое впечатление, что автор одного элемента управления не имел никакого представления о другом или даже ненавидел его. Соответственно, автор второго элемента отвечал ему взаимностью. Далее по подтверждению. Допустим, я хочу, чтобы при удалении записи спрашивалось подтверждение.
Здесь каждый метод сам по себе не особо плох. Но они ведь совершенно разные! Даже ответ в первом случае сравнивается на "Нет", а во втором -- на "Да". И снова во втором случае ещё надо в визуальном дизайнере отключать функцию. Кстати, нафига тогда нужен этот BindingNavigator, если я у него всё равно все функции вынужден отключать и он превращается просто в кучу кнопок, которые я могу нарисовать и без него? Вот подскажи мне, как пример выше можно сделать по-нормальному. Это сообщение отредактировал(а) Dims - 17.2.2011, 22:29 |
||||||
|
|||||||
Экскалупатор |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1746 Регистрация: 1.4.2009 Где: г. Минск Репутация: 3 Всего: 24 |
а почему не сделать все руками? как большинство нормальных людей? и не загоняться о всякой ерунде? или это не кошерно?
а зачем ты его используешь если ты все в нем отключаешь? не используй его. ты же не используешь сокеты в этой программе? нет, потому что они тебе не нужны, а зачем это тогда? |
|||
|
||||
Dims |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: нет Всего: 11 |
Я не знаю. В настоящее время у меня впечатление, что лучше вообще не пользоваться микрософтовскими полоумными наработками для работы с СУБД, а найти какую-нибудь стороннюю либу или написать свою. Чтобы всё было осмысленно. Но если уж надо, то, думаю, что нужно где-то вручную создать статический BindingSource и вручную же прописать его всем гридам. Добавлено через 5 минут и 53 секунды Ну так ты, как профессионал, подтверждаешь, что это всё ерунда? а как его вообще можно использовать? где ты видел удаление записей без подтверждения? но именно это делает кнопка "удалить" навигатора. кто его сваял? зачем? для кого?
Сокеты принципиально отличаются от навигатора тем, что они МОГУТ быть нужны. А навигатор -- это порождение полоумного программиста, которое не может быть нужно никогда. Так же как, видимо, весь остальной мусор с датасетами, биндерами, адаптерами и прочей шелухой. Просто я-то не знал, что вот эта вся гора -- это гора мусора. А ты сразу не сказал, мол, что это ошибка, юзать этот фреймворк. |
||||
|
|||||
Экскалупатор |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1746 Регистрация: 1.4.2009 Где: г. Минск Репутация: 3 Всего: 24 |
угу, а еще можно написать свой язык и не парится о том что этот такой "кривой"!!!
а лучше взять учебник и почитать, про язык, про программирование под WinForms, про ADO.NET, про привязку данных, etc. а потом на верх про паттерны и ООП в принципе и тогда все будет отлично сходится и не будут появляться такое негодование и подобные вопросы. Добавлено через 3 минуты и 54 секунды при чем тут фреймворк? повторюсь у тебя все упирается в организацию тобой твоего кода. для примера SQL запрос начинающийся со слова DELETE тоже удаляет записи, и при этом ничего не спрашивает навигатор это все навсего контрол, работать с базой можно одновременно в совершенно разных местах программы, и навигатор при этом ничего про это знать не должен и не будет, но он от этого не становится бесполезным. контрол просто дает набор кнопок, при чем тут все остальное? Добавлено через 9 минут и 15 секунд кстати, а про DataSet ты читал? ну хотя бы ради интереса? он может существенно помочь во всех этих вопросах, если конечно с ним разобраться как следует... |
|||
|
||||
Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: нет Всего: 11 |
Естественно, если никто не подскажет, я во всём сам разберусь...
"Свой язык" -- это постоянно преследующая меня мысль ![]() |
|||
|
||||
Экскалупатор |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1746 Регистрация: 1.4.2009 Где: г. Минск Репутация: 3 Всего: 24 |
так что подсказать? ответ на сабж был дан в первых постах. остальное это отступления... делай по нормальному и будет тебе счастье.
Добавлено через 7 минут и 32 секунды попробую объяснить. обычно контролы не работают напрямую с базой. т.е. обычно пишут код работающий с базой, потом бизнес логику, а потом отображение(собственно формы, контролы и пр.). у тебя все в куче, отсюда вопросы и не логичность поведения(с твоей точки зрения). я не видел что бы датагрид работал на прямую с базой. это не удобно(как в твоей ситуации). обычно есть источник датасет или дататейбл, к которому привязывают грид, строки из грида на прямую не удаляются, а помечаются в источнике(дататейбле) как модифицированные, потом применяют изменения. зачем спрашивать о том что можно изменить? спрашивать имеет смысл когда начинают применять изменения, а это делается в одном месте. но ты написал много мест и у тебя не сходятся концы с концами, сделай рефакторинг. |
|||
|
||||
Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: нет Всего: 11 |
Ещё раз. Ты почему-то стесняешься напрямую назвать штатные средства Visual Studio "ненормальными". Так ты назови, мне будет понятнее. Я же ничего не изобретаю, а делаю ровно то, что мне говорит Студия. Смотри. Я хочу написать программу с базой. Имею право? Имею. Делаю "создать базу". Никакой крамолы. Дальше она САМА создаёт датасет, САМА мне говорит, что база ПОКА пуста. Мол, ты иди, сперва создай в базе объекты, а потом ПЕРЕТАСКИВАЙ их на датасет. Это не я придумал! Я сделал базу и перетащил. В чём проблема? Далее. DataGridView. Ты почитай, что про неё пишут -- крутой контрол, который супер-пупер кастомизируем, позволяет работать с миллионами записей и так далее. Просто положи на форму и укажи датасорс. Ну я так и делаю. Она при этом САМА создаёт биндингсорс и через него подключается к соответствующием дататейблу. На так что, это всё ненормально? Я так думаю, ты нифига не прочёл моих вопросов, раз пишешь, что у меня датагрид "напрямую работает с базой". Или, может, ты никогда не создавал в проекте XSD файлы и тебе просто непонятно, о чём у меня речь? У меня вполне конкретные вопросы по этим объектам. А философствовать про разделение концернов я и сам могу. Это сообщение отредактировал(а) Dims - 17.2.2011, 23:38 |
|||
|
||||
Экскалупатор |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1746 Регистрация: 1.4.2009 Где: г. Минск Репутация: 3 Всего: 24 |
я не стесняюсь, я считаю их вполне нормальными. зачем делать в навигаторе функцию которой мало кто будет пользоваться? из твоего же примера ты можешь удалить комбинацией кнопок с клавиатуры, а можешь нажатием кнопки в навигаторе, тогда почему в навигатор надо вставлять запрос на подтверждение удаления? это не логично. потому что потом ты бы спрашивал почему при нажатии комбинации кнопок не срабатывает навигатор(или наоборот срабатывает). логично поместить проверку в код который собственно выполняет удаление, и он должен находится в одном месте. и никаких проблем.
Добавлено через 48 секунд а необходимость проверки это должно быть твое решение, а не навигатора. |
|||
|
||||
Dims |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: нет Всего: 11 |
А я разве говорил, что его надо вставлять в навигатор? Это ответ от эксперта на микрософтовском форуме. Вот ссылка http://social.msdn.microsoft.com/Forums/en...5-9bf15016857f/ Человек спросил, как перехватить удаление -- ему ответили. Если бы можно было перехватить в лучшем месте, наверное, ответили бы про него. А раз ответили так, значит это единственный способ. Я не понял, ты знаешь лучше что ли? Так что же не говоришь?
Я с тобой полностью согласен. Вот и покажи мне на примере выше, куда его можно поместить. Для примера предположи, что у нас есть ОДНОВРЕМЕННО и навигатор и грид. Это вопрос этой темы и нифига он так и не отвечен. Поройся в на микрософтовском форуме. Когда спрашивают про грид, там отвечают, что надо перехватывать UserDeletingRow, а когда про навигатор -- то выключать кнопку и писать свой код. Никакого ОДНОГО МЕСТА, о котором ты толкуешь, и которое, я с тобой полностью согласен, ДОЛЖНО быть, НЕТ. Если знаешь -- скажи. Пример выше есть, он очень простой. |
||||
|
|||||
Экскалупатор |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1746 Регистрация: 1.4.2009 Где: г. Минск Репутация: 3 Всего: 24 |
честно сказать никогда не любил пользоваться встроенными штуками, кода получается много, выполняется дольше короче проблем больше, но ради данной темы сделал приложение, для теста так сказать. сделал форму, поместил на форму грид и навигатор, привязал все это к базе(ни одной строчки кода не написал, все мышкой в течении трех минут). дальше есть два события:
и вот что я обнаружил. в моем примере ВСЕГДА сначала обрабатывается событие dataGridView1_RowsRemoved, а потом уже событие нажатия на кнопку(если таковое было вообще). а значит если я помещу код проверки в событие dataGridView1_RowsRemoved то это и будет одно место которое обрабатывает в любом случае(потому что строка из грида удаляется в обоих случаях!). или у тебя как то по другому? |
|||
|
||||
![]() ![]() ![]() |
Прежде чем создать тему, посмотрите сюда: | |
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, stab, mr.DUDA, Exception. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Базы данных под .NET | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |