«Переключение» текста в метках - PullRequest
2 голосов
/ 20 сентября 2019

У меня есть Label на моем Form, например:

lblUser.Text = "John";

Мне нужно, чтобы текст изменился , когда пользователь нажал на it

private void lblUser_Click(object sender, EventArgs e)
{
    lblUser.Text = "Mike";
}

Таким образом, если пользователь нажимает снова, текст должен изменить назад.Как я могу переключать этот текст неограниченное количество раз ?Количество имен может быть больше, чем 2.Text следует изменить

John -> Mike -> Jack -> John -> Mike -> Jack -> John -> ...

и т. Д.

Ответы [ 5 ]

3 голосов
/ 20 сентября 2019

Сначала давайте организуем доступные имена в коллекцию (пусть это будет массив):

private static string[] s_Names = new [] {
  "John", "Mike", "Jack", "Thomas",
}; 

, затем мы можем изменить имя на Click с помощью Linq :

using System.Linq;   

...

private void lblUser_Click(object sender, EventArgs e) {
  lbUser.Text = s_Names
    .SkipWhile(name => name != lbUser.Text) // scroll up to the current name      
    .Skip(1)                                // skip current name
    .FirstOrDefault() ?? s_Names.First();   // restart if s_Names is exhausted
} 

Редактировать: Та же идея, нет решения Linq (мы ищем индекс текущего имени, добавляем 1 и используем арифметику по модулю для перезапуска последовательностиимен)

private void lblUser_Click(object sender, EventArgs e) {
  lbUser.Text = s_Names[(Array.IndexOf(s_Names, lbUser.Text) + 1) % s_Names.Length];
} 
0 голосов
/ 20 сентября 2019

Если у вас есть только два имени , которые вы хотите переключить, вы можете сделать следующее:

class Program {
        private const string nameOne = "John";
        private const string nameTwo = "Mike";

        private void lblUser_Click (object sender, EventArgs e) {
            if (lblUser.Text == nameOne)
            {
                lblUser.Text = nameTwo;
            }else{
                lblUser.Text = nameOne;
            }
        }
    }
0 голосов
/ 20 сентября 2019

проверка этикетки и ее изменение в соответствии с требованием.

private void button1_Click(object sender, EventArgs e)
        {
            int index = names.IndexOf(label1.Text);
            index = (index + 1) % (names.Count);
            label1.Text = names[index];
        }
0 голосов
/ 20 сентября 2019
int nameCounter = 0; // Variable to track displayed element
var usernameList = new List<string> { "John", "Mike", "Bill", "Andy" }; // list of values to cycle
lblUser.Text = usernameList[nameCounter++];
private void lblUser_Click(object sender, EventArgs e)
{
   nameCounter = nameCounter < usernameList.Count ? nameCounter : 0;
   lblUser.Text = usernameList[nameCounter++];
}
0 голосов
/ 20 сентября 2019

Используйте массив для хранения имен, которые вы хотите переключить (или укажите, хотите ли вы добавлять элементы во время выполнения):

private string[] Names = new string[]{"John","Mike"}; //Etc.

Теперь вы хотите сохранить, какое имя отображается сindex:

private int NameIndex = 0;

Наконец, вы можете перебирать массив при каждом нажатии кнопки:

private void lblUser_Click(object sender, EventArgs e)
{
    lblUser.Text = Names[NameIndex%Names.Length];
    NameIndex++;
}
...