|
Most - if not all - of the Windows Forms controls provided by the .NET Framework do not use the event name as the field name. Please use ildasm.exe installed with the .NET Framework SDK to see what the fields are.
Take the add_TextChanged method (the add accessor method for the Control.TextChanged event):
.method public hidebysig specialname instance void
add_TextChanged(class [mscorlib]System.EventHandler 'value') cil managed
{
.maxstack 8
IL_0000: ldarg.0
IL_0001: call instance class [System]System.ComponentModel.EventHandlerList [System]System.ComponentModel.Component::get_Events()
IL_0006: ldsfld object System.Windows.Forms.Control::EventText
IL_000b: ldarg.1
IL_000c: callvirt instance void [System]System.ComponentModel.EventHandlerList::AddHandler(object,
class [mscorlib]System.Delegate)
IL_0011: ret
} You can use ildasm.exe (or an application like .NET Reflector that can also decompile source code) to view the System.ComponentModel.EventHandlerList, System type.
This posting is provided "AS IS" with no warranties, and confers no rights.
Software Design Engineer
Developer Division Customer Product-lifecycle Experience
Microsoft
[My Articles] [My Blog]
|
|
|
|
|
Thanks a lot for your help.
But when I checked it in ILDASM, I found that each control uses different standards. For e.g. for SelectedIndexChanged has a filed called EVENT_SELECTEDCHANGED. So the generic code that I am thinking of may not work properly. Pls advise.
|
|
|
|
|
A better question would be, what are you trying to do anyway? There may be better ways to solve your problem. For example, if you don't want event handlers to fire under a certain condition, use a state variable and don't run all or the brunt of your event handler code if that state variable is set. If you have a lot of code to synchronize you might use Monitor.TryEnter against a singleton used by the entire application.
This posting is provided "AS IS" with no warranties, and confers no rights.
Software Design Engineer
Developer Division Customer Product-lifecycle Experience
Microsoft
[My Articles] [My Blog]
|
|
|
|
|
Here is my problem:
I need a way to encode X and Y (can be negative numbers and equals) to return me a N integer number always diferent.
(x=2,y=2) = N
(x=-2,y=2) = different N
(x=0,y=0) = another different N
Understand me? Anyone can help me? Thanks in advanced!
|
|
|
|
|
Hi,
If you're trying to get a unique 32 bit number from two other 32 bits numbers, it can't be done otherwise you'd be able to invent an infinite compression algorithm. ie. you give me 32 bits and somehow I'll decode it to 64 (2x32).
What about making N a long (64-bits) and using casting and bit shifting to put the the first integer in the lower 32 bits and the second in the upper 32 bits?
Rgds,
Rob Philpott.
|
|
|
|
|
Or just define a struct, which is a value type and, hence, will always be different. By default Equals returns true if the values of all members are the same:
using System;
struct N
{
public int X;
public int Y;
public N(int x, int y)
{
X = x;
Y = y;
}
public override string ToString()
{
return "[X=" + X + ", Y=" + Y +"]";
}
}
class Test
{
static void Main()
{
N n1 = new N(2, 2);
N n2 = new N(-2, 2);
N n3 = new N();
Console.WriteLine("n1 = " + n1);
Console.WriteLine("n2 = " + n2);
Console.WriteLine("n3 = " + n3);
Console.WriteLine("n1.Equals(n1): " + n1.Equals(n1));
Console.WriteLine("n1.Equals(n2): " + n1.Equals(n2));
}
}
This posting is provided "AS IS" with no warranties, and confers no rights.
Software Design Engineer
Developer Division Customer Product-lifecycle Experience
Microsoft
[My Articles] [My Blog]
|
|
|
|
|
Problem is:
1. I have to, in some way, save points (x,y) to a skiplist
2. I've to search for that point in that skiplist and return true if is in it otherwise false.
3. But how can I search for a point that is not a single integer? How can I compare if it's higher or lower to go to next node?
|
|
|
|
|
It's you're type - define it however you need to. You could, for example (and consistency), implement IComparable based on whatever logic you wish (like X takes precedence over Y). The other reply you got already implies that by pushing X into the upper 32 bits and Y into the lower 32 bits. That means X takes precedence because it cares greater value. That'd really be no different than something like this:
struct N : IComparable
{
int IComparable.CompareTo(object obj)
{
if (obj == null) throw new ArgumentNullException("obj");
if (obj.GetType() != GetType()) throw new ArgumentException();
N n = (N)obj;
if (X == n.X)
{
return n.Y - Y;
}
else
{
return n.X - X;
}
}
}
This posting is provided "AS IS" with no warranties, and confers no rights.
Software Design Engineer
Developer Division Customer Product-lifecycle Experience
Microsoft
[My Articles] [My Blog]
|
|
|
|
|
Ok, so if you happen to read my previous post from today you will see that i'm trying to push about .5M to a db...
I have to do this by use of a service, and currently i'm having difficulty getting the service to start within the time limit that windows places on starting a service...
So...
How should i start the service...place it into service, and have it parse any data that is currently awaiting to be sent?
maybe a better way to ask this is to say::: i need to place my service into operation, have it register as started THEN begin pushing the data over to the db... currently if i start the service with data waiting the service fails, because it can't start quick enough, becasuse its still reading the data in the logs.
please note that if the log is empty the service starts fine...and runs acording to plan as i begin to populate the log file...however if i have already have data in the log then it will time-out on start up because it is still reading the data.
Please help....
string Beautiful;
Beautiful = "ignorant";
label1.Text = "The world is full of " + Beautiful +" people.";
Why is common sense such an un-common comodity?
|
|
|
|
|
ServiceBase.OnStart and ServiceBase.OnStop are meant for initialization and destruction of your service, respectively. They should be as fast as possible, as you've seen. Instead, push all work into a separate thread and simply start the thread.
class MyDbService : ServiceBase
{
public override void OnStart(string[] args)
{
Thread t = new Thread(new ThreadStart(UpdateDb));
t.Name = "Db Updater";
t.Start();
}
public override void OnStop()
{
}
void UpdateDb()
{
}
} You might also consider using a ThreadPool and splitting up units of work based on your inputs and number of connections available from the client to the database. If the database implements connection pooling (depends on connection string options, typically) and a client can open a number of connections to the same database you could get a lot of performance boosts this way.
This posting is provided "AS IS" with no warranties, and confers no rights.
Software Design Engineer
Developer Division Customer Product-lifecycle Experience
Microsoft
[My Articles] [My Blog]
|
|
|
|
|
Hello....
I'm stuck on a piece of logic that i'm sure is pretty simple but i've been thinking about it so long now that my mind has literally stopped working....
With that said...
I am writing events to a log file that i then need to turn around and once a day backup-or move to the db.
Once i begin moving to the db i need to parse the separate fields (date/time, user, event message, priority, etc) into separate columns.
Yes, I am fully aware that it would be easier to just write it to the db from the begining...but every action we call is already going to the db so it doesn't need to be contending with event logs.
So, due to the format of my log files i need to read until "- - " for instance: {username}- -{Event Message}- -{etc...} i then need to send that data to the db to the independant columns.
This of course poses two problems, at least that i can see..first being how do i safely parse the string until i hit the "- - "(i am willing to change that to something more unique if necessary).
and Second...
how do i quickly deposit this to the db? I am doing this at night when 90% of our clients will be closed, but there is that small amount of sites that run 24/7, so it doesn't need to interupt their operations!!!
(oh, by the way i've got about 5 logs to send over and they normaly are 100+k each daily)
string Beautiful;
Beautiful = "ignorant";
label1.Text = "The world is full of " + Beautiful +" people.";
Why is common sense such an un-common comodity?
|
|
|
|
|
1. If you would reduce it to one special chcracter you can spplit the whole string via string.Split('|') into smaller pieces without having to parse anything.
2. The fastest way greatly depends on your database type. But rethink if you really want it fast: Is it probably better to make it a bit slower, so that the database or any other processes can also answer other requests in the meanwhile? For this a seperate thread with low priority could be usefull.
|
|
|
|
|
I wouldn't worry if you mean 100+KB per day, because that is quite small. If you mean 100+K records, then it could take a while. Just read each line, split it with split('- -'), and shove it into the database using a stored procedure. On a moderate single processor machine running sql server, you should easily get 1000 records per second. A very slow server may take up to 5 times longer.
Try the simple approach first, then optimize later. If you DO need to optimize, look to sending batches of inserts in each command, or passing your data as strings into a stored proc and parsing them out in there. Usually, these extremes are not necessary.
Simple approach:
StreamReader sr;
String str;
String[] arr;
String delim = "- -";
SQLCommand cmd;
SQLConnection cn;
//init connetion and command here and open connection
//open streamreader here
str = sr.ReadLine;
while (sr.Peek() >= 0)
{
arr = str.Split(delim.ToCharArray());
cmd.Parameters("@Param1").Value = arr[0];
...
cmd.ExecuteNonQuery();
}
cn.close;
sr.close;
|
|
|
|
|
Hi,
I am working on a project to come out with new ways of sending video streams over a network, and I was wondering if this scenario is possible in c#.
I load a avi file on a server using directx managed lib, send the video to the client threw tcp and read the sent data from memory without writing it to the HD pass it threw the some directx classes, and start playing the video before it is totally downloaded.
I am pretty good in network programming but have just started investigating video codec and playback
Any article, web site, book, tutorial, or code snippet would be greatly appreciated.
thx
|
|
|
|
|
I have just dabbed on this stuff, but AFAIK, you would need:
1. a stream compatible media, eg wmv, asf, mpeg2, mpeg. NOT a generic wrapped avi file, unless u can handle it somehow in part (2).
2. Input and output Directshow filters to handle the transport. Unfortunately I have not seen any source for things of this kind, but I have in some commercial products. It cant be that hard to write though, if you have some background knowledge.
I suggest you look at the DirectShow MSDN docs. They part of the Platform SDK docs.
And finally when you did it, write an article please I would love to see it in action!
xacc-ide 0.0.99-preview4 now with C#, C, IL, XML, Nemerle and Boo highlighting support!
|
|
|
|
|
Okay, I have a better question.
How do you make a dataset persist between page refreshes without executing your query over and over?
Thanks.
SD
|
|
|
|
|
Simplest approach I'd have thought was to store the dataset in the Session:
private void Page_Load(object sender, System.EventArgs e)
{
// try to retreive an existing dataset from the Session
DataSet dataSet = (DataSet)Session.Contents["myDataset"];
// if there isn't one
if (dataSet == null)
{
// create it
dataSet = new DataSet();
// populate the dataset
// ...
// add it to the session, ready for retrievel next time
Session.Contents.Add("myDataset", dataSet);
}
// do stuff with the dataset here
}
Rob Philpott
|
|
|
|
|
Rob,
thank you for the response. This sounds like exactly what I want. However, I tried this and I keep running into a problem. First, I whipped up a simple dataset in the Global.ASAX file. Then, I debugged it on a page load.
When my page loads, the localDS is set to a new DataSet (per the code snippets below); however, line 103 executes and the localDS becomes <undefined value="">. So, what do you think is wrong with...
???localDS = (DataSet)Session.Contents["ds"];
Is there something special that is done in the declaration of ds in the GLOBAL file?
Thanks.
William
protected void Session_Start(Object sender, EventArgs e)
{
DataSet ds = new DataSet();
DataRow dr;
ds.Tables.Add("Test");
ds.Tables[0].Columns.Add();
ds.Tables[0].Columns[0].ColumnName = "Name";
ds.Tables[0].Columns.Add();
ds.Tables[0].Columns[1].ColumnName = "ID";
dr = ds.Tables[0].NewRow();
dr[0] = "Test1";
dr[1] = 1;
ds.Tables[0].Rows.Add(dr);
dr = ds.Tables[0].NewRow();
dr[0] = "Test2";
dr[1] = 2;
ds.Tables[0].Rows.Add(dr);
...
100 private void Page_Load(object sender, System.EventArgs e)
101 {
102 DataSet localDS = new DataSet();
103 localDS = (DataSet)Session.Contents["ds"];
...
|
|
|
|
|
Your code doesn't show where the newly created Dataset in Session_Start is added to the Contents dictionary (the Session.Contents.Add line in my original reply) - you may have left that bit out the code snippet - how are you doing this?
If the dataset isn't being added to the dictionary after its populated, we can't access it later, so that might be the problem.
Also, in line 102 it makes no sense to construct a new dataset, because in the next line localDS is either going to end up (hopefully) referencing the pre-created dataset or null if it can't find it, not the new DataSet you create on line 102.
Rob Philpott.
|
|
|
|
|
Rob,
first, let me really thank you for assisting so much. Problem solved because of your additional questions...
Your right, line 102 wasn't useful...I was just grabbing at straws.
The answer was, I did not realize that you had to add the dataset to the session dictionary with an "alias" name in order to access it: Session.Contents.Add("Myds", ds);
Thank you again...the code below works fine!
William
private void Page_Load(object sender, System.EventArgs e)
{
DataSet localDS = (DataSet)Session.Contents["Myds"];
dd1.DataSource = localDS;
dd1.DataTextField = "Name";
dd1.DataValueField = "ID";
dd1.DataBind();
...
protected void Session_Start(Object sender, EventArgs e)
{
DataSet ds = new DataSet();
DataRow dr;
ds.Tables.Add("Test");
ds.Tables[0].Columns.Add();
ds.Tables[0].Columns[0].ColumnName = "Name";
ds.Tables[0].Columns.Add();
ds.Tables[0].Columns[1].ColumnName = "ID";
dr = ds.Tables[0].NewRow();
dr[0] = "Test1";
dr[1] = 1;
ds.Tables[0].Rows.Add(dr);
dr = ds.Tables[0].NewRow();
dr[0] = "Test2";
dr[1] = 2;
ds.Tables[0].Rows.Add(dr);
Session.Contents.Add("Myds", ds);
...
|
|
|
|
|
No problem - glad to help
Rob Philpott
|
|
|
|
|
I have a set of XML files that I parse & put into a dropdown list. I don't want to read this set of files off the network every time the page loads.
I was considering establishing a data set in the GLOBAL.ASAX file in the Session section.
I would just bind that dataset on the page load for this one dropdown where it occurs in the application. NOW, I know I will hear some "purist" objections to using anything that sounds like a global variable, but it seems far more efficient than reading 100+ XML files every time the page loads for every user.
I have tried creating a dataset in the Session_Start, but it isn't clear how I would access it.
Any thoughts?
Also, I am curios if there is an equivalent to a variable declared on a page in VB "Public Shared MyInt As Integer"?
Thanks.
SD
|
|
|
|
|
I found the answer to my tranlation question. There is a nice site that does translations back and forth between VB & C#: http://www.carlosag.net/Tools/CodeTranslator/Default.aspx; however, I would still be interested in any response to my GLOBAL question.
Thanks again,
Sd
|
|
|
|
|
Forget it. This was a bad question. I simply put a public dataset on the page of interest and read the XML into the dataset on if (!PostBack).
Thanks anyway.
Sd
|
|
|
|
|
I've written a small C# assembly which does MX/ANAME lookups on a DNS server to get a list of mail servers/IP addresses for a particular domain, but I'm having some bother in programmatically finding out the IP address of the DNS servers to query. Currently I've hardcoded the IP of two BT DNS servers after looking them up on my DSL router.
Is there a way to find out the IP address(es) of the computer's DNS servers in .NET, and in particular in managed code without resorting to P/Invoke as I try to make my code work with Mono. I've trawled the net and had no luck in finding this out.
I would be most grateful to any genius who could show me the (a) way. Thank you!
Rob Philpott.
|
|
|
|
|