powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Какие-то не понятки с формами в .Net
10 сообщений из 10, страница 1 из 1
Какие-то не понятки с формами в .Net
    #38792415
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Исполняющая среда отключена, программа стартует с main().

Код: vbnet
1.
2.
3.
4.
5.
6.
Module Module1
  Sub main()
    Application.EnableVisualStyles()
    Application.Run(New Form1)
  End Sub
End Module


Из Form1 вызываем Form2 предварительно заполнив текстом изначально пустой TextBox1 на Form1
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
Public Class Form1

  Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Me.TextBox1.Text = "Have some text in textbox"
    Form2.ShowDialog(Me)
  End Sub
End Class



А из запущенной Form2 пытаемся прочесть этот TextBox1 на Form1
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Public Class Form2

  Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    MsgBox(Form1.TextBox1.Text)
   End Sub

  Private Sub Form2_FormClosed(sender As Object, e As FormClosedEventArgs) Handles Me.FormClosed
    Me.Dispose()
  End Sub
End Class



И выводит гад пустую строку, т.е. по слову Form1 нельзя обратиться к другой форме.

Спасает вот так:
Код: vbnet
1.
2.
3.
  Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    MsgBox(CType(Owner, Form1).TextBox1.Text)
  End Sub



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

Кстати, если не вырубать Framework, то прокатывает как я привык в VB6. Но мне нужна Main.
"Массивы" форм я не использую, а вот обращаюсь из одной к другой часто.
Чтож мне теперь всякий раз CType(Owner, Form1) лепить везде? А если я не модально Form2 запускаю?

Причем хотелось бы обращаться к Form1 именно по "имени класса" Form1 , а по FormХЗ as New Form1.
...
Рейтинг: 0 / 0
Какие-то не понятки с формами в .Net
    #38792420
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если только вот так:

Код: 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.
28.
29.
Module Module1

  Public Form1 As cForm1

  Sub main()
    Application.EnableVisualStyles()
    Form1 = New cForm1
    Application.Run(Form1)
  End Sub
End Module

Public Class cForm1

  Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Me.TextBox1.Text = "Have some text in textbox"
    Form2.ShowDialog(Me)
  End Sub
End Class

Public Class Form2

  Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    MsgBox(Form1.TextBox1.Text)
  End Sub

  Private Sub Form2_FormClosed(sender As Object, e As FormClosedEventArgs) Handles Me.FormClosed
    Me.Dispose()
  End Sub
End Class



Тогда "привычный интерфейс" прокатывает.
Разумный вариант?
====
По хорошему конечно и с остальными формами надо делать Form_n->New cForm_n

Потому что вторая конструкция кот. я постоянно пользуюсь это что-то типа
Form2.Text="My caption"
Form2.label1="Some custom label text"
Form2.ShowDialog(Me)

Но в принципе и без cForm2 должно прокатить при условии что Form2 всегда вызывается модально в одном экземпляре.
Плюс я всегда делаю ей Me.Dispose() при закрытии.
...
Рейтинг: 0 / 0
Какие-то не понятки с формами в .Net
    #38792465
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Чтож мне теперь всякий раз CType(Owner, Form1) лепить везде? А если я не модально Form2 запускаю?
1. Создайте у своей Form2 перегрузку конструктора с передачей туда экземпляра Form1, сохраните экземпляр в поле/свойстве класса, и обращайтесь к нему.
2. Если все дочерние формы вызываются из Form1 - в базовом классе дочерних форм создайте свойство, кастующее овнера к Form1.
Дмитрий77Причем хотелось бы обращаться к Form1 именно по "имени класса" Form1 , а по FormХЗ as New Form1.
Всё-таки правду говорят, что VB прививает плохой стиль программирования. Возможно, даже худший, чем дельфи.
Обращение к классу по его имени в ООП подразумевает обращение к статическим методам класса. Вносить сюда путаницу, вводя вызовы к экземпляру, имеющему одинаковое (вплоть до регистра) имя с классом - очень плохо.
...
Рейтинг: 0 / 0
Какие-то не понятки с формами в .Net
    #38792482
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныОбращение к классу по его имени в ООП подразумевает... Вносить сюда путаницу, вводя вызовы к экземпляру, имеющему одинаковое (вплоть до регистра) имя с классом - очень плохо.
Путаница мне не нужна. Причем если не отработать "простой пример" и продолжить на авось, то потом вообще что-то понимать перестану (получив очередные неожиданные результаты но имея уже кучу кода), это я как раз хорошо понимаю.

Короче переписал свой пример так:

Код: 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.
28.
29.
30.
31.
Module Module1

  Public Form1 As frmForm1

  Sub main()
    Application.EnableVisualStyles()
    Form1 = New frmForm1
    Application.Run(Form1)
  End Sub
End Module

Public Class frmForm1

  Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Me.TextBox1.Text = "Have some text in textbox"
    Dim Form2 As New frmForm2
    Form2.Text = "My caption"
    Form2.ShowDialog(Me)
  End Sub
End Class

Public Class frmForm2

  Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    MsgBox(Form1.TextBox1.Text)
  End Sub

  Private Sub Form2_FormClosed(sender As Object, e As FormClosedEventArgs) Handles Me.FormClosed
    Me.Dispose()
  End Sub
End Class


По крайней мере здесь вряд ли можно придраться, т.к. обращаюсь точно к явным экземплярам.
Или фигня?

Сон Веры Павловны1. Создайте у своей Form2 перегрузку конструктора с передачей туда экземпляра Form1, сохраните экземпляр в поле/свойстве класса, и обращайтесь к нему.
2. Если все дочерние формы вызываются из Form1 - в базовом классе дочерних форм создайте свойство, кастующее овнера к Form1.
Если б ты мне это кодами пояснил. Умных слов много.
Слишком много умностей тоже честно не люблю, у меня на них башка плохо варит.
...
Рейтинг: 0 / 0
Какие-то не понятки с формами в .Net
    #38792501
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Если б ты мне это кодами пояснил. Умных слов много.
Слишком много умностей тоже честно не люблю, у меня на них башка плохо варит.
На VB никогда не писал, поэтому код сишарповый:
вариант 1:
Код: c#
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.
public partial class Form1 : Form
{
  public Form1()
  {
    InitializeComponent();
    textBox1.Text = "123456";
  }

  public string TextBoxText
  {
    get { return textBox1.Text; }
  }

  private void Button1Click(object sender, System.EventArgs e)
  {
    new Form2(this).ShowDialog();
  }
}

public partial class Form2 : Form
{
  readonly Form1 _parent;
  public Form2(Form1 parent)
  {
    InitializeComponent();
    _parent = parent;
  }

  private void Button1Click(object sender, EventArgs e)
  {
    MessageBox.Show(_parent.TextBoxText);
  }
}



Свойство TextBoxText нужно потому, что у textBox1 модификатор видимости по умолчанию - private. Можно в дизайнере его изменить на public/internal, тогда свойство будет не нужно, и в Form2 можно будет напрямую обращаться к textBox1 через экземпляр _parent (хотя второе не рекомендуется).

Вариант 2:
Код: c#
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.
public class ChildFormBase : Form
{
  protected Form1 Form1
  {
    get { return (Form1) Owner; }
  }
}

public partial class Form2 : ChildFormBase
{
  public Form2()
  {
    InitializeComponent();
  }

  private void Button1Click(object sender, EventArgs e)
  {
    MessageBox.Show(Form1.TextBoxText);
  }
}

public partial class Form1 : Form
{
  public Form1()
  {
    InitializeComponent();
    textBox1.Text = "123456";
  }

  public string TextBoxText
  {
    get { return textBox1.Text; }
  }

  private void Button1Click(object sender, System.EventArgs e)
  {
    new Form2().ShowDialog(this);
  }
}
...
Рейтинг: 0 / 0
Какие-то не понятки с формами в .Net
    #38792558
Фотография mmnick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны, почитайте про класс BindingSource, и работайте с моделями. Кто что биндит указывайте в конструкторе формы.
...
Рейтинг: 0 / 0
Какие-то не понятки с формами в .Net
    #38792603
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mmnick,

почитайте вопрос темы. Если непонятно - он про передачу ссылки на экземпляр вызывающей формы, а вовсе не про биндинги.
...
Рейтинг: 0 / 0
Какие-то не понятки с формами в .Net
    #38792615
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны,

mmnick, как мне показалось, говорит о том - что это не самая хорошая идея из одной формы ковыряться в потрохах другой:
Дмитрий77А из запущенной Form2 пытаемся прочесть этот TextBox1 на Form1
отсюда и предложение использовать общую модель, а отображение - через Binding
...
Рейтинг: 0 / 0
Какие-то не понятки с формами в .Net
    #38792617
Фотография mmnick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил, совершенно верно
...
Рейтинг: 0 / 0
Какие-то не понятки с формами в .Net
    #38793138
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны,

как-то все-таки заумно.
Код: c#
1.
  public string TextBoxText


это для каждого контрола навороты прописывать

Есть например ListView на Form1, его содержание правится из Form2
Естественно нужен прозрачный доступ из Form1 к Form2 (чтоб вытащить информацию из Form1 при заполнении Form2)
И прозрачный доступ из Form2 к Form1, чтоб сохранить измененную информацию в Form1.
У меня этих Listview на Form1 10 штук например и отдельная Form2/Form3 (отдельный класc по терминологии ) под каждый ListView.
Ну это я просто упрощенно пытаюсь объяснить.
Плюс еще например какое-то поведение при заполнении Form2 (т.е. когда она уже загружена) может зависеть от каких-то чекбоксов/полей на Form1, т.е. надо прозрачно обращаться к любым элементам Form1 из Form2 (и read и write).


Мой крайний вариант нормальный?
16780516
К нему претензии есть?
Потому что он мне дает прозрачную модель взаимодействия к которой я привык.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Какие-то не понятки с формами в .Net
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]