I am working on WinForms UI and we have a requirement where we need to add repeating controls dynamically.
I managed to create a UserControl with all labels and text boxes and adding them like this:
for (int i= 0; i < 4;i ++) {
tableLayoutPanel1.Controls.Add(new MyUserControl(),1,1);
//1,1 represent 1st row, 1st column of tablelayoutpanel
}
Now I am not able to find a way to bind different data to each control. For example: I need to display different contact information in each textbox every time a new user control is added. But since its the same UserControl, the textbox and labels have the same name and i am not sure how to bind different data using same UserControl.
I need something like this: I am able to add controls repeatedly, but not able to bind data:
Screenshot
Any help would be greatly appreciated.
If you are creating custom user-controls. You can provide data-binding capabilities for your likes. You could use a parameter in the constructor to pass data in:
public MyUserControl(MyData mydata):this()
{ ...
}
You can provide a property, to set the required data later:
public class MyUserControl()
{
...
public MyData MyDataSource {get;set;}
}
You cold pass in a function to collect data:
public MyUserControl(func<MyData> mydata):this()
{
}
Or some sort of service to retrieve the data:
public MyUserControl(IMyService myService):this()
{
Textbox1.Text = myService.GetImportantText();
}
If MyData implements INotifyPropertyChanged (or any custom event), you will be able react to data changes and display them.
I guess you know how many controls need to be created. If yes, you know also why and which data you need provide.
An Example of adding the UserControl
to the TableLayoutPanel
for (int nCount = 0; nCount < 2; nCount++)
{
CheckUserControl uc = new CheckUserControl();
//If required Assign Value to the control
uc.strValue = "Item " + nCount;
uc.strTag = nCount.ToString();
//You can pass the Column and Row value dynamically
tableLayoutPanel1.Controls.Add(uc, 1, 1);
}
Now you can use Tag Value to bind the data to the appropriate UserControl