2016-04-24 7 views
1

Хорошо, так что это немного сложно объяснить.Как узнать, какая кнопка была нажата в winforms C#?

Я работаю над базовой формой таблицы времени.

У меня есть 7 кнопок, названных btnMonTime, btnTueTime и т. Д. До btnSunTime по дням недели. Теперь при каждом нажатии кнопки открывается всплывающее окно (winform), которое позволяет пользователю выбрать определенное время через элемент управления dateTimePicker. Время анализируется в строке и сохраняется. Существует кнопка Принять на всплывающем окне, которое при нажатии всплывающее окно закрывается, а ярлык рядом с конкретным днем ​​указывается, что время опубликовано.

Image where popup comes up when Time beside Monday is clicked

`Image where label with the time has to be places beside the particular day whose Time button was pressed

Теперь я знаю, как сделать это за один конкретный день, но дело в том, что у меня есть одна единственная функция делает эту метку, создавая. Но как узнать, какая кнопка времени нажата, чтобы поместить ее в нужное место?

Это код, который я мог придумать:

private void btnAccept_Click(object sender, EventArgs e) 
{ 
     formPopup.time = timePicker.Value.ToShortTimeString(); 
     //label1.Text = formPopup.time; 

     Label newLabel = new Label(); 
     newLabel.Text = formPopup.time; 
     newLabel.Location = new System.Drawing.Point(205 + (100 * formTimeTable.CMonTime), 78); 
     formTimeTable.CMonTime++; 
     newLabel.Size = new System.Drawing.Size(100, 25); 
     newLabel.ForeColor = System.Drawing.Color.White; 
     thisParent.Controls.Add(newLabel); 

     this.Close(); 
} 

Это Accept нажатие кнопки обработчик, который помещает метку в нужном месте. Принимая во внимание, что переменная CMonTime отслеживает, сколько раз было задано определенное значение Нажата кнопка.

public static int CMonTime = 0; 
private void btnMonTime_Click(object sender, EventArgs e) 
{ 
    formPopup f2 = new formPopup(); 
    f2.thisParent = this; 
    f2.Show();  
} 

И это то, что происходит внутри обработчика щелчка кнопки «Понедельник».

Но как я могу узнать, какая кнопка дня была нажата для правильного размещения метки метки времени?

Как если бы нажала кнопка «Время во вторник», отметка времени должна отображаться рядом с кнопкой «Время» во вторник.

Я старался быть как можно более ясным.

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

ответ

0

sender - объект, который поднял событие. В вашем случае это кнопка, на которую пользователь нажал.

+0

могли бы вы уточнить, что мало? –

+0

Какой бит вы не следуете? – yaakov

2

Вы можете получить кнопку, на которую была нажата кнопка, выбрав параметр отправителя в качестве элемента управления Button. Используйте расположение баттона в качестве параметра для formPopup конструктора

private void btnMonTime_Click(object sender, EventArgs e) 
{ 
    var button = (Button)sender; 
    formPopup f2 = new formPopup(button.Location); 
    f2.thisParent = this; 
    f2.Show();  
} 

formPopup

Point _buttonLocation; 

public frmPopup(Point buttonLocation) 
{ 
    _buttonLocation = buttonLocation; 
} 

Затем используйте расположение баттона, чтобы установить местоположение вашего лейбла

private void btnAccept_Click(object sender, EventArgs e) 
{ 
    formPopup.time = timePicker.Value.ToShortTimeString(); 

    Label newLabel = new Label(); 
    newLabel.Text = formPopup.time; 
    newLabel.Location = new Point(_buttonLocation.X + 100, _buttonLocation.Y); 

    formTimeTable.CMonTime++; 
    newLabel.Size = new System.Drawing.Size(100, 25); 
    newLabel.ForeColor = System.Drawing.Color.White; 
    thisParent.Controls.Add(newLabel); 

    this.Close(); 
} 
0

Поскольку эти комбинации управления повторить , может быть проще создать UserControl, который содержит кнопки и метки, которые вы хотите. Подумайте о UserControl как о небольшой форме, состоящей из нескольких элементов управления, и разместите ее на своей форме столько раз, сколько вам нужно. Он имеет свои собственные обработчики событий.Таким образом, есть технически только одна кнопка (не семь) и один обработчик событий. Затем вы можете разместить это UserControl на вашей форме семь раз.

Есть и другие способы избежать дублирования кода, например, иметь один обработчик событий и назначать его событиям щелчка для всех семи кнопок. Но UserControl действительно сэкономит вам время, если вы хотите отредактировать макет самих кнопок. Вы не хотите делать это семь раз.

Чтобы попробовать это:

  • Add> New Item> Управление пользователями. Вы получите то, что выглядит как новая форма. Добавьте к нему несколько элементов управления так же, как вы добавили элементы управления в форму. Затем сохраните его, используя имя (только для примера) MyUserControl.cs.
  • Постройте проект.
  • В панели инструментов появится новая вкладка панели инструментов, и ваш элемент управления будет там.
  • Перетащите свой контроль на форму так же, как и любой другой элемент управления.

More info on creating user controls