|
You'll have to invoke this, so it's executed in the context of the UI Thread. Take a look at the documentation for the Control.Invoke[^] method.
www.troschuetz.de
|
|
|
|
|
The easiest way is to let the UI thread do the display. Here is an example of how I handle an event fired from a working thread in my code. I learned this technique from a set of excellent articles by Chris Sells on MSDN. The key is using the forms InvokeRequired property and Invoke method.
private void RaiseProgram(object sender, EventArgs args)
{
if (InvokeRequired)
{
object[] objs = new object[]{sender,args};
this.Invoke(new EventHandler(RaiseProgram),objs);
return;
}
textBox1.Text = RunOnce.OtherAttemptCount.ToString();
if (this.WindowState == FormWindowState.Minimized)
{
this.WindowState = FormWindowState.Normal;
}
RunOnce.BringFormToFront(this);
}
|
|
|
|
|
I have created an application. Here I am giving the code for the form file in the application in which I am trying to show a new form when the timer expires after 2 seconds. But the form is not displayed properly. When the button on the form is clicked it properly shows a new form. So please let me know what is going wrong here?And how to correct that.
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Timers;
using System.Threading;
using System.Windows.Forms.Design;
namespace WindowsApplication1
{
public class Form1 : System.Windows.Forms.Form
{
private System.Windows.Forms.Button button1;
private System.ComponentModel.Container components = null;
public Form1()
{
InitializeComponent();
}
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
#region Windows Form Designer generated code
private void InitializeComponent()
{
this.button1 = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// button1
//
this.button1.Location = new System.Drawing.Point(120, 152);
this.button1.Name = "button1";
this.button1.TabIndex = 0;
this.button1.Text = "button1";
this.button1.Click += new System.EventHandler(this.button1_Click);
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(292, 266);
this.Controls.Add(this.button1);
this.Name = "Form1";
this.Text = "Form1";
this.ResumeLayout(false);
}
#endregion
///
/// The main entry point for the application.
///
[STAThread]
static void Main()
{
// Create a new Timer with Interval set to 2 seconds.
System.Timers.Timer aTimer = new System.Timers.Timer(2000);
aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
// Only raise the event the first time Interval elapses.
aTimer.AutoReset = false;
aTimer.Enabled = true;
Form1 oForm1 = new Form1();
Application.Run(oForm1);
}
// Specify what you want to happen when the event is raised.
private static void OnTimedEvent(object source, ElapsedEventArgs e)
{
Form1 oForm1 = new Form1();
oForm1.Show();
}
private void button1_Click(object sender, System.EventArgs e)
{
//fnCreate();
Form1 oForm1 = new Form1();
oForm1.Show();
}
}
}
|
|
|
|
|
You are having a UI Threading problem. This will fix your current issue but I don't like the whole solution.
You are very dependent upon the line Application.Run(). That is where the UI thread enters the message loop. I would make the timer dependent upon the creation of Form1. It would still have to be static so that you do not create another each time the form loads. I am not quite sure what you are trying to accomplish so I didn't change your current pattern too much here.
static Form1 mainWindow = null;
[STAThread]
static void Main()
{
System.Timers.Timer aTimer = new System.Timers.Timer(2000);
aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
aTimer.AutoReset = false;
aTimer.Enabled = true;
mainWindow = new Form1();
Application.Run(mainWindow);
}
private static void OnTimedEvent(object source, ElapsedEventArgs e)
{
if (mainWindow != null)
{
mainWindow.button1_Click(mainWindow,EventArgs.Empty);
}
}
private void button1_Click(object sender, System.EventArgs e)
{
if (InvokeRequired)
{
object[] objs = new object[]{sender,e};
this.Invoke(new EventHandler(button1_Click),objs);
return;
}
Form1 oForm1 = new Form1();
oForm1.Show();
}
|
|
|
|
|
Thank you for the help. That worked perfectly. I know that the application I have created was very crude one but it was the one to help me in the real problem.
Actually as I had written in the first mail that I was having problem to create form when I get the chat request in a chat application where I was unable to diplay the form properly. It worked when I made some changes getting the information from your help. Thanks again.
|
|
|
|
|
Glad I could help - I learned from the master Chris Sells. He has written a series of 3 articles on the subject for Microsoft. They are very clear and understandable.
Search for: "Safe, Simple Multithreading in Windows Forms"
on: msdn.microsoft.com
|
|
|
|
|
i'm doing a test program and i have many variables.
i looking for a way to classifed the variable according to multi subject
for example: var (x,y,z,w)
group PA : variable related - x,y;
group PLL : variable related - y,w;
group Attenuator : variable related - x,z;
|
|
|
|
|
Hy,
I want to create a Remoting server but all examples I've found shows
how to create a console application. I want my server in a windows service.
The problam is that the process has to be running after the command
RemotingConfiguration.Configure(); and I cannot use Console.readline().
Anyone could show me an example of how to create a .NET Remoting Server using a windows service.
Thanks.
|
|
|
|
|
Hi!
It doesn't matter whether the service is run as a console application or as a windows service.
The only reason for Console.ReadLine() in the samples you've found is that otherwise the application immediately quits and the server will be disposed off.
When you're doing the exact same things in a windows service, the executable is running while the service is running and the remoting server can be shut down by stopping the service.
Configure your remoting server in the Start event of your service and you should be fine.
Regards,
mav
|
|
|
|
|
I actually did this and it works fine, but I ran into one additional problem. I am using a singleton object with essentially an infinite life time. When the service is stopped, The system still seems to think the remote object is registered and allows a proxy to be generated. Now when the client uses the proxy, it get's an exception. I can't find an unregister function in the remoting class. Is there anyway to make the remote object go completely away?
C LaMorticella
Client Instant Access
|
|
|
|
|
Hi
I'm a beginner, but this should still be a simple task. I want to insert some data to my access database. I can run my project, but when I try to insert the data this error message appears: "Operation must use an updateable query"
This is my code:
OleDbConnection conInsertNews;
string strInserNewst;
OleDbCommand cmdInsert;
conInsertNews = new OleDbConnection( "PROVIDER=Microsoft.....);
strInsertNews = "INSERT INTO Test ( Name, Number, Adress ) VALUES ( 'Bob' , '8' , 'Str A' )";
cmdInsertNews = new OleDbCommand( strInsertNews, conInsertNews );
conInsertNews.Open();
cmdInsertNews.ExecuteNonQuery();
conInsertNews.Close();
Can anyone help me with this?
Thanks!!
Searcher
|
|
|
|
|
Okay i'm new to databinding and need to learn how to get information from the database, heres my code, howcome nothing gets returned?
<%@ Page language="c#" Codebehind="SalesLeadsLogin.aspx.cs" AutoEventWireup="false" Inherits="SalesLeadManagement.SalesLeadsLogin" %><br />
<%@ Import Namespace="System.Data" %><br />
<%@ Import Namespace="System.Data.OleDb" %><br />
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" ><br />
<HTML><br />
<HEAD><br />
<title>Colley's Sales Lead Management</title><br />
<meta content="Microsoft Visual Studio .NET 7.1" name="GENERATOR"><br />
<meta content="C#" name="CODE_LANGUAGE"><br />
<meta content="JavaScript" name="vs_defaultClientScript"><br />
<meta content="http://schemas.microsoft.com/intellisense/ie5" name="vs_targetSchema"><br />
<script language="C#" runat="server"><br />
protected void Page_Load(Object sender, EventArgs e)<br />
{<br />
OleDbConnection LoginConnection = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\salesleadmgmt.mdb");<br />
OleDbDataAdapter LoginCommand = new OleDbDataAdapter("select * from UsrInfo" ,LoginConnection);<br />
<br />
<br />
DataSet LoginSet = new DataSet();<br />
LoginCommand.Fill(LoginSet, "UsrInfo");<br />
<br />
LoginGrid.DataSource=LoginSet.Tables["UsrInfo"].DefaultView;<br />
LoginGrid.DataBind();<br />
}<br />
<br />
<br />
</script><br />
</HEAD><br />
<body MS_POSITIONING="GridLayout"><br />
<form id="Form1" runat="server"><br />
<br />
<asp:DataGrid id="LoginGrid" style="Z-INDEX: 105; LEFT: 408px; POSITION: absolute; TOP: 256px"<br />
runat="server" BackColor="#6699CC"></asp:DataGrid></P><br />
</form><br />
</body><br />
</HTML>
|
|
|
|
|
Try replacing
fortyonejb wrote:
LoginGrid.DataSource=LoginSet.Tables["UsrInfo"].DefaultView;
with
LoginGrid.DataSource=LoginSet.Tables[0];
Also, are you certain that there is data in this table ?
Christian
I have several lifelong friends that are New Yorkers but I have always gravitated toward the weirdo's. - Richard Stringer
|
|
|
|
|
Hi Sreejith
Thanks for your help. I have looked at your article, and although very interesting, does address my question entirely.
As well as iterating through my custom class collection, I would also like to have the Add, Remove and Item fucntions available to me too.
Is that something which can be easily incorporated into your Example2?
M
|
|
|
|
|
Enumerators only allow reading the data in the collection. Enumerators cannot be used to modify the underlying collection
An enumerator remains valid as long as the collection remains unchanged. If changes are made to the collection, such as adding, modifying or deleting elements, the enumerator can be invalidated and the next call to MoveNext or Reset can throw an InvalidOperationException.
But don't worry give me some hours, sure i will comeout with an idea.
Sreejith Nair
[ My Articles ]
|
|
|
|
|
Enumerators only allow reading the data in the collection. Enumerators cannot be used to modify the underlying collection
An enumerator remains valid as long as the collection remains unchanged. If changes are made to the collection, such as adding, modifying or deleting elements, the enumerator can be invalidated and the next call to MoveNext or Reset can throw an InvalidOperationException.
Sreejith Nair
[ My Articles ]
|
|
|
|
|
Hello,
How can I delete a string-value (NVarChar Type) in an easy manner from a Sql Database? I think the SQL Statements looks like - DELETE columnname FROM tablename WHERE Email=?
But how does look like the programm code?
Regards
mat
|
|
|
|
|
Hello,
I'm writing a custom DataGrid and in it i want to have some default actions occur. For example, what I have now, I cannot edit any rows (I only select full rows), multi-row selection is allowed, and the delete key will delete all currently selected rows.
But then there's this weird factor. When I press the up arrow key, I want my currently selected row to move to the previous one (the general case), and vice versa when I press the down key. But when I push Up, Down, Left, and Right (along with some other different keys), the KeyDown event handler for the DataGrid isn't called. Instead, the column style Edit event handler is called.
I thought I could just create a new event that would call an event handler from inside the Edit handler; however I would have no means to send off which key was pressed.
Does anyone know how to do this? I've been thinking about this and searching for what I need to override in order to do this, but to no avail. Can anyone help?
RockmanHero2003
A stitch in time is worth....two....in the bush
|
|
|
|
|
I have a Custom TextBox based on a Textbox. In my control I have a virtual method ValidTextBox. Now when I put my Textbox on a form I want to override the ValidTextBox method. I tried it but I got the error:"no suitable method found to override"
Can anyone tell me how to do this?
|
|
|
|
|
That is because the form is not a base class of the control. In order to override a method you must inherit from the class in which the method exists.
What is it that you want to do? I'm trying to think what you would want to do in a form that would require you to override a method on a control. The only thing I can come up with is handle some event. In this case a validation event. If you created an event that you handled in your form would you be able to introduce the same functionality that you want?
Do you want to know more?
Vogon Building and Loan advise that your planet is at risk if you do not keep up repayments on any mortgage secured upon it. Please remember that the force of gravity can go up as well as down.
|
|
|
|
|
The thing I want to do is validate the textbox. I created a ValidTaxtbox method that always returns true. The idea is that when you use the textbox, you write a new method for that textbox with the actual valid code.
|
|
|
|
|
Unless by "use" you mean you want to derive different types of ValidTextBox, then you really need to set up an event and handle the event in your form.
Do you want to know more?
Vogon Building and Loan advise that your planet is at risk if you do not keep up repayments on any mortgage secured upon it. Please remember that the force of gravity can go up as well as down.
|
|
|
|
|
Can you please explain that a bit?
I am very new at this and I just want to put the control on my form and write a validtextbox method each time I use it.
|
|
|
|
|
In your ValidTextBox class create an event, e.g.
public event EventHandler ValidateTextBox;
Then when you need to trigger the event you can write
this.ValidateTextBox(this, new EventArgs());
On your form you can then add a handler for the event, just like a handler for any other event with something like
myValidTextBox.ValidateTextBox+=new EventHandler(ObjectName_EventName); Normally, after the += I just usually let intellisense take over and I just hit tab twice, the first time to complete this statement, the second time to create a method stub for the event handler.
Now, I would guess that you don't want the default EventHandler because it doesn't allow you to pass much information - just the sender (the object that triggered the event), so you might want to set up a delegate . This sits outside the class
public delegate void ValidateDelegate(object sender, ValidateTextBoxArgs e); The ValidateDelegate here would replace EventHandler in the example above
You will also need to create a class that is derived from System.EventArgs , which above I've called ValidateTextBoxArgs
There are many source of information on this. If you need a step-by-step tutorial searching on the keywords delegate and event in msdn will likely turn up something useful - and I'm sure it will explain it better than I have done here.
Do you want to know more?
Vogon Building and Loan advise that your planet is at risk if you do not keep up repayments on any mortgage secured upon it. Please remember that the force of gravity can go up as well as down.
|
|
|
|
|
Thanks for explaining, I'll have a closer look.
|
|
|
|