Home | Contact Us | FAQ | Search & Site Map | Link to Us
Sign In | Join | Other 45 Sites in Network
HomeAnnouncementsFree MagazinesWhite PapersSubmit Content
Discussion GroupsASP.NETWindows FormsLanguages.NET FrameworkVisual Studio.NET
Articles.NET FrameworkASP.NETToolsWindows Forms
.NET DirectoryOpen Source ProjectsUser GroupsWeb Resources
Related Topics
Visual Basic 6SQL ServerMS AccessOther DB ProductsMS Server ProductsMore Topics ...

.NET Forum / Languages / C# / May 2007

Tip: Looking for answers? Try searching our database.

Create C# controls names at runtime

Thread view: 
Enable EMail Alerts  Start New Thread
Thread rating: 
Matt - 02 May 2007 13:18 GMT
Hi all,

I'm trying to create a system where it reads a number of records from
a database and then creates a row in the GUI that contains a single
field from the database and a button that has a reference to the
record.  This way, once the task has been accomplished, the button can
be pressed next to the field and a time-stamp is placed into the
database.

Can anyone point me in the direction of either a tutorial or
documentation that may help me achive this?

Thanks,

Matt
Fred Mellender - 02 May 2007 13:33 GMT
I'm not sure I understand your question, but perhaps this will help:

I suggest you create the button and text statically, in the GUI builder.
Then study the code it generated in form.designer.cs.  Copy that code (with
obvious modifications) to your application to dynamically create the
controls as triggered by your application logic.

> Hi all,
>
[quoted text clipped - 11 lines]
>
> Matt
Matt - 02 May 2007 13:41 GMT
On 2 May, 13:33, "Fred Mellender" <nospamPlease_fr...@frontiernet.net>
wrote:
> I'm not sure I understand your question, but perhaps this will help:
>
[quoted text clipped - 18 lines]
>
> > Matt

Fred,

Thanks for the reply, I'll try and explain a bit better!

Basically, what I want to end up with is a grid as follows:

ROW1  description of task [button1]
ROW2  description of task [button2]
ROW3  description of task [button3]
...

Ideally, what I'd like to do is name the button after the task id from
the database.  I've just discovered that I can rename buttons on the
fly, so I think that the following may work:

Button btn = new Button();
btn.name = dr[0]; // set the button name to the first column in the
data row

the question is, how do I then create the function to fire the data
into the database?

Matt.
Matt - 02 May 2007 13:49 GMT
On 2 May, 13:41, Matt <matthew.macdonald-wall...@fujifilmsericol.com>
wrote:
> On 2 May, 13:33, "Fred Mellender" <nospamPlease_fr...@frontiernet.net>
> wrote:
[quoted text clipped - 49 lines]
>
> Matt.

OK, I now have the data being red into a datarow which then creates
the row for a tableLayoutPanel to allow me to adjust the rows etc.

The code I currently have for the tableLayoutRow is as follows:

foreach (DataRow dr in dra)
           {

           // create the label
               Label taskDesc = new Label();
               taskDesc.Width = 500;
               // create the button
               Button btn = new Button();
               btn.Text = "Complete Task";
               btn.Name = "btn"+dr[0].ToString();
               MessageBox.Show("Btn name = " + btn.Name);
               taskDesc.Text = dr[1].ToString();
               tlop.Controls.Add(taskDesc,0,i);
               //tlop.Controls.Add(btn+dr[0].ToString(),1,i);
               i++;
           }

Where tlop is the tableLayoutPanel  The issue I am having is when it
comes to adding the button to the panel (the commented out line) I get
an error that I cannot convert an object to a control.  The variable
is showing up as btn1, btn2 etc but I can't read it into the tlop!

Help!

Matt
Fred Mellender - 02 May 2007 15:50 GMT
The Add function does not want the name of the button, but the button
itself, as in:

       Controls.Add(btn);

To add the function that handles the click event, first code the function in
the form's class.  Suppose its name is "myClick".  Then after you create the
button, add the code:

   btn.Click += new System.EventHandler(myClick);

again, if you study the code generated by VS, you will see code for your
statically defined controls that you can use as a template.

> OK, I now have the data being red into a datarow which then creates
> the row for a tableLayoutPanel to allow me to adjust the rows etc.
[quoted text clipped - 26 lines]
>
> Matt
Matt - 02 May 2007 16:02 GMT
On 2 May, 15:50, "Fred Mellender" <nospamPlease_fr...@frontiernet.net>
wrote:
> The Add function does not want the name of the button, but the button
> itself, as in:
[quoted text clipped - 40 lines]
>
> > Matt

Fred, that's great but how do I create the control in the first place
if the parameter for controls.add() changes with every row?

I understand the concepts of creating a button, I just don't know how
to create a button then name it dynamically.
Fred Mellender - 02 May 2007 18:42 GMT
Each button need not have a separate *variable* name used to create it.
I.E. you are creating one *new* button with the
       Button btn = new Button();
each time you go through the loop.  Just do all the work for that button
(using the "btn" variable) inside the loop.  Once you add it via the
Controls.Add statement, one new button is attached to the form.  When you
are done with the loop, you have created many new buttons, all via the
variable "btn" (which is different, conceptually, than the button's Name).

However, you may wish to clean up the buttons the next time through your
function (or, you can just let the gc collect them and it will call
Dispose()).  In the former case, you should/could save the buttons as you
create them, in an array (declared (as a variable) in the Form class you are
creating):

       List<Button> myButtons = null;

Then, just before you *enter* the loop:

       if (myButtons != null)
       {
           foreach (Button myButton in myButtons)
               myButton.Dispose();
       }
       myButtons = new List<Button>(10);

then inside the loop, in addition to your existing statements, place:
               myButtons.Add(btn);

If you want to do something else with the buttons, outside the loop
(although I don't know why you would), you can get at them via the
"myButtons" variable.

> On 2 May, 15:50, "Fred Mellender" <nospamPlease_fr...@frontiernet.net>
> wrote:
[quoted text clipped - 50 lines]
> I understand the concepts of creating a button, I just don't know how
> to create a button then name it dynamically.
Ignacio Machin ( .NET/ C# MVP ) - 02 May 2007 16:36 GMT
Hi,

> Hi all,
>
[quoted text clipped - 4 lines]
> be pressed next to the field and a time-stamp is placed into the
> database.

Would it work for you having a button outside the listview ?
IMHO this is much easy to implement, faster to execute and do not use a lot
of buttons int he interface.

You could use the Tag property of the listviewitem to keep track of the
record in question:

foreach( DataRow row in GetRows.......)
{
   ListViewItem lvi = new ...
  lvi.Tag = row;
 ....
}

void TimeStamp_Onclick( ... )
{
  DataRow row =  (DataRow) listView1.Items[
listView1.SelectedIndices[0]].Tag;
}

Free Magazines

Get these publications absolutely FREE for up to 12 months. There are no hidden fees and no obligation. Simply choose a title, complete the application form and submit it. Read more ...

Oracle MagazineNetwork ComputingComputer WorldBio-IT WorldeWeekInformation WeekInfosecurity
 
Sign In
Join
My Latest Posts
My Monitored Threads
My Blog
My Photo Gallery
My Profile
My Homepage

Start New Thread
Enable EMail Alerts
Rate this Thread



©2008 Advenet LLC   Privacy Policy - Terms of Use
This website includes both content owned or controlled by Advenet as well as content owned or controlled by third parties.