AJV King Ответов: 2

Вызов окна формы из окна пользовательских элементов управления


Я, чтобы открыть окно формы, из UserControl.. это возможно любыми способами... я пробовал, но он не перечисляет мне ни одной из форм...!

напр.:
1) я создал userControl1
2) у меня есть windowForm1
3) Теперь я должен открыть windowForm1 из события keydown текстового поля userControl1.

Как я могу это сделать? ..

Пожалуйста, помогите...!

BillWoodruff

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

имхо, это хороший пример преждевременных ответов на вопрос, который нуждается в разъяснении.

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

Почему вы используете какое-то событие KeyDown в текстовом поле на UserControl в форме для создания новой формы ? Это очень странный дизайн, и это помогло бы узнать ваши точные причины для этого (потому что это требование домашнего задания ? потому что это абсолютно необходимо по характеру вашего проекта ... ?).

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

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

Конечно же, вы не имеете в виду, что намерены создать новую форму на любом KeyDown любого ключа ? В этом случае: представьте, что ваше приложение запущено, и пользователь набирает "whoops a daisy:" вы действительно хотите создать 14 новых форм :)

Понимаете ли вы, что новая форма(ы), которую вы создаете каким-то пользовательским действием в UserControl, будет иметь свое родительское свойство "null:", что означает, что они будут полностью независимы как от UserControl, так и от формы, на которой расположен UserControl : если только:

Как и в большинстве реальных приложений, Ваша новая форма будет нуждаться в обмене данными или взаимодействии либо с UserControl, либо с основной формой, либо с обоими. Затем вам нужно будет сохранить ссылку на любую форму или формы, которые вы создаете в UserControl, в тот момент, когда вы их создаете. У вас есть какая-нибудь стратегия на этот счет ? Именно здесь нам нужно знать, какова цель формы, созданной в UserControl, и как она используется.

Можно догадаться, что вы имеете в виду здесь, что вам нужно распознать какое-то конкретное нажатие клавиши, возможно, в сочетании с клавишами-модификаторами (alt, shift, control), и только затем создать и показать новую форму в ответ на эту конкретную комбинацию клавиш.

2 Ответов

Рейтинг:
8

Sergey Alexandrovich Kryukov

Нет такого глагола, как "открыть" форму. Вы просто создаете его с помощью конструктора, а затем показываете с помощью конструктора. System.Windows.Forms.Form.Show, http://msdn.microsoft.com/en-us/library/system.windows.forms.form.aspx[^], http://msdn.microsoft.com/en-us/library/system.windows.forms.control.show.aspx[^].

Чтобы использовать свой пользовательский элемент управления в какой-то другой форме, вам нужно добавить в свой пользовательский элемент управления и выставить какое-то событие, например "TextBoxKeyDown", потому что выставление ссылки на само текстовое поле было бы плохой практикой; и жесткое кодирование обработчика событий вашего события текстового поля KeyDown внутренне в коде пользователя управление было бы еще хуже. Если вы обрабатываете событие вне пользовательского элемента управления, вы делаете это в каком-то другом контексте, где у вас уже может быть экземпляр формы для отображения или где вы можете его создать.

Для лучшего понимания, пожалуйста, прочтите об этом слабая связь: http://en.wikipedia.org/wiki/Loose_coupling[^].

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

—СА


Ed Nutting

Хорошие комментарии и ссылки, мои 5+ :)

Sergey Alexandrovich Kryukov

- Спасибо, Эдвард.
--СА

BillWoodruff

Моя причина для голосования этот ответ #1:

0. ненужный педантизм и отступление: пользователю на самом деле не нужна лекция о том, почему они не должны использовать слово "открыть": вы даже найдете этот термин в некоторых .Объем книги, изданные МС пресс.

1. неопределенно: "просто создайте его с помощью конструктора:" не неопределенно: вы создаете новый экземпляр объекта Windows Form с помощью 'New, который является стандартным конструктором для объектов.

2. расплывчато: "использовать свой контроль пользователя на какой-либо другой форме, вам нужно добавить в ваш пользовательский элемент управления:" не расплывчато: "чтобы добавить экземпляр пользовательского элемента управления в форму, можно добавить его во время разработки из набора (в котором он будет выглядеть после компиляции), или добавить его во время выполнения путем создания экземпляра с помощью новой и затем вызвать метод Add форм controlcollection с передавая экземпляр пользовательского элемента управления в качестве параметра в метод Add.

3. предположение вне темы: OP ясно заявляет, что он хочет создать новую форму в ответ на KeyDown в UserControl: вы идете по касательной здесь, которая игнорирует вопрос.

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

Кстати, я согласен с вами, что в целом идея сочетания клавиш в текстовом поле в качестве триггера для создания формы-это плохой дизайн, если только здесь нет какой-то исключительной причины. Но это всего лишь предположение.

Sergey Alexandrovich Kryukov

Что с тобой случилось, Билл?

Я не знаю, если я действительно нужно, чтобы ответить... Ну, давай я попробую:

0. Вы говорите это так, как будто это что - то плохое. :-)

1. не расплывчато, потому что абсолютно неважно, какой конструктор использовать; любой конструктор экземпляра, предоставляющий экземпляр, возвращает экземпляр; это все, что имеет значение; кроме того, "использование нового, который является стандартным конструктором для объектов" - это тарабарщина: "новый" это не конструктор, и не существует такого понятия как стандартный конструктор- Я снова спрашиваю: Что с тобой случилось, Билл? Я думал, что вы немного разбираетесь в программировании; послушайте, мой совет: не выставляйте свой позор, удалите его, и я с удовольствием удалю свой комментарий.

2. Вы просто не поняли этого. Я объяснил, какое событие должно быть добавлено в класс пользовательского элемента управления, и вы говорите о добавлении члена пользовательского элемента управления в форму; я предположил, что OP знает, зачем создавать пользовательский элемент управления; одна из его целей-иметь возможность быть добавленным дизайнером;

3. позвольте мне определиться с объемом моего ответа; иногда я рассказываю целый анекдот на эту тему; я оказываю некоторую помощь вопрошающему, не отвечая на точный вопрос, потому что я думаю, что это гораздо более ценно.

С "слабой связью" вы просто пропустили точку, потому что вы пропустили точку в своем пункте № 2. Есть два варианта: 1) обработать щелчок с открытием некоторого окна в обработчике событий TextBox.KeyDown; 2) создать некоторое событие пользовательского элемента управления и вызвать это событие (после проверки на null) из обработчика событий TextBox.KeyDown. Случай №1-это слишком плотная связь, делающая контроль менее универсальным и расширяющая сферу его доступа; случай № 2-это свободная связь, делающая обработку события более гибкой.

Может быть, я был недостаточно ясен, но в этом комментарии я объяснил больше.

Наилучшие пожелания,
--СА

BillWoodruff

Привет Сак, л

Позвольте мне заметить, что я никогда не использовал слово "плохой" в своих комментариях к вам. Мои критические замечания носят весьма специфический характер. И вопрос о том, что это "неопределенный вопрос", имеет гораздо больший "вес" в моем сознании, чем что-либо еще.

Если бы я хотел вынести какое-то "краткое суждение" о вашем решении (чего я не сделал), я бы использовал такие формулировки, как: "не достойно вашего интеллекта и способностей, как это довольно часто демонстрируется на QA." :)

Не стесняйтесь "насаживать" меня здесь, на "ошибки сайта и предложения", если хотите:

http://www.codeproject.com/Messages/4162340/Perfect-example-of-the-QA-problem-I-now-call-Vague.aspx

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

лучше всего, Билл

Sergey Alexandrovich Kryukov

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

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

Мое отношение к вашему посту не является исключением. Я просто указал на то, что мне кажется вашими ошибками, и уточнил свой ответ, который может быть недостаточно ясным. Если бы мой ответ был неясным, я бы с готовностью согласился, но я не могу согласиться с неопределенностью (которая является очень разным понятием), и я думаю, что объяснил это.

I think I understand your concerns about the QA problem and I share some of them and try to appeal to other experts to take my opinion into consideration. I've just read your comments to the question. However, the approach should be balanced; and there is nothing wrong if it depends on personality. In case of laziness and impudent behavior a litter harder treatment is quite appropriate, but the little vagueness in the question sometimes is not a reason for turning the question down. I would like to explain my view on that. Answering the question is not a main criteria. The answer should be interesting enough to some of the readers, or hopefully useful. The answer should help, not just answer. Helping is more important. A very formal answer to a pointless question can be useful, too, not as the answer to the question, just as a demonstration of the effect of inaccurate answer.

Например:
-- Простите, вы не знаете, который сейчас час?
-- Да, знаю. [конец диалога] :-)

Есть ли в этом хоть какой-то смысл? Конечно.

Цель его - увеличить общее количество добра и уменьшить общее количество зла в мире. :-)

Спасибо за ссылку на ваш пост, который, безусловно, является респектабельным.
--СА

Manfred Rudolf Bihy

Хотя я согласен с Биллом по поводу педантичности словосочетания "открыть форму ", которое очень часто встречается в обиходе, я полностью согласен с остальной частью вашего заявления. Таким образом, мои 5!

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

с уважением.

Манфред

Sergey Alexandrovich Kryukov

Большое вам спасибо, Манфред-за Ваш голос, но особенно за ваши комментарии, хотя я и не совсем согласен.
Видите ли, я полностью согласен с вами, когда вы утверждаете, что люди разных культур, у которых есть какие-то проблемы с английским языком, не связаны с их небрежным или ленивым отношением. Не знаю, заметили ли вы, как я старался помочь таким людям. (В конце концов, у меня самого есть некоторые проблемы с английским языком; уезжая в США, я хотел бы знать его намного, намного лучше, что облегчило бы мою повседневную жизнь.)

I only disagree with your note on this particular case. Why would you talk of my pedantry as of something bad? Why do you think it shows any negative suggestion against OP? I think this sentence is nothing but help, and pretty important piece of it. You see, this is not even related to the particular language, but more to a concept. The open/close form terminology can be translated in any language and express a pretty common misconception. (I knew other such cases, I wish I could remember some of them now.) The term "close" suggests the presence of "open", and this can mislead anyone. One can open and close the file or a stream, but not a form or a window. All APIs contain the word "Close", but never the "Open" (a windows or a form). A novice sees "Close" and tries to find a "counterpart" named "Open"; and the absense of "Open" is counter-intuitive. That's why the phrase "there is no such verb" is a valid hint: "don't waste time searching for it -- there is no such concept".

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

Итак, теперь у вас есть лучшее понимание?

Спасибо еще раз,
--СА

Manfred Rudolf Bihy

Все, что я говорил СА, это то, что "открыть форму" - это обычное и правильное использование английского значения, конечно, переведенного на язык программиста, что нам нужно создать экземпляр и показать его. Поэтому, пожалуйста, не поймите меня неправильно, когда я говорю, что, будучи семантически правильным, вы действительно упускаете цель, будучи педантичным в отношении того, что вы считаете правильной формулировкой. Хотя я согласен с тем, что некоторые вербальные образы должны быть остановлены (неуместное использование отношений между родителями и детьми), нет необходимости распространять это на общие и понятные языковые паттерны, такие как "открытие" формы.
В качестве побочного замечания я должен упомянуть, что использование естественного языка в контексте программистов всегда склонно оставлять нам неоднозначные интерпретации, которые обычно легко разрешаются в данном контексте. хотя.

Лучший,

Манфред

Sergey Alexandrovich Kryukov

Да, я вас слышу. Возможно, моя попытка создать смешение и метафорическое выражение со словом "глагол" не смогла сделать его метафорическое значение достаточно ясным, возможно, из-за моего недостаточного чувства английского языка. Я все еще считаю, что моя находка этой "лингвистической" несогласованности полезна, но если вы не поняли ее так, как я хотел выразить, я могу поверить, что моя попытка не была особенно успешной. Интересно, что я начал думать с гораздо более длинного предложения, но в конце концов решил, что короткое предложение с "глаголом" будет более выразительным.
Кстати, ваша последняя "побочная нота" только поощряет некоторую дополнительную педантичность, как маленький инструмент для уменьшения двусмысленности. :-)
--СА

Рейтинг:
13

Ed Nutting

Для вашего примера используйте (примерно) следующее :

//Check what the exact arguments for this method should be but you get the idea
void OnKeyDown(object sender, EventArgs e)
{
    //Create an instance of your form to open
    windowForm1 TheForm = new windowForm1();
    //Now show it
    TheForm.Show(); //(alternatively TheForm.ShowDialog(); depending on your desired result
    //Your form should now be showing
}


Это все, что вам нужно сделать, чтобы открыть новую форму из любого события. Однако будьте очень осторожны - этот код вызовет огромное количество открытых окон, если пользователь просто удерживает нажатой клавишу enter, скажем... Я бы предположил, что лучший код был бы:

//Create an instance of your form to open - outside the event so that it can be reused.
windowForm1 TheForm = new windowForm1();
//Store whether the form has already been shown
bool TheForm_Shown = false;
//Check what the exact arguments for this method should be but you get the idea
void OnKeyDown(object sender, EventArgs e)
{
    //Check to see if the form is already open or not
    if(TheForm_Shown)
    {
        TheForm.Close();
    }
    //Set the check to true as the form is now showing - set it before so that even if showing the form fails there isn't suddenly a mass of errors! 
    TheForm_Shown = true;
    //Now show it
    TheForm.Show(); //(alternatively TheForm.ShowDialog(); depending on your desired result
    //Your form should now be showing
}


Надеюсь, это поможет,
Эд


Sergey Alexandrovich Kryukov

Конечно, 5.
--СА

BillWoodruff

Причина моего голосования № 2:

0. см. мои комментарии к SAK выше о том, почему давать какой-либо ответ на этот вопрос без разъяснений со стороны OP, вероятно, бесполезно.

1. +1, потому что, по крайней мере, вы показываете пользователю какой-то код.

2. когда вы "закрываете форму во втором примере, если она уже" показана: вы уничтожаете ее: вам придется воссоздать ее с помощью "новой", чтобы показать ее снова.

Ваш код аварийно завершит работу во второй раз, когда пользователь нажмет клавишу, потому что форма будет нулевой.

Вы можете исправить это, используя "скрыть на форме", а не "закрыть", но это все равно плохой дизайн.

Ed Nutting

Извините за то, что я пропустил "новую" строку - я хотел вставить ее. Я всегда находил, что закрытие и воссоздание формы лучше - это гарантирует, что форма будет сброшена независимо от того, в какое состояние пользователь мог ее ввести (даже если теоретически и после тестирования в ней не было ничего плохого).

BillWoodruff

На самом деле ваш код будет работать, если вы просто измените его с помощью метода "закрыть" на "скрыть". Если я вижу код, который, как я знаю, потерпит крах, я просто не могу не комментировать его: но я замечаю, насколько легче для меня видеть вещи, которые потерпят крах в коде других людей, чем мой собственный :)

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

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

Но мое главное внимание здесь заключается в том, чтобы указать, что в данном случае наше отсутствие информации из ОП действительно ограничивает то, насколько эффективный ответ мы можем дать.

Вот почему я использую этот вопрос и его ответы в качестве примера здесь:

http://www.codeproject.com/Messages/4162340/Perfect-example-of-the-QA-problem-I-now-call-Vague.aspx

Из того, что я и многие другие люди на CP воспринимают как одну из структурных проблем с QA, как это происходит сейчас.

Когда у вас есть некоторые из самых блестящих людей на CP, таких как Пит О'Хэнлон, отказывающиеся больше участвовать в QA из-за того, что я называю синдромом "неопределенного вопроса, за которым следует преждевременный или отвлекающий ответ": ну, "Хьюстон, у нас есть проблема."

Пожалуйста, смотрите форум ошибок и предложений сайта для многих дискуссий, которые мы имели по этому поводу и другим вопросам. Вы можете быть уверены, что Крис Маундер и сотрудники CP определенно знают о проблемах в области контроля качества и делают все возможное, чтобы планировать их улучшение в будущем.

лучше всего, Билл

Sergey Alexandrovich Kryukov

Билл, я тоже прокомментировал это замечание. В частности, обнаружена одна ошибка в вашей заметке, пожалуйста, смотрите ниже.
--СА

Sergey Alexandrovich Kryukov

Я должен не согласиться с тем, что воссоздание формы лучше, по крайней мере, не всегда.
Как правило, сброс не полезен, но необходимо как раз обратное: полностью сохраненное состояние формы. Наиболее полезный шаблон переопределяется OnFormClosing, чтобы перехватить попытку закрыть форму и скрыть ее саму.

Я не знаю, что Билл считает плохим дизайном, но лучший дизайн-это использование только одной формы. Это просто выходит за рамки.

I totally disagree with Bill about answering the question without clarification, as you can see in my comment to my answer. His note that the form will by null is just his mistake -- yet another. The form is created in first place and you never assign null to it. So, this is Bill's fantasy. It happens. But you will have another problem. When a form is closed, it is disposed, so you cannot show it again (just try to test the code and you will see). Sad but true -- you will have to create it again, but you don't do it. It is strange that in your comment you mention re-creation, but don't do it in code. I suggest you fix it, just to justify my vote of 5 (which I'm not going to change; not looking at your code thoroughly was my fault, too).

Что касается догадок и отрицания Биллом этого-я совершенно не согласен с Биллом. Конечно, ваша идея многократно показывать и закрывать форму странна, но я могу рассматривать ее как иллюстрацию того, насколько плохо неограниченное создание форм снова и снова. Вам не нужно ждать разъяснений: идея ОП достаточно странная, поэтому вы не могли задержать дыхание. Это не может быть более прояснено. У вас другое дело-изложить некоторые факты и проиллюстрировать их, чтобы показать, что происходит. Вы сделали это по-своему, в этом нет ничего плохого.

--СА

BillWoodruff

Сак, что сегодня не так с твоим мозгом ?

"но лучший дизайн-это использование только одной формы" что вы думаете: я и другие люди постоянно создаем несколько приложений форм.

Сак писал: "его замечание о том, что форма будет нулевой, - это просто его ошибка"

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

Вам нужно сделать перерыв и восстановить свое внимание.