Event on label is not updating the clicked label - c#

I want to add a event for label when a specific label is pressed, but my event handler is not reacting to the clicked label.
I created a calender so when I click a date I want to highlight that date, that's the requirement.
for (Int32 i = 1; i <= Dayz; i++)
{
ndayz += 1;
lblDayz = new Label();
lblDayz.Text = i.ToString();
lblDayz.Cursor = Cursors.Hand;
lblDayz.Name = "Date" + i;
lblDayz.Anchor = AnchorStyles.None;
lblDayz.TextAlign = ContentAlignment.MiddleCenter;
lblDayz.Click += lblDayz_Click;
}
Event handler looks like:
public void lblDayz_Click(object sender, EventArgs e)
{
lblDayz.BackColor = Color.FromArgb(176, 180, 43);
lblDayz.ForeColor = Color.White;
}

Your current implementation is trying to change the properties of lblDayz, which might be a single label somewhere. But the way you're creating labels you have a number of labels generated in code. One for each day
That means you need your handler to react to the label that was clicked. The label that was clicked is the sender in your event handler. Crudely then you could handle it like this
public void lblDayz_Click(object sender, EventArgs e)
{
Label clickedLabel = sender as Label;
clickedLabel.BackColor = Color.FromArgb(176, 180, 43);
clickedLabel.ForeColor = Color.White;
}

Related

How to know what Linklabel has been clicked?

Background
I have created 8 linklabels which are created using a loop which gets data from a database.
Each record fills a linklabel.
How ever how can I distinguish what linklabel has been clicked on?
Code
for (int i = 0; i <= rowCount - 1; i++)
{
LinkLabel Linklabel = new LinkLabel();
Linklabel.Text = ds.Tables[0].Rows[i]["code"].ToString();
Linklabel.Height = 15;
Linklabel.Width = 50;
Linklabel.AutoSize = true;
Linklabel.Location = new Point(10, (i + 1) * 30);
tabControl1.TabPages[0].Controls.Add(Linklabel);
// Add an event handler to do something when the links are clicked.
Linklabel.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabel1_LinkClicked);
}
private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
tabControl1.SelectedTab = tabPage2;
}
When clicking on any of the 8 linklabels that are drawn the same thing will happen.
What I would like to happen?
When clicking on any of the linklabels I would like to change a label.text to what the contents of the clicked linklabel was.
For example
If the first linklabel.text=("one") is clicked on label1.text becomes one.
If the second linkedlabel.text=("two") is clicked on label1.text becomes two.
You could use the sender argument in the callback which will point to the actual LinkLabel being clicked:
private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
label1.text = ((LinkLabel)sender).Text;
}

Removing dynamically generated buttons

I'm working with C# windows forms and need some help. I have a button that creates other buttons and adds them to the list 'buttons'. I need to have each button created destroy itself when it is clicked.
//create new button
Button newButton = new Button();
newButton.Name = "aButt"+buttNum;
Debug.WriteLine(newButton.Name);
buttNum++;
newButton.Text = "Button!";
newButton.Height = 50;
newButton.Width = 50;
//controls where the new button gets placed
if (curX > 9)
{
curX = 0;
curY++;
//defines the point the button spawns
newButton.Location = new System.Drawing.Point((curX * 55)+10, curY * 55);
//increments X to avoid placing a button on top of another
curX++;
}
else
{
newButton.Location = new System.Drawing.Point((curX * 55) + 10, curY * 55);
curX++;
}
newButton.UseVisualStyleBackColor = true;
newButton.Click += new System.EventHandler(this.removeThisButton);
buttons.Add(newButton);
this.Controls.Add(newButton);
I have the event listener set up, but since the sender has no actual information on the button itself i'm not sure how to get rid of it.
Any help is appreciated!
The click event handler has the signature
private void myButton_Click(object sender, EventArgs e)
The object sender is the source of the event. Just cast that to a Button, and there's what got clicked:
Button whatWasClicked = sender as Button;
if(whatWasClicked == null)
// never mind -- it wasn't a button...
Sender is the button. You can remove it from Form's control collection like this:
private void removeThisButton(object sender, EventArgs e) {
this.Controls.Remove(sender);
}

WPF C# Drag and Drop

Basically i am doing a drag and drop using textbox and labels , by dragging a label to a textbox . Textboxes and Labels are created in same for loop .
I have dynamically created textboxes ( textbox is the drop target) like this :
TextBox tbox = new TextBox();
tbox.Width = 250;
tbox.Height = 50;
tbox.AllowDrop = true;
tbox.FontSize = 24;
tbox.BorderThickness = new Thickness(2);
tbox.BorderBrush = Brushes.BlanchedAlmond;
tbox.Drop += new DragEventHandler(tbox_Drop);
if (lstQuestion[i].Answer.Trim().Length > 0)
{
wrapPanel2.Children.Add(tbox);
answers.Add(lbl.Content.ToString());
MatchWords.Add(question.Content.ToString(), lbl.Content.ToString());
}
I have also dynanmically create labels ( label is the drag target) like this :
Dictionary<string, string> shuffled = Shuffle(MatchWords);
foreach (KeyValuePair<string, string> s in shuffled)
{
Label lbl = new Label();
lbl.Content = s.Value;
lbl.Width = 100;
lbl.Height = 50;
lbl.FontSize = 24;
lbl.DragEnter += new DragEventHandler(lbl_DragEnter);
lbl.MouseMove += new MouseEventHandler(lbl_MouseMove);
lbl.MouseDown +=new MouseButtonEventHandler(lbl_MouseDown);
// lbl.MouseUp +=new MouseButtonEventHandler(lbl_MouseUp);
dockPanel1.Children.Add(lbl);
}
I have 2 issues here .
1st . I am using tbox.drop event to display MessageBox.Show( something ) ; to display a messagebox when the drag target is being drop but it doesn't work .
here is my code :
private void tbox_Drop(object sender, DragEventArgs e)
{
MessageBox.Show("Are you sure?");
}
Second , i also want to clear the tbox.Text when the drag target is dropped because i might have other drag target dropped into the tbox previously. So i want to clear the tbox.Text and drop the drag target everytime when i drag the target to textbox .
How do i do that? i am stucked at which event i should use for this and how do i access tbox from those event handlers ?
It worked for me.
private void lbl_MouseDown(object sender, MouseButtonEventArgs e)
{
Label _lbl = sender as Label;
DragDrop.DoDragDrop(_lbl, _lbl.Content, DragDropEffects.Move);
}
You do not need MouseMove and DragEnter events for Label if you are using them just for Drag purpose.
Replace Drop event with PreviewDrop for TextBox as shown below:
tbox.Drop += new DragEventHandler(tbox_Drop);
with this
tbox.PreviewDrop += new DragEventHandler(tbox_PreviewDrop);
private void tbox_PreviewDrop(object sender, DragEventArgs e)
{
(sender as TextBox).Text = string.Empty;
}
The TextBox you want to drag(add mousedown event)
private void dragMe_MouseDown(object sender, MouseButtonEventArgs e)
{
TextBox tb = sender as TextBox;
// here we have pass the textbox object so that we can use its all property on necessary
DragDrop.DoDragDrop(tb, tb, DragDropEffects.Move);
}
The TextBox on which you want to drop(add drop event and also you have to check the marked as allowdrop checkbox)
private void dropOnMe_Drop(object sender, DragEventArgs e)
{
TextBox tb= e.Data.GetData(typeof(TextBox)) as TextBox;
// we have shown the content of the drop textbox(you can have any property on necessity)
dropOnMe.Content = tb.Content;
}

Capture the right button click event

I'm playing around abit with winforms and its controls and just discovered how to do custommade buttonclicks. However, there is a problem. I've got a loop, that's looping through a list of elements, and if a condition appears - I'm creating a button that will pop up a gridview.
public void draw(ref Panel inputPanel) //draws the eventline
{
int stepCounter = 0;
for (int i = 0; i < DaysList.Count-1; i++)
{
Button b1;
if (DaysList[i].Elements.Count > max)
{
b1 = new Button(); //Create the box
b1.Width = 120;
b1.Height = 40; //Set width and height
b1.Location = new Point(stepCounter + 35, 70); //Location
inputPanel.Controls.Add(b1); //
b1.Text = "Check event date in grid";
b1.Show();
b1.BringToFront();
b1.Click += new EventHandler((sender, e) => btn_Click(sender, e, DaysList[i].Elements));
stepCounter += 200;
}
}
}
That was my method for creating the buttons and a click event for the when my condition appears. The function that is passed to the eventhandler looks like this:
public void btn_Click(object sender, EventArgs e, List<EventElement> inputElems)
{
Button button = sender as Button;
DataGridForm window = new DataGridForm(inputElems);
window.Show();
}
public class EventElement
{
public EventElement()
{
}
public int Count{get;set;}
public string Date{get;set;}
}
The clickpart of the event is fine but whenever i click the spawned buttons, I get the wrong data into the gridview. As an example: The loop has created four buttons for me and they are presented on a straight line on the form. But whenever i click one of the buttons - dosnt matter which one of them, the button always return the data of the last spawned button. A more clear example: lets say we have the list inputElems looks like this:
inputElems[0].Count -> 2644
inputElems[1].Count -> 2131
inputElems[2].Count -> 8467
inputElems[3].Count -> 5462
When i now click the second button, the input to the second buttons parameter list should have the values (sender, e, 2131), right? but for some reason, the last argument gets the same like the 4th element in the list, even though i call the secondly created button.
I figured that it has something to do with me always calling the last added button_click to the eventhandler of the button, if so, how do I call different clicks from the EventHandler?
Instead of passing inputElems with the EventHandler, you can use Tag.
E.g. use:
b1.Tag=i;
Then in your click event handler:
public void btn_Click(object sender, EventArgs e)
{
Button button = sender as Button;
DataGridForm window = new DataGridForm(DaysList[int.Parse(button.Tag.ToString())].Elements);
window.Show();
}
The problem is that the for loop is out of scope, and thus unable to provide you with the data you're looking for. A more straight forward approach might be something like this:
public void draw(ref Panel inputPanel) //draws the eventline
{
int stepCounter = 0;
for (int i = 0; i < DaysList.Count-1; i++)
{
Button b1;
if (DaysList[i].Elements.Count > max)
{
b1 = new Button(); //Create the box
b1.Width = 120;
b1.Height = 40; //Set width and height
b1.Location = new Point(stepCounter + 35, 70); //Location
inputPanel.Controls.Add(b1); //
b1.Text = "Check event date in grid";
b1.Show();
b1.BringToFront();
b1.Tag = DaysList[i].Elements;
b1.Click += btn_Click;
stepCounter += 200;
}
}
}
and then in btn_Click, do this:
public void btn_Click(object sender, EventArgs e)
{
Button button = sender as Button;
int inputElems = (List<EventElement>)button.Tag;
DataGridForm window = new DataGridForm(inputElems);
window.Show();
}

Address a generated button for clickevent

I have a class that creates panels with controls based on my database. It creates a panel with a button on each panel, per row in DB. How do I address one specific button to make a click event?
I'm a rookie, and maybe abit over my head, but you don't learn to swim in shallow water ;)
Any help appreciated!
while (myDataReader.Read())
{
i++;
Oppdrag p1 = new Oppdrag();
p1.Location = new Point (0, (i++) * 65);
oppdragPanel.Controls.Add(p1);
p1.makePanel();
}
class Oppdrag : Panel
{
Button infoBtn = new Button();
public void makePanel()
{
this.BackColor = Color.White;
this.Height = 60;
this.Dock = DockStyle.Top;
this.Location = new Point(0, (iTeller) * 45);
infoBtn.Location = new Point(860, 27);
infoBtn.Name = "infoBtn";
infoBtn.Size = new Size(139, 23);
infoBtn.TabIndex = 18;
infoBtn.Text = "Edit";
infoBtn.UseVisualStyleBackColor = true;
}
}
You'll need a method that matches the event thrown by clicking on the button.
i.e.)
void Button_Click(object sender, EventArgs e)
{
// Do whatever on the event
}
Then you'll need to assign the click event to the method.
p1.infoBtn.Click += new System.EventHandler(Button_Click);
Hope this helps.
You can add the event handler for the button when you create the button. You can even add a unique CommandArgument per button so you can distinguish one button from another.
public void makePanel()
{
/* ... */
infoBtn.UseVisualStyleBackColor = true;
infoBtn.Click += new EventHandler(ButtonClick);
infoBtn.CommandArgument = "xxxxxxx"; // optional
}
public void ButtonClick(object sender, EventArgs e)
{
Button button = (Button)sender;
string argument = button.CommandArgument; // optional
}

Categories