Как я могу получить доступ к элементам управления на моей странице ASP.NET из класса в решении? - PullRequest
2 голосов
/ 15 июня 2011

В основном я не использую MasterPage, и у меня просто есть проект с Default.aspx с несколькими метками, текстовыми полями и т. Д. Я потратил несколько часов на поиск решения и нашел его, но что-то в моей голове до сих пор меня достает, что я не сделал это так, как хотел.

У меня нет проблем с доступом к ним и настройкой их свойств из PageLoad.

Но я создал класс, как и фрагмент кода ниже, и он выдает мне «Ссылка на объект не установлена ​​на экземпляр объекта» . И я не могу понять, чего мне не хватает.

   class Functions 
    {
       public static void myMethod()
       {
            WebForm1 mainForm = new WebForm1();
            mainForm.myTextBox.Text = "Something.";
       }
    }

Мне удалось сделать так:

   class Functions 
    {
       public static void myMethod()
       {
           System.Web.UI.Page myMainForm;
           myMainForm = (System.Web.UI.Page)System.Web.HttpContext.Current.Handler;
           TextBox myTextBox = (TextBox)myMainForm.FindControl("myTextBox");
       }
    }

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

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

Заранее спасибо.

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

Ответы [ 6 ]

4 голосов
/ 15 июня 2011

Используйте для этого файлы с выделенным кодом. Не связывайте жестко классы бизнес-логики с вашим пользовательским интерфейсом.

WebForm1.aspx должен иметь WebForm1.aspx.cs при использовании c # или WebForm.aspx.vb при использовании vb, поэтому, если у вас есть элемент управления TextBox на WebForm1.aspx, вы должны иметь доступ к нему в коде файл (WebForm1.aspx.cs или WebForm1.aspx.vb)

public class Validate
{
    public bool IsEmail(string email)
    {
        //return false if invalid e-mail or true if valid
    }
}

Затем в вашем WebForm.aspx.cs вы можете позвонить

 Validate validate = new Validate();
 bool isValidEmail = validate.IsEmail(txtEmail.Text);

Где txtEmail - элемент управления. Вы можете сделать класс Validate статическим, так что вы можете просто сделать:

 bool isvalidEmail = Validate.IsEmail(txtEmail.Text);
2 голосов
/ 15 июня 2011

Что вы должны сделать, это объявить свой элемент управления в конструкторе или в коде позади. Скажем, myTextBox - ваше объявленное текстовое поле. Если вы хотите изменить текст этого текстового поля, вы должны создать свойство, например,

public string MyTextBoxText
{
   get
   {
      return MyTextBox.Text;
   }
   set
   {
      MyTextBox.Text = value;
   }
}

Извините за форматирование, ... Я продолжаю пытаться Ctrl + K + D, но это не работает;).

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

2 голосов
/ 15 июня 2011

Элементы управления на странице создаются при обработке системой asp.net. Они не создаются просто путем вызова конструктора класса страницы. Это означает, что вы не можете делать то, что изначально пытались - ни один из элементов управления не будет там. Вторая версия (FindControl) работала, потому что вы используете страницу, которая была правильно создана asp.net, для доступа к HttpContext.Current.Handler.

Как уже отмечали другие, похоже, что вы пытаетесь сделать что-то неправильно. Поскольку вы говорите, что вы новичок в asp.net, возможно, кто-то здесь может дать некоторые рекомендации, если вы объясните, что вам нужно сделать (в функциональном смысле, а не в техническом смысле)

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

1 голос
/ 15 июня 2011

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

class Functions 
{
   public static void myMethod()
   {
       WebForm1 myMainForm;
       myMainForm = (WebForm1)System.Web.HttpContext.Current.Handler;
       TextBox myTextBox = myMainForm.myTextBox;
   }
}

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

1 голос
/ 15 июня 2011

Передача или доступ к элементам управления, как это очень неправильно. Вместо этого отправьте необходимые данные этому методу через аргументы метода или инициализируйте класс Functions необходимыми данными (например, control.Text или чем-то) перед вызовом ваших методов. Здесь вы также пытаетесь сделать типичное функциональное программирование без какого-либо ООП-кода. Попробуйте найти хорошую книгу об ООП и сначала прочитайте ее, она облегчит вам все дела.

0 голосов
/ 29 сентября 2017

Вам необходимо удалить ключевое слово STATIC из вашего метода.Тогда вы сможете напрямую ссылаться на элементы управления.:)

...