|
Form2 неправильно заполняется данными кодом из Form1
|
|||
---|---|---|---|
#18+
Т.е. есть Form2, на ней элементы(много) скажем ComboBox1, ComboBox2 Элементам Form2 изначально заданы какие-то значения в конструкторе ComboBox1.text="test1" ComboBox2.text="test2" Я вызываю Form2 из Form1 и пытаюсь заполнить значения элементов на Form2: Грубо Код: vbnet 1. 2. 3. 4. 5. 6.
Так вот, у меня может в ComboBox2 оказаться дефолтное "test2" вместо "test2_new" Т.е. какие-то элементы на Form2 заполняются как хочу, а какие-то этим кодом не хотят. Подозреваю что "test2" в frm2.InitializeComponent может установиться позже чем я задаю "test2_new" И от чего зависит - не понимаю. В VB6 такой фигни не было. Элементов много, код большой, на тест-примере не воспроизведешь. Как вариант могу конечно заполнение делать в Load в Form2, а не из Form1 до Form2.ShowDialog, но это гимор. Т.е. мне нужна такая последовательность: 1) Form2 проинициализировалась дефолтом 2) Я заполнил Form2 из Form1 3) Я показал Form2 модально А у меня похоже конкурентная борьба из 2-х потоков "кто кого". ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2014, 21:00 |
|
Form2 неправильно заполняется данными кодом из Form1
|
|||
---|---|---|---|
#18+
Дмитрий77, освойте биндин или бандинг (как удобней называть), и насаживайте контролы на модель, то что вы делаете - это тонны запутанного говнокода с непрозрачным результатом, так уж давно никто не пишет. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2014, 21:33 |
|
Form2 неправильно заполняется данными кодом из Form1
|
|||
---|---|---|---|
#18+
Где-то в степи, причем здесь ваш бандинг. У меня конкретная задача -на полдня даже если и "гавнокодом" и гораздо быстрее если найдется кто-то кто по делу подскажет а вы мне предлагаете какие-то "технологии" изучать. Я конкретный вопрос задал. И видимых путей так понимаю 2: 1) понятный: заполнять элементы Form2 из кода frm2_Load (чтоб она уже была "проинициализирована" дефолтом на этот момент) 2) дурной: не задавать ComboBox2.text в конструкторе (правда дефолты придется задавать тогда отдельным кодом) А надо мне по сути: Код: vbnet 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2014, 21:54 |
|
Form2 неправильно заполняется данными кодом из Form1
|
|||
---|---|---|---|
#18+
Ну, поменял вот так. Вроде все встало на свои места. 1) понятный: заполнять элементы Form2 из кода frm2_Load (чтоб она уже была "проинициализирована" дефолтом на этот момент) Хватает все-таки в .Net дебилизма. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2014, 22:49 |
|
Form2 неправильно заполняется данными кодом из Form1
|
|||
---|---|---|---|
#18+
Дмитрий77, скорее что то у тебя не так ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2014, 00:22 |
|
Form2 неправильно заполняется данными кодом из Form1
|
|||
---|---|---|---|
#18+
Дмитрий, 1 Вот строка из вашего кода Form2.ShowDialog(Me) Это строка обозначает что вы "передаете" доступ к форме 1 / форму Написав этот код вы можете использовать все свойства формы 1, ее объеты на форме 2. 2 Поэтому необходимость вот в этом как выразились выше говнокоде отпадает Form2.ComboBox1.text="test1_new" Form2.ComboBox2.text="test2_new 3 Что нужно чтобы иметь доступ к форме 1 на форме 2 Необходимо дописать Dim frm1 as form = me.Owner (Писал на память мог где то ошибиться) Надеюсь это поможет. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2014, 00:34 |
|
Form2 неправильно заполняется данными кодом из Form1
|
|||
---|---|---|---|
#18+
Артем GЧто нужно чтобы иметь доступ к форме 1 на форме 2 Необходимо дописать Dim frm1 as form = me.Owner (Писал на память мог где то ошибиться) Нет, нет - этого не надо. Form1 в данном случае конкретный экземпляр а не класс. 16780516 С обращением к Form1 из Form2 проблем нет, я так пока и сделал. Непонятно почему я не могу "без глюков" и с гарантией заполнить Form2 из Form1 до строчки Form2.ShowDialog(Me) (после естественно тоже не могу, т.к. это модальный вызов) То бишь по какой-то причине Form2.ComboBox1.text="test1_new" Form2.ComboBox2.text="test2_new" могут запросто перезаписаться значениями из конструктора, т.е. из функции frm2.InitializeComponent По логике первое обращение Dim Form2 As New frm2 должно ее "инициализировать" дефолтом, а оно по ходу туда может полезть и перезаписать дефолт test1 поверх test1_new. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2014, 00:56 |
|
Form2 неправильно заполняется данными кодом из Form1
|
|||
---|---|---|---|
#18+
Дмитрий77А у меня похоже конкурентная борьба из 2-х потоков "кто кого".А вот с этого места поподробнее. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2014, 08:22 |
|
Form2 неправильно заполняется данными кодом из Form1
|
|||
---|---|---|---|
#18+
skyANA, Не цепляйся к словам. Там происходит примерно следующее. Код: vbnet 1. 2. 3. 4. 5. 6.
'для frm2 Код: vbnet 1. 2.
Больше свойство text нигде не устанавливается - я проверял Я нарочно добавил в ComboBox2_textchanged Debug.Print (ComboBox2.text) Распечатывает test2 test2_new (и все - к чему претензий нет) а потом выводит форму со значением "test2" А вот это уже мистика. Сделал предположение что ComboBox2 себя каким-то волшебным образом перерисовывает (за .Net такая фигня замечена)... Дернул .handle чтобы это понять: Код: vbnet 1. 2.
Так он сволочь после этого "дерганья" стал выводить "test2_new" (как я хотел) Еще могу сказать, что я в коде играюсь с Enabled true/false для этого Combo, но что-то сомневаюсь что это как-то может влиять. Хорошо б конечно воспроизвести на тесте, но это придется попотеть и надо ли. В принципе если запрашивать данные из Form2_Load как сам предположил а потом и выше советовали то все четко. Но согласись, напрягает когда делаешь все логически правильно, а результат по мистическим причинам не соответствует ожиданию. У меня нет идей где у меня что не так. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2014, 14:33 |
|
Form2 неправильно заполняется данными кодом из Form1
|
|||
---|---|---|---|
#18+
Дмитрий77, а я и не цепляюсь. Судя по всему Вы в своем коде чего-то нахимичили. Вот и хотелось понять, что. Почему свойство text пишете с маленькой буквы? Зачем Вы вообще его задаете ComboBox-у? Посмотрите декомпайлером, что происходит в тех свойствах, с которыми играетесь. Чудес не бывает. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2014, 14:47 |
|
Form2 неправильно заполняется данными кодом из Form1
|
|||
---|---|---|---|
#18+
skyANAПочему свойство text пишете с маленькой буквы? VB.Net же вроде регистронезависим. А на CLR Compliant автору с такими задачами похоже дофени. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2014, 15:04 |
|
Form2 неправильно заполняется данными кодом из Form1
|
|||
---|---|---|---|
#18+
Дмитрий77, Только ли в ComboBox'ах возникают проблемы? Какой DropDownStyle у ComboBox'ов? Каким образом вы заполняете данные в ComboBox'ах? Через DataSource? Через Items.Add? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2014, 15:10 |
|
Form2 неправильно заполняется данными кодом из Form1
|
|||
---|---|---|---|
#18+
У Combo стиль DropDown. Т.е. можем выбирать из списка, либо задавать .Text не из списка (любой). Короче ловите воспроизведение бага: Код: vbnet 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.
Я поигрался, существенно следующее. 1) Дефолтное Me.ComboBox1.Text ="test1" должно присутствовать в списке "test1", "test2", "test3", "test4", "test5" 2) Задаваемое frm2.ComboBox1.Text = "test1_new" должно отсутствовать в списке. Если например я устанавливаю frm2.ComboBox1.Text = "test2" (есть в списке), то сработает. Если например изначально задан Me.ComboBox1.Text = "test2_new" (не из списка) и я устанавливаю frm2.ComboBox1.Text = "test1_new" (опять же не из списка) то сработает. А вот если установлено из списка, а я задаю не из списка, то не сработает. Ничего незаконного я не делаю. Это баг, а не я нахимичил. Проверяйте. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2014, 21:20 |
|
Form2 неправильно заполняется данными кодом из Form1
|
|||
---|---|---|---|
#18+
Дмитрий77, какая та ахинея :) ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2014, 23:22 |
|
Form2 неправильно заполняется данными кодом из Form1
|
|||
---|---|---|---|
#18+
ViPRos, Конечно ахинея. О чем и речь. Кинь на Form2 комбобокс. Задай ему Text="test1" а в Items в столбик напиши test1 test2 test3 test4 test5 И вызови этот код кнопкой на Form1: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8.
И он отобразит "test1", а не "test1_new". У меня VB.Net VS2013 EE на Win8.1 Net 4.5 если это играет роль и вдруг не получится. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2014, 23:35 |
|
Form2 неправильно заполняется данными кодом из Form1
|
|||
---|---|---|---|
#18+
Дмитрий77, зачем тебе задавать то чего нет? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2014, 23:45 |
|
Form2 неправильно заполняется данными кодом из Form1
|
|||
---|---|---|---|
#18+
жаль мне тебя уже какой день мучаешься Setting the Text property to null or an empty string ("") sets the SelectedIndex to -1.Setting the Text property to a value that is in the Items collection sets the SelectedIndex to the index of that item.Setting the Text property to a value that is not in the collection leaves the SelectedIndex unchanged. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2014, 23:48 |
|
Form2 неправильно заполняется данными кодом из Form1
|
|||
---|---|---|---|
#18+
ViPRosжаль мне тебя уже какой день мучаешься. Да не мучаюсь я. Я поплевался на эту кривость и давно решил эту проблему так: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Это вы пожелали продолжить дискуссию. ViPRosSetting the Text property to a value that is not in the collection leaves the SelectedIndex unchanged. А причем тут "leaves the SelectedIndex unchanged"? Нигде не сказано что я не имею права "Setting the Text property to a value that is not in the collection" Но так или иначе в первом (закомментированном) варианте это не работает. В моем случае пользователь имеет право выбрать из списка ряд стандартных значений, а имеет право ввести ручками нестандартное. >зачем тебе задавать то чего нет? Что значит нет? Есть если пользователь так решил. Но не обязательно в списке. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2014, 00:12 |
|
Form2 неправильно заполняется данными кодом из Form1
|
|||
---|---|---|---|
#18+
Дмитрий77, а зачем вы распечатали ComboBox ( сделали его публичным)? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2014, 00:57 |
|
Form2 неправильно заполняется данными кодом из Form1
|
|||
---|---|---|---|
#18+
забыл совсем что в комбо можно и текст ввести :) ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2014, 01:14 |
|
Form2 неправильно заполняется данными кодом из Form1
|
|||
---|---|---|---|
#18+
Где-то в степиДмитрий77, а зачем вы распечатали ComboBox ( сделали его публичным)? Ничего я с ним не делал. Вы про вот это? Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8.
Если я создал экземпляр формы Dim frm2 As New Form2 то никто мне не запрещает тут же задать свойства контролов на этой форме (и вот именно тут а не задним числом в Form2_Load). Мне таки думается что я прав и это тот случай когда необходим WorkAround. Что меня сильно огорчает, то что подобные WorkAround-ы в .Net надо делать слишком часто, что сильно снижает мой оптимизм при переписывании большого проекта (VB6+много API) на (.Net + мало API). Но вроде уже решился, делаю. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2014, 01:44 |
|
Form2 неправильно заполняется данными кодом из Form1
|
|||
---|---|---|---|
#18+
Дмитрий77, Вам конечно никто не запрещает, но ComboBox не публичный по дефолту, и таким должен остаться в концепции ООП следующий меседж конечно можно вам не читать, ( вы отказались понять концепцию связывания), но так как пост читает много людей, имхо одно из решений проблемы. инжектируем в форму объект модель через конструктор, и делаем привязку контролов к его свойствам стек вызова Код: c# 1. 2. 3. 4. 5. 6. 7. 8.
стек приема Код: c# 1. 2. 3. 4. 5. 6. 7.
и все... В модели можно при желании разместить хоть что ( бизнес операции, валидацию, ....) и форма чистая, не размазано г... по всем уровням.. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2014, 02:21 |
|
Form2 неправильно заполняется данными кодом из Form1
|
|||
---|---|---|---|
#18+
Где-то в степи, я вашу идею понял хотя как вы это выше обозвали "биндин или бандинг (как удобней называть), " вообще если честно пришлось гадать что имелось ввиду (лучше б сразу на английском обозначили). Но во первых то что вы предлагаете - это дополнительное звено (передающие параметры из Form1 в Form2). А во вторых мне этот метод "здесь и сейчас" не подходит. Просто у меня то что отображается на Form1 очень запутано и редактируется в Form2 сильно нелинейным образом, т.е. это не три столбца Фамилия-Имя-Должность. Если интересно, то в данном случае форма настройки правила VOIP маршрутизации с кучей ньюансов (с чего начинается номер, сколько цифр, сколько отнять, какой префикс добавить, куда звонить на SIP, на H.323, на GK или на IP-адрес, через какую SIP-регистрацию, через какой прокси, через TCP или через UDP и куча опций типа какие кодеки и т.п.). Линейно через простое прявязывание это отобразить/отредактировать нереально. Несколько таб-вкладок, куча контролов, при этом от выбора в одном из них зависит поведение других. И честно говоря, продумывать всю эту модель по новой у меня нет ни желания ни времени, и в данном случае мне тупо передрать свой же VB6 код (пусть и с элементами г. как вы выражаетесь моего уровня 7 лет тому назад) с поправками на .Net -синтаксис много проще и быстрее чем параллельно пытаться высасывать что-то принципиально новое, оригинальное и каноничное. Работает-не трогай. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2014, 04:20 |
|
Form2 неправильно заполняется данными кодом из Form1
|
|||
---|---|---|---|
#18+
Дмитрий77И честно говоря, продумывать всю эту модель по новой у меня нет ни желания ни времени, зря, с этого начинать нужно, а уж потом натягивать на это формы Дмитрий77Линейно через простое прявязывание это отобразить/отредактировать нереально. что значит нереально? модель может быть достаточно сложной, на изменение значений свойств модели можно подписать обработчики, возможно изменяющие другие свойства, а главное - понятия не имеющие о каких-то формах, закладках, комбобоксах ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2014, 09:20 |
|
Form2 неправильно заполняется данными кодом из Form1
|
|||
---|---|---|---|
#18+
Дмитрий77Если интересно, то в данном случае форма настройки правила VOIP маршрутизации с кучей ньюансов (с чего начинается номер, сколько цифр, сколько отнять, какой префикс добавить, куда звонить на SIP, на H.323, на GK или на IP-адрес, через какую SIP-регистрацию, через какой прокси, через TCP или через UDP и куча опций типа какие кодеки и т.п.). Линейно через простое прявязывание это отобразить/отредактировать нереально. Несколько таб-вкладок, куча контролов, при этом от выбора в одном из них зависит поведение других. Вам народ по русски сказал - Вы идете по граблям к обрыву. Я хз как там в VB6 но в .NET с таким подходом трудозатраты растут по экспоненте с ростом сложности проекта. 3-5 формочек таким макаром можно сделать, если больше - получается борода, которую хрен распутаешь. Где-то в степи посоветовал Вам далеко не самый модный способ построения архитектуры в винформах, но так скажем это дефолтный способ в винформах и самый практичный. И механизм биндингов в частности предназначен для решения подобных проблем: Дмитрий77...при этом от выбора в одном из них зависит поведение других. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2014, 10:25 |
|
|
start [/forum/topic.php?fid=20&msg=38826968&tid=1402148]: |
0ms |
get settings: |
12ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
42ms |
get topic data: |
14ms |
get forum data: |
2ms |
get page messages: |
71ms |
get tp. blocked users: |
2ms |
others: | 345ms |
total: | 506ms |
0 / 0 |