A timer func problem???

C

Cem Louis

Hi,

I have the below code which runs after choosing an item from the
listbox (choose the first one). Goes to the below item after 5 seconds
and then goes to another after 5 sec again... So here is my question:
I have a func which I named as process() I want to run this func only
once when each item is selected in the listbox? So how can I do
that???

Thank you,
Cem Louis

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Timers;
using System.Threading;

namespace WindowsApplication14
{
///
/// Summary description for Form1.
///
public class Form1 : System.Windows.Forms.Form
{
private System.Windows.Forms.ListBox listBox1;
private System.Windows.Forms.Button button1;
private System.Timers.Timer timerClock = new System.Timers.Timer();
///
/// Required designer variable.
///
private System.ComponentModel.Container components = null;

public Form1()
{
//
// Required for Windows Form Designer support
//
InitializeComponent();
InitializeTimer();

//
// TODO: Add any constructor code after InitializeComponent call
//
}

public void InitializeTimer()
{
this.timerClock.Elapsed += new ElapsedEventHandler(OnTimer);
this.timerClock.Interval = 5000;
}

///
/// Clean up any resources being used.
///
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}

#region Windows Form Designer generated code
///
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
///
private void InitializeComponent()
{
this.listBox1 = new System.Windows.Forms.ListBox();
this.button1 = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// listBox1
//
this.listBox1.Location = new System.Drawing.Point(8, 8);
this.listBox1.Name = "listBox1";
this.listBox1.Size = new System.Drawing.Size(120, 95);
this.listBox1.TabIndex = 0;
//
// button1
//
this.button1.Location = new System.Drawing.Point(8, 112);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(120, 23);
this.button1.TabIndex = 1;
this.button1.Text = "Run";
this.button1.Click += new System.EventHandler(this.button1_Click);
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(136, 142);
this.Controls.Add(this.button1);
this.Controls.Add(this.listBox1);
this.Name = "Form1";
this.Text = "Form1";
this.Load += new System.EventHandler(this.Form1_Load);
this.ResumeLayout(false);

}
#endregion

///
/// The main entry point for the application.
///
[STAThread]
static void Main()
{
Application.Run(new Form1());
}

private void Form1_Load(object sender, System.EventArgs e)
{
listBox1.Items.Add("Arthur");
listBox1.Items.Add("Alex");
listBox1.Items.Add("Amie");
listBox1.Update();
}

private void OnTimer(object source, ElapsedEventArgs e)
{
this.nextvalue(this.listBox1.SelectedIndex);
}

private void button1_Click(object sender, System.EventArgs e)
{
if(this.listBox1.SelectedItem!=null)
{
this.timerClock.Start();
}
else
{
MessageBox.Show("Select an Item");
}
}

private void nextvalue(int currentPosition)
{
if(currentPosition+1<=this.listBox1.Items.Count-1)
{
this.listBox1.SetSelected(currentPosition+1,true);
}
else
{
this.timerClock.Stop();
}
}

private void process()
{
// Does something in an 5 second interval
// Must run once
}
}
}
 
N

Nick Malik

Hi Cem,

The simple answer is:
Change:
private void OnTimer(object source, ElapsedEventArgs e)
{
this.nextvalue(this.listBox1.SelectedIndex);
}

to:
private void OnTimer(object source, ElapsedEventArgs e)
{
this.process();
this.nextvalue(this.listBox1.SelectedIndex);
}

The more complex answer is: why are you using the user interface to drive
internal logic? If you really need to insure that the process only happens
once, then when the button is clicked, you would copy the contents of the
list into an internal collection. Then, at each interval, you would pull
the top item off of the collection, select it in the listbox, and run the
process. Discard the item from the internal list when you are done.

That way, if the user clicks around in the listbox, it won't matter... you
will always invoke the items in the correct order, starting from the correct
place, no matter what the user does during the interval.

Is this a homework assignment?
--- Nick

Cem Louis said:
Hi,

I have the below code which runs after choosing an item from the
listbox (choose the first one). Goes to the below item after 5 seconds
and then goes to another after 5 sec again... So here is my question:
I have a func which I named as process() I want to run this func only
once when each item is selected in the listbox? So how can I do
that???

Thank you,
Cem Louis

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Timers;
using System.Threading;

namespace WindowsApplication14
{
///
/// Summary description for Form1.
///
public class Form1 : System.Windows.Forms.Form
{
private System.Windows.Forms.ListBox listBox1;
private System.Windows.Forms.Button button1;
private System.Timers.Timer timerClock = new System.Timers.Timer();
///
/// Required designer variable.
///
private System.ComponentModel.Container components = null;

public Form1()
{
//
// Required for Windows Form Designer support
//
InitializeComponent();
InitializeTimer();

//
// TODO: Add any constructor code after InitializeComponent call
//
}

public void InitializeTimer()
{
this.timerClock.Elapsed += new ElapsedEventHandler(OnTimer);
this.timerClock.Interval = 5000;
}

///
/// Clean up any resources being used.
///
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}

#region Windows Form Designer generated code
///
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
///
private void InitializeComponent()
{
this.listBox1 = new System.Windows.Forms.ListBox();
this.button1 = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// listBox1
//
this.listBox1.Location = new System.Drawing.Point(8, 8);
this.listBox1.Name = "listBox1";
this.listBox1.Size = new System.Drawing.Size(120, 95);
this.listBox1.TabIndex = 0;
//
// button1
//
this.button1.Location = new System.Drawing.Point(8, 112);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(120, 23);
this.button1.TabIndex = 1;
this.button1.Text = "Run";
this.button1.Click += new System.EventHandler(this.button1_Click);
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(136, 142);
this.Controls.Add(this.button1);
this.Controls.Add(this.listBox1);
this.Name = "Form1";
this.Text = "Form1";
this.Load += new System.EventHandler(this.Form1_Load);
this.ResumeLayout(false);

}
#endregion

///
/// The main entry point for the application.
///
[STAThread]
static void Main()
{
Application.Run(new Form1());
}

private void Form1_Load(object sender, System.EventArgs e)
{
listBox1.Items.Add("Arthur");
listBox1.Items.Add("Alex");
listBox1.Items.Add("Amie");
listBox1.Update();
}

private void OnTimer(object source, ElapsedEventArgs e)
{
this.nextvalue(this.listBox1.SelectedIndex);
}

private void button1_Click(object sender, System.EventArgs e)
{
if(this.listBox1.SelectedItem!=null)
{
this.timerClock.Start();
}
else
{
MessageBox.Show("Select an Item");
}
}

private void nextvalue(int currentPosition)
{
if(currentPosition+1<=this.listBox1.Items.Count-1)
{
this.listBox1.SetSelected(currentPosition+1,true);
}
else
{
this.timerClock.Stop();
}
}

private void process()
{
// Does something in an 5 second interval
// Must run once
}
}
}
 
C

Cem Louis

Hi Nick,

I tried your simple solution but it doesn't work because I am running a
webrequest in my process function (taking db values of my website)
process func runs several times I want it to run only once... And your
second solution is a bit complex for me... Can you make it simpler for
me? If you have time can you send a sample?

Thank you for your attention,
Cem Louis
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top