none
Возможно ли получить доступ ко всем элементам формы без использования FindControl для каждого элемента? RRS feed

  • Вопрос

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

    У меня на странице много полей (TextBox) и мне со всеми нужно работать в коде. Чтобы получить доступ, нужно использовать FindControl... В итоге у меня получается вот такой вот довесок к функции:

           Dim DATA_V As TextBox = CType(FormView1.FindControl("DATA_V"), TextBox)
            Dim DATA_R As TextBox = CType(FormView1.FindControl("DATA_R"), TextBox)
            Dim N_SNEK As TextBox = CType(FormView1.FindControl("N_SNEK"), TextBox)
            Dim N_PPRK As TextBox = CType(FormView1.FindControl("N_PPRK"), TextBox)
            Dim O_SNEK As TextBox = CType(FormView1.FindControl("O_SNEK"), TextBox)
            Dim O_PPRK As TextBox = CType(FormView1.FindControl("O_PPRK"), TextBox)
            Dim O_SNE1 As TextBox = CType(FormView1.FindControl("O_SNE1"), TextBox)
            Dim O_SNE2 As TextBox = CType(FormView1.FindControl("O_SNE2"), TextBox)
            Dim O_SNE3 As TextBox = CType(FormView1.FindControl("O_SNE3"), TextBox)
            Dim O_SNE4 As TextBox = CType(FormView1.FindControl("O_SNE4"), TextBox)
            Dim O_PPR1 As TextBox = CType(FormView1.FindControl("O_PPR1"), TextBox)
            Dim O_PPR2 As TextBox = CType(FormView1.FindControl("O_PPR2"), TextBox)
            Dim O_PPR3 As TextBox = CType(FormView1.FindControl("O_PPR3"), TextBox)
            Dim O_PPR4 As TextBox = CType(FormView1.FindControl("O_PPR4"), TextBox)
            Dim NK As TextBox = CType(FormView1.FindControl("NK"), TextBox)
            Dim RN1 As TextBox = CType(FormView1.FindControl("RN1"), TextBox)
            Dim RN1_Prodl As TextBox = CType(FormView1.FindControl("RN1_Prodl"), TextBox)
            Dim RN2_Prodl As TextBox = CType(FormView1.FindControl("RN1_Prodl"), TextBox)
            Dim RN2 As TextBox = CType(FormView1.FindControl("RN2"), TextBox)
            Dim RN3 As TextBox = CType(FormView1.FindControl("RN3"), TextBox)
            Dim RN4 As TextBox = CType(FormView1.FindControl("RN4"), TextBox)
            Dim RM1 As TextBox = CType(FormView1.FindControl("RM1"), TextBox)
            Dim RM1_Prodl As TextBox = CType(FormView1.FindControl("RM1_Prodl"), TextBox)
            Dim RM2_Prodl As TextBox = CType(FormView1.FindControl("RM1_Prodl"), TextBox)
            Dim RM2 As TextBox = CType(FormView1.FindControl("RM2"), TextBox)
            Dim RM3 As TextBox = CType(FormView1.FindControl("RM3"), TextBox)
            Dim RM4 As TextBox = CType(FormView1.FindControl("RM4"), TextBox)
            Dim NE1 As TextBox = CType(FormView1.FindControl("NE1"), TextBox)
            Dim NE2 As TextBox = CType(FormView1.FindControl("NE2"), TextBox)
            Dim NE3 As TextBox = CType(FormView1.FindControl("NE3"), TextBox)
            Dim NE4 As TextBox = CType(FormView1.FindControl("NE4"), TextBox)
            Dim NR1 As TextBox = CType(FormView1.FindControl("NR1"), TextBox)
            Dim NR2 As TextBox = CType(FormView1.FindControl("NR2"), TextBox)
            Dim NR3 As TextBox = CType(FormView1.FindControl("NR3"), TextBox)
            Dim NR4 As TextBox = CType(FormView1.FindControl("NR4"), TextBox)
            Dim DE_1 As TextBox = CType(FormView1.FindControl("DE_1"), TextBox)
            Dim DE_2 As TextBox = CType(FormView1.FindControl("DE_2"), TextBox)
            Dim DE_3 As TextBox = CType(FormView1.FindControl("DE_3"), TextBox)
            Dim DE_4 As TextBox = CType(FormView1.FindControl("DE_4"), TextBox)
            Dim DE_K As TextBox = CType(FormView1.FindControl("DE_K"), TextBox)
            Dim SS As TextBox = CType(FormView1.FindControl("SS"), TextBox)
            Dim NBM_H As TextBox = CType(FormView1.FindControl("NBM_H"), TextBox)
            Dim NBM_L As TextBox = CType(FormView1.FindControl("NBM_L"), TextBox)
            Dim NBM_N As TextBox = CType(FormView1.FindControl("NBM_N"), TextBox)
            Dim NBM_R As TextBox = CType(FormView1.FindControl("NBM_R"), TextBox)
            Dim LastFlightInfo As TextBox = CType(FormView1.FindControl("LastFlightInfo"), TextBox)
    

    Неужели нет такой возможности напрямую обращаться к элементам формы типа такой:

    FormView1.TextBoxName ?

    Как-то натыкался на одну статью, где было рассказано, что в используемую страницу нужно вставить специальный код <% ... тут было что-то... %>  и доступ появится. Я вставлял как было описано, но не заработало. Статью я удачно забыл где откопал.

    13 апреля 2012 г. 9:59

Ответы

  • Можете получить все так.

    TextBox[] texts = FormView1.Controls.OfType<TextBox>().Select(t => t).ToArray();

    13 апреля 2012 г. 10:31
    Модератор
  • "При выполнении не ругается, но не совсем ясно как получать доступ к данным. Пытался через кавычки Textes("DATA_V").Text - дает ошибку при выполнении." - ну если будете искать по имени, то делать несколько запросов линк не имеет смысла лучше уж как есть.
    13 апреля 2012 г. 12:58
    Модератор

Все ответы

  • На то он и форум чтобы спрашивать. Если бы они находились непосредственно в классе страницы то да, но так как они распологаются в коллекции(элементах контейнерах) то нет, метод производит поиск элементов в коллекции по индексу.
    13 апреля 2012 г. 10:15
    Модератор
  • А почему у Вас столько много полей, вы генерируете их в шаблоне ?
    13 апреля 2012 г. 10:18
    Модератор
  • Здравствуйте.

    Page.Controls

    - это должно вам подойти. Посмотрите статью Использование коллекции элементов управления в веб-страницах ASP.NET


    Для связи [mail]

    13 апреля 2012 г. 10:30
    Модератор
  • Можете получить все так.

    TextBox[] texts = FormView1.Controls.OfType<TextBox>().Select(t => t).ToArray();

    13 апреля 2012 г. 10:31
    Модератор
  • Полей много потому, что много различных параметров должно отображаться на форме. Часть данных берется из базы данных через SqlDataSource и по этим данным ведутся расчеты, заносимые в остальные поля.

    Попробовал переписать ваш код на VB, не понял что надо писать там в Select, такое он не принимает там, в итоге получил следующее:


    Dim Textes() As TextBox
    Textes = FormView1.Controls.OfType(Of TextBox).ToArray()
    

    При выполнении не ругается, но не совсем ясно как получать доступ к данным. Пытался через кавычки Textes("DATA_V").Text - дает ошибку при выполнении.

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

    Dim test = From fields In db.TABLENAME _
                        Select fields
    Dim test_1 = test.First()
    
    test.FIELDNAME

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

    13 апреля 2012 г. 11:53
  • "Попробовал переписать ваш код на VB, не понял что надо писать там в Select, такое он не принимает там, в итоге получил следующее" - вот так попробуйте, просто я не очень знаком с vb.net.

    Dim texts() As TextBox = FormView1.Controls.OfType(Of TextBox)().Select(Function(t) t).ToArray()

    13 апреля 2012 г. 12:54
    Модератор
  • "При выполнении не ругается, но не совсем ясно как получать доступ к данным. Пытался через кавычки Textes("DATA_V").Text - дает ошибку при выполнении." - ну если будете искать по имени, то делать несколько запросов линк не имеет смысла лучше уж как есть.
    13 апреля 2012 г. 12:58
    Модератор