label is not created in other form C# win form - c#

So, my problem is that i have a button in one form that needs to add a label in other form, label has a text that is from main labels textbox, and label has a backcolor that is from color block selected from main form.
private void btnAdd_Click(object sender, EventArgs e)
{
PiezimesLogs log = new PiezimesLogs();//form where the label would be added
Label l = new Label();// creates new label
l.Text = piezimeTxt.Text;
l.BackColor = ColorChange.BackColor;
log.Controls.Add(l);
}
so, this is the code from button that should do everything.
log - other form in which the label should be created.
c# win form

Instead of creating a new label, you could simply add an empty label to your 'target-form'.
Afterwards, you can simply modify the labels' text in order to make it appear.
Regards,
Michael

Related

How to Control Which Object Used ToolStrip in C#

I have 100 buttons which created dynamically. Every button has same text and same name. Actually all of them is totally same. I added a property to my toolstrip menu called "color".
This is my function which must be change color.
private void colorfunc(object sender, MouseEventArgs e)
{
//
}
I created the toolstrip like this.
ContextMenuStrip menu= new ContextMenuStrip();
ToolStripMenuItem color= new ToolStripMenuItem("color");
color.Click += colorfunc;
menu.Items.AddRange(new ToolStripItem[] { color});
I want to do is when i right click to my button and after click the color item from toolstrip my button must be green. But i want to do is for only the button which is right clicked. Other 99 button must be stay like before. How to i do that?

Is there a way to control all radio buttons through one control? Instead of passing a control for each radio button (C#)

I am currently creating an online shop on winform in c#.
At the moment I am creating a 'shopping basket' related textbox where if a user clicks on a particular radio button the textbox shows the description of the product in the text box.
I have grouped my radio buttons in a group box and would like to know whether there is anything equivalent to a 'SelectedIndex' command for all radio buttons? Thanks.
Simply subscribe all radio buttons to the same event. Then you can act on which is checked and act accordingly instead of having duplicate code for each button.
Below is a simple example that set a text box's Text property to display which is checked.
Form class
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void radioButtons_CheckedChanged(object sender, EventArgs e)
{
//Do whatever you need to do here. I'm simple setting some text based off
//the name of the checked radio button.
System.Windows.Forms.RadioButton rb = (sender as System.Windows.Forms.RadioButton);
textBox1.Text = $"{rb.Name} is checked!";
}
}
In the .designer.cs file
//Note that the EventHandler for each is the same.
this.radioButton3.CheckedChanged += new System.EventHandler(this.radioButtons_CheckedChanged);
this.radioButton2.CheckedChanged += new System.EventHandler(this.radioButtons_CheckedChanged);
this.radioButton1.CheckedChanged += new System.EventHandler(this.radioButtons_CheckedChanged);
If you want to be able to select more than one radiobutton at a time, I suggest you to use checkboxes instead of radiobuttons. You can assign all their events to the same single event and control which of the checkboxes are checked.
private void checkBox_CheckedChanged(object sender, EventArgs e)
{
CheckBox checkBoxControl = (CheckBox) sender; // You can use this variable to see which one of the checkbox is checked.
}

How to reference/link to a listbox that is dynamically created using a button and tabControl?

I am working on making a music player in c#. I am making music playlists right now and am stuck. As of right now I am using tabControl and a button that adds a tab with an empty listbox in it. Here is the code for that button:
private void button10_Click(object sender, EventArgs e)
{
TabPage tp = new TabPage("Playlist");
tabControl1.TabPages.Add(tp);
ListBox lb = new ListBox();
lb.Dock = DockStyle.Fill;
tp.Controls.Add(lb);
}
The problem I am running into is that I do not know how to allow the user to add music to these dynamically created listboxes within the tabs. The main list of music is located in a listbox in the first tab and I want the user to be able to select this music and put it in the new listboxes or "playlists" so I need to reference them somehow.
I'll just assume that you have a button (addToPlayListButton), a textBox (playListName) to add the selected song to the entered playList (tab-) name and that your songs listBox is called songList. I'll furthermore assume that every new playlist has a new tab. In that case you'll have to identify them so I'd change the name of the tabs:
TabPage tp = new TabPage($"Playlist {tabControl1.TabPages.Count}");
So you'll have to handle the button click event from addToPlayListButton like that:
private void onAddToPlayListButton_Click (object sender, EventArgs e) =>
(tabControl1.TabPages.Cast<TabPage>()
.FirstOrDefault(page => page.Text == playListName.Text)
?.Controls.Cast<Control>()
.FirstOrDefault(control => control is ListBox) as ListBox)?.Items.Add(songList.SelectedItem);

How to display a label in all tabs control

I am using tab control, and there is one label that showing customer's name that I want to display in all three 3 tabs. However, if I put it on tab 1, then it won't show on tab 2 and 3, even thought that the name of the label is unique. Is there a way to do that ? or do I have to create 3 different labels ? thanks a lot.
This might work for you. When changing tabs. Add the label to the TabPage's Controls collection. When adding the label to the new TabPage it gets removed from the previous TabPage so you have to re-add it every time you change tabs.
public partial class Form1 : Form
{
Label label = new Label() { Text = "Hello World" };
public Form1()
{
InitializeComponent();
tabControl1.TabPages[0].Controls.Add(label);
}
private void tabControl1_Selected(object sender, TabControlEventArgs e)
{
e.TabPage.Controls.Add(label);
e.TabPage.Controls.SetChildIndex(label, 0);
}
}
Position label1 in your desired location in the TabPage at design-time, then switch it to the Form in the Load() event using code like this:
private void Form1_Load(object sender, EventArgs e)
{
Point pt = label1.PointToScreen(new Point(0, 0));
label1.Parent = this;
label1.Location = this.PointToClient(pt);
label1.BringToFront();
}
You should put on form 2 panels.
1st panel should have Docking = Top and with height equal to height of your label. Put your label there (on 1st panel).
2nd panel should have Docking = Fill, put your tab control on 2nd panel.

C# - Creating controls dynamically and accessing them

I'm creating a simple notepad type of application with the tab functionality. I'm creating the TabControl, its TabPages and RichTextBoxes at run-time. I have them instantiated at class scope. And there is a MenuStrip item called New, by clicking that you can add more tab pages.
TabControl tbcEditor = new TabControl();
TabPage tbPage = new TabPage();
RichTextBox rtb = new RichTextBox();
private void frmTextEditor_Load(object sender, EventArgs e)
{
Controls.Add(tbcEditor);
tbcEditor.Dock = DockStyle.Fill;
tbcEditor.TabPages.Add(tbPage);
tbPage.Controls.Add(rtb);
rtb.Dock = DockStyle.Fill;
}
private void newToolStripMenuItem_Click(object sender, EventArgs e)
{
//TabPage tbPage = new TabPage();
//RichTextBox rtb = new RichTextBox();
tbPage.Controls.Add(rtb);
rtb.Dock = DockStyle.Fill;
tbcEditor.TabPages.Add(tbPage);
}
The problem I'm facing is a bit difficult to explain. I'll try my best. When the form loads, everything works as expected. The TabControl creates with a TabPage with a RichTextBox added. However if I click that New button to add another page, it goes bonkers. A new TabPage gets created but without a RichTextBox added. No errors are thrown either. If I un-comment out those 2 lines(under MenuItem click event), which creates 2 instances of TabPage and RichTextBox, everything works as I want.
Now my first question is why do I have to make new instances of only those 2 types(TabPage, RichTextBox) again but not TabControl? As you can see in the last line, I can use tbcEditor once again. But not tbPage and rtb.
Sure I can go on declaring them again at local scope but another issue arises then. If I want to say, add copy, paste functionality, I should do something like this,right?
Clipboard.SetDataObject(rtb.SelectedText);
But I can't access rtb since it is declared as local.
I'm very baffled by this so any suggestions, ideas on how to overcome these 2 issues would be greatly appreciated.
Thank you.
If I un-comment out those 2 lines(under MenuItem click event), which creates 2 instances of TabPage and RichTextBox, everything works as I want.
When you uncomment those lines, you are adding the same instance of the rich textbox and tab page to the container panel again which is meaningless. Instead add new controls foreach tabpage. (I hope thats the requirement)
Now my first question is why do I have to make new instances of only those 2 types(TabPage, RichTextBox) again but not TabControl?
TabControl is the parent control which has TabPages as child controls. You can have multiple tabs under one TabControl. So you need not create TabControls other than the tbcEditor you have already added. We do not add container controls more than once (unless its the requirement). Do we need more forms? No, just one form which can hold all the child controls right. Similarly just one TabControl which can hold a collection of TabPages. You would need more TabControls only if you want sub-tabs foreach new tab which I guess is not the requirement..
But I can't access rtb since it is declared as local.
This is no big deal. You can do in two ways:
1) Search for your appropriate control by looping. The SelectedTab property gives what you want.
private void someEvent(object sender, EventArgs e)
{
foreach (Control c in tbcEditor.SelectedTab.Controls)
{
if (c is RichTextBox)
{
Clipboard.SetDataObject(((RichTextBox)c).SelectedText);
break; //assuming u have just one main rtb there
}
}
}
2) Tag each rtb to the tabPage when you create it, and then you can get the tag element of the selected tab page to get the rich text box. I would go for this approach.
Edit: (In general pls make the following changes too to your code):
TabControl tbcEditor = new TabControl();
private void frmTextEditor_Load(object sender, EventArgs e)
{
Controls.Add(tbcEditor);
tbcEditor.Dock = DockStyle.Fill;
AddMyControlsOnNewTab();
}
private void AddMyControlsOnNewTab()
{
TabPage tbPage = new TabPage();
RichTextBox rtb = new RichTextBox();
tbPage.Tag = rtb; //just one extra bit of line.
tbcEditor.TabPages.Add(tbPage);
tbPage.Controls.Add(rtb);
rtb.Dock = DockStyle.Fill;
}
private void newToolStripMenuItem_Click(object sender, EventArgs e)
{
AddMyControlsOnNewTab();
}
Now, you can call it like this:
private void someEvent(object sender, EventArgs e)
{
RichTextBox rtb= (RichTextBox)tbcEditor.SelectedTab.Tag;
Clipboard.SetDataObject(rtb.SelectedText);
//or even better in just a line,
//Clipboard.SetDataObject(((RichTextBox)tbcEditor.SelectedTab.Tag).SelectedText);
}
What you have to consider here is which is the control that you first get and which is the one you do not get. You would get TabPage anyways but not the RichTextBox. So you have to tag RichTextBox to TabPage. You have to cast it since Tag is of type object, so you have to specify which kind of object it is. Finally, this method has the advantage that you need not loop through a list, so its more performant. And that you can have more RichTextBoxes in the TabPage (provided you want to copy text from only one set of RichTextBoxes, one from each TabPage)..
The commented lines are doing just what they are suppposed to do. The code does not associate the Richtextbox with the Tabpage .
TabPage tbPage = new TabPage(); // Creates a new tabpage
RichTextBox rtb = new RichTextBox(); // Creates a new RichtextBox control.
TabControl is a container , so one instance is just fine.
Also see this - http://sujay-ghosh.blogspot.in/2009/03/addingremoving-dynamically-created.html, nothing with do with tabcontrols, but how to create controls on the fly.
Hope this helps .
The code
tbPage.Controls.Add(rtb);
rtb.Dock = DockStyle.Fill;
tbcEditor.TabPages.Add(tbPage);
Takes your exisitng textbox, adds it to the exisitng tab page, then adds that existing tab page to the editor. Since this has already been done, nothing happens.
When you add those two lines, you create new instances of the text box and a new tab page, which is exactly what you want. Your latter problem comes, because the newly declared variable rtb hides the one declared in the class -- in a different method you can only access the onde declared in the class (barring getting the control out of the tab)
To get around not being able to access the proper text box, you can maintain them in a list(*) (or some other collection) and refer to the one associated with the currently active tab. For this, you will have to create an event listener to see which tab is activated currectly.
(*) as opposed to having only one
OK you need to create fresh instances of the RichTextBox rathere than trying to add the same instance to each tab.
TabControl tbcEditor = new TabControl();
//Get rid off this line --- TabPage tbPage = new TabPage();
//Get rid off this line --- RichTextBox rtb = new RichTextBox();
List<TabPage> _tabs = new List<TabPage>();
List<RichTextBox> _tbx = new List<RichTextBox>();
private void frmTextEditor_Load(object sender, EventArgs e)
{
Controls.Add(tbcEditor);
tbcEditor.Dock = DockStyle.Fill;
AddNewTab();
}
private void newToolStripMenuItem_Click(object sender, EventArgs e)
{
AddNewTab();
}
private void AddNewTab()
{
//TabPage
var tbPage = new TabPage();
_tabs.Add(tbPage);
//RichTextBox
var rtb = new RichTextBox();
_tbx.Add(rtb);
tbPage.Controls.Add(rtb);
rtb.Dock = DockStyle.Fill;
tbcEditor.TabPages.Add(tbPage);
}
This simply add both the tab and the rtb to a collection which can be accessed by index (can also use Dictionary for named access etc). There are other ways of course, including just nameing the components and looping through for them when required etc.

Categories