Как достичь переменной глобально?

#c# #asp.net

#c# #asp.net

Вопрос:

У меня есть несколько строк кода, подобных этому,

 public void rt_changed(object sender, AjaxControlToolkit.RatingEventArgs e)
{
    //Label l = sender as Label;
    foreach (DataListItem li in datalist.Items)
    { 

      Label l = li.FindControl("nl") as Label;

    }
    Label3.Text = l.ToString(); // l values is not getting
 }
  

Здесь переменная l равна нулю. Я знаю, что это происходит, потому что объявление l было сделано внутри области видимости foreach . Я не знаю, как вызвать переменную со значением в глобальном масштабе.

Ответ №1:

Объявите переменную во внешней области видимости:

  public void rt_changed(object sender, AjaxControlToolkit.RatingEventArgs e)
 {
     Label l = null;
     foreach (DataListItem li in datalist.Items)
     { 
          l = li.FindControl("nl") as Label;
     }          
     Label3.Text = (l == null ? string.Empty : l.Text); 
 }
  

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

Совет 1: назовите свои переменные более осмысленным именем (‘l’ мало что говорит).

Совет 2: используйте Text свойство для получения текста метки вместо ToString()

Комментарии:

1. Все еще получаю то же самое. System.Web.UI.WebControls. Метка передается вместо значения метки.

2. Используйте свойство Text вместо toString()

Ответ №2:

Вам просто нужно переместить объявление l переменной за пределы цикла, чтобы сделать ее доступной. Вы можете объявить (указать, что это такое) в другом месте, чем там, где вы присваиваете ей значение.

 public void rt_changed(object sender, AjaxControlToolkit.RatingEventArgs e)
{
  // Declare l, also give it a default value, in the case that datalist is empty.
  Label l = null;
  foreach (DataListItem li in datalist.Items)
  { 
    l = li.FindControl("nl") as Label;
  }
  Label3.Text = l.ToString(); // l values is not getting
}
  

Пожалуйста, обратите внимание, что l это будет присвоено только последнему значению в datalist коллекции, что, вероятно, не совсем то, что вы хотите.

Комментарии:

1. Но в этом случае, могу ли я получить значение l в label3 ?

2. Да, вы будете. Ваша переменная будет доступна в любом месте обработчика событий.

3. Здесь я получаю System.Web.UI.WebControls. Метка вместо label3.

4. @Anders Abel. Вы правы, как вы сказали, я получаю только последнее значение в списке данных. Как я могу изменить свой код, чтобы получить по своему желанию?

5. @gkrishy Это еще один вопрос, пожалуйста, опубликуйте его как новый. Комментарии к Stack Overflow не очень подходят для последующих вопросов.

Ответ №3:

Это просто,

 public void rt_changed(object sender, AjaxControlToolkit.RatingEventArgs e)
    {
        //Label l = sender as Label;
        foreach (DataListItem li in datalist.Items)
        { 

          Label3.Text = (li.FindControl("nl") as Label).Text;

        }

     }
  

Комментарии:

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

2. Несмотря на то, что Label3 является элементом управления. Вы можете получить доступ к Label3 где угодно на этой странице, верно?