none
Формы vb.net RRS feed

  • Вопрос

  • Доброго времени суток, не мог точно определиться с названием темы, за что искренне каюсь. Такой сабж. Есть главное окно, являющееся контейнером mdi. В нем создаются экземпляры формы прототипа (Dim dochernyayaforma as new Form2 к примеру) после она переименовывается, для обеспечения возможности создания еще экземпляров формы прототипа. Ув. знатоки, внимание вопрос:

    Как в коде изменить свойства формы\значения переменных\свойства эл. управления если имя экземпляров изменяется по одному и тому же правилу "dochernyayaforma" & i, где i счетчик?

    У меня был похожий вопрос по эл. управления. там все решалось через Controls("something" & i).width or etc.

    Есть ли подобное решение для форм?

    14 апреля 2011 г. 16:27

Ответы

  • Создавая новую форму запихните ее в Dictionary<string, Form>. В последствии к каждому екземпляру формы можно будет обратиться вашим способом.

    // запись
    myDictionary.Add("something" & i, myForm);
    
    // обращение
    myDictionary("something" & i).Width = 10;
    
     Не уверен в точности синтаксиса, так как получился смешаный C# + VB :).


    Don't forget to mark the correct answer Blog
    • Помечено в качестве ответа serjsmolin 16 апреля 2011 г. 9:17
    14 апреля 2011 г. 19:20
  • Да так, только вместо Form1 нужно передавать экзмемляр, т.е dochernyayaforma:

    myDictionary.Add("something" & i, dochernyayaforma);


    Для связи [mail]
    • Помечено в качестве ответа serjsmolin 16 апреля 2011 г. 9:17
    15 апреля 2011 г. 22:02
  • Вы можете к ней обратиться через форму, которая уже в дикшинари. Надо только сделать ее паблик.

     

    Вот для формы, чтобы запихнуть, если имя выставлено раньше:

     

    dochernyayaforma.name="something" & i

     

    myDictionary.Add("something" & i, dochernyayaforma); - то же самое что и myDictionary.Add(dochernyayaforma.namedochernyayaforma); 

    В Формс дизайнере укажите модификатор доступа для своей метки как паблик.

    Потом сможете к нему достураться как к свойству Width.

    И не забудьте отметитить ответы, что вам помогли.


    Don't forget to mark the correct answer Blog
    • Помечено в качестве ответа serjsmolin 16 апреля 2011 г. 9:18
    16 апреля 2011 г. 7:27
  • System.Windows.Forms.Form - родительский класс для вашей конкретной формы. Вам нужно привести тип формы к конкретному типу.

    В VB для этого есть динамик каст, но опять таки, как точно выглядить синтаксически будет - не скажу.

    В С#:

    ((MyChildForm)myDictionary("something" & i)).Label1.Text = "something"

    Где MyChildForm - конкретный тип формы к которой Вы обращаетесь.

    Если все формы одного типа - вы можете создать поменять дикшинари чтобы он не был  Dictionary<string, Form>, а был типа Dictionary<string, MyChildForm>


    Don't forget to mark the correct answer Blog
    • Помечено в качестве ответа serjsmolin 16 апреля 2011 г. 19:45
    16 апреля 2011 г. 18:26

Все ответы

  • Создавая новую форму запихните ее в Dictionary<string, Form>. В последствии к каждому екземпляру формы можно будет обратиться вашим способом.

    // запись
    myDictionary.Add("something" & i, myForm);
    
    // обращение
    myDictionary("something" & i).Width = 10;
    
     Не уверен в точности синтаксиса, так как получился смешаный C# + VB :).


    Don't forget to mark the correct answer Blog
    • Помечено в качестве ответа serjsmolin 16 апреля 2011 г. 9:17
    14 апреля 2011 г. 19:20
  • Ругается на myForm, мол не объявлен, что должно быть на месте ее?
    15 апреля 2011 г. 2:36
  • Дочерняя форма, т.е. вам предлагают хранить словарь ИмяФормы-СсылкаНаФорму. И потом уже можно будет перебрать этот словарь или обратиться к нужной форме по ключу.


    Для связи [mail]
    15 апреля 2011 г. 7:36
  • Сталкивался с похожей проблемой, ответ нашел где-то на форумах (где не помню, но автору спасибо):

    В коде MDI формы:

    Public Class MDIParent1
      Private m_ChildFormNumber As Integer
      Private Sub ShowNewForm(ByVal sender As Object, ByVal e As EventArgs) Handles NewToolStripMenuItem.Click, NewToolStripButton.Click ', NewWindowToolStripMenuItem.Click
        ' Создать новый экземпляр дочерней формы.
        Dim ChildForm As New Form1 'System.Windows.Forms.Form
        ' Сделать ее дочерней для данной формы MDI перед отображением.
    
        ChildForm.MdiParent = Me
    
        m_ChildFormNumber += 1
        ChildForm.Text = "Лист " & m_ChildFormNumber
    
        ChildForm.Show()
      End Sub
    
    '....
    End Class
    

    А также в проект добавить форму (у меня Form1), которая и будет "создаваться" вызовом ShowNewForm количеством, сколько надо...
    

    Alexandr_Smirnoff
    • Предложено в качестве ответа Alexandr_Smirnoff 15 апреля 2011 г. 16:16
    15 апреля 2011 г. 16:16
  • Александр, спасибо, но это не то.

    Мне нужно не создание, а обращение к форме с именем

    "something" & i

    >Дочерняя форма, т.е. вам предлагают хранить словарь ИмяФормы-СсылкаНаФорму. И потом уже можно будет перебрать этот словарь или обратиться к нужной форме по ключу.

    2Дмитрий

    Можно ли так:

    Dim dochernyayaforma as new Form1

    ...

    dochernyayaforma.name="something" & i

    ....

    myDictionary.Add("something" & i, Form1);
    myDictionary("something" & i).Width = 10;?

    Или там вместо класса должно быть что-то другое?

    15 апреля 2011 г. 16:52
  • Да так, только вместо Form1 нужно передавать экзмемляр, т.е dochernyayaforma:

    myDictionary.Add("something" & i, dochernyayaforma);


    Для связи [mail]
    • Помечено в качестве ответа serjsmolin 16 апреля 2011 г. 9:17
    15 апреля 2011 г. 22:02
  • А то, что мы поменяли имя экземпляра:

    dochernyayaforma.name="something" & i

    перед этим?

    Все равно

    myDictionary.Add("something" & i, dochernyayaforma);

    ???

    15 апреля 2011 г. 22:12
  • Еще вопрос: Как можно поменять значение допустим метки расположенной на дочерней форме?

    Или и ее тоже нужно добавлять в Dictionary?

    15 апреля 2011 г. 22:34
  • Вы можете к ней обратиться через форму, которая уже в дикшинари. Надо только сделать ее паблик.

     

    Вот для формы, чтобы запихнуть, если имя выставлено раньше:

     

    dochernyayaforma.name="something" & i

     

    myDictionary.Add("something" & i, dochernyayaforma); - то же самое что и myDictionary.Add(dochernyayaforma.namedochernyayaforma); 

    В Формс дизайнере укажите модификатор доступа для своей метки как паблик.

    Потом сможете к нему достураться как к свойству Width.

    И не забудьте отметитить ответы, что вам помогли.


    Don't forget to mark the correct answer Blog
    • Помечено в качестве ответа serjsmolin 16 апреля 2011 г. 9:18
    16 апреля 2011 г. 7:27
  • При попытке myDictionary("something" & i).Label1.Text = "something" выдает

    "Label1" не является членом "System.Windows.Forms.Form".

    Label1.Modifiers поменял на Public.

    Как изменить зачение Label1.Text конкретного экземпляоа формы?

    16 апреля 2011 г. 17:56
  • System.Windows.Forms.Form - родительский класс для вашей конкретной формы. Вам нужно привести тип формы к конкретному типу.

    В VB для этого есть динамик каст, но опять таки, как точно выглядить синтаксически будет - не скажу.

    В С#:

    ((MyChildForm)myDictionary("something" & i)).Label1.Text = "something"

    Где MyChildForm - конкретный тип формы к которой Вы обращаетесь.

    Если все формы одного типа - вы можете создать поменять дикшинари чтобы он не был  Dictionary<string, Form>, а был типа Dictionary<string, MyChildForm>


    Don't forget to mark the correct answer Blog
    • Помечено в качестве ответа serjsmolin 16 апреля 2011 г. 19:45
    16 апреля 2011 г. 18:26
  • Public Class Main
    Public DictOfSynopsis As Dictionary(Of String, TextProcessing)
    Dim numberofsynopsis As Byte = 0
    Private Sub CreateNewSynopsis()
    Dim synopsis As New TextProcessing
      DictOfSynopsis.Add(synopsis.Name, synopsis) 'Ругается на эту строчку, мол: Ссылка на объект не указывает на экземпляр объекта. NullReferenceException не обработано.
    DictOfSynopsis(synopsis.Name).MdiParent = Me
    DictOfSynopsis(synopsis.Name).Text = synopsis.Text & " - " & numberofsynopsis
    DictOfSynopsis(synopsis.Name).Show()
    DictOfSynopsis(synopsis.Name).Name = "synopsis" & numberofsynopsis
    numberofsynopsis += 1
    End Sub

    Private Sub CreateSynopsisBtn_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles CreateSynopsisBtn.Click
    CreateNewSynopsis()
    End Sub
    End Class

    Помогите люди добрые, пятый день бьюсь над проблемой =(

    Очень срочно нужно. Заранее благодарю!

    17 апреля 2011 г. 9:59
  • DictOfSynopsis у вас до момента использования нигде не создаеться (по крайней мере в коде). Вы создаете ссылку вот этой строчкой:

    Public DictOfSynopsis As Dictionary(Of String, TextProcessing)

    Но нигде не видно у Вас оператора New для создания экземпляра:

    http://msdn.microsoft.com/en-us/library/77s47661.aspx#Y100 


    Don't forget to mark the correct answer Blog
    17 апреля 2011 г. 10:28
  • Точно! Даже смешно от того, что не заметил и по пустяку полез на форум. Сорри, причина - жуткое переутомление из-за сжатых сроков подготовки проекта %)
    17 апреля 2011 г. 10:49
  • Да что же это такое =(

    Не могу достучаться до массивов в экземплярах форм хотя они все Public

    Цикл For i=0 to UBound(Main.DictOfSynopsis("parentsynopsis").arrofa, 1) он даже ни разу не исполняет, просто пропускает его. хотел вывести данные через MessageBox.Show():

            MessageBox.Show(UBound(Main.DictOfSynopsis("parentsynopsis").arrofa, 1))
            MessageBox.Show(Main.DictOfSynopsis("parentsynopsis").arrofa(0, 2))

    они не только не отображаются, но и ошибки то и не выводит. Не знаю в чем причина. =(

     

    17 апреля 2011 г. 11:46