|
I have a C# class with an event. I have added a handler for this event in a VB.Net windows form. However, within the C# class when I check if any handlers are created it returns null and thus the handler is not called. But I am creating an instance of the class and adding a handler to its event.
Any ideas why the event is now getting wired? Here is some code:
public delegate void ValidityChanged(object sender, EventArgs e);
protected void RaiseEvent(ValidityChanged handler, EventArgs e)
{
if (handler != null)
{
handler(this, EventArgs.Empty);
}
}
Here is the handler:
AddHandler Me._selectedSizeRun.Validated, AddressOf SizeRun_Validated
|
|
|
|
|
CodingYoshi wrote: Any ideas why the event is now getting wired?
Since you did not post any code, my guess is you did something wrong. Does that help?
led mike
|
|
|
|
|
The following segment may or may not be syntactically correct, but the overall structure is accurate. Items marked with question marks I am not for certain if they are needed.
include the following in the custom control
public delegate void ValidityChangedHandler(object sender, EventArgs e);
public ?event? ValidityChangedHandler ValidityChanged;
public void OnValidityChanged(object sender, EventArgs e)
{
if(ValidityChanged!=null)
raise event ValidityChanged;
}
when including in parent control:
this.customControl.ValidityChanged+=new ValidityChangedHandler(newMethod);
public void newMethod(object sender, EventArgs e)
{
}
Regards,
Thomas Stockwell
Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots. So far, the Universe is winning.
Visit my Blog
|
|
|
|
|
I have all that but for some reason when checking for a handler it returns null. Here is the complete code for this portion of the C# class responsible for raising the event:
public delegate void ValidityChanged(object sender, EventArgs e);
public event ValidityChanged Validated;
public event ValidityChanged Invalidated;
Within a method when the object changes I call this:
OnValidated(EventArgs.Empty);
public void OnValidated(EventArgs e)
{
RaiseEvent(Validated, e);
}
protected void RaiseEvent(ValidityChanged handler, EventArgs e)
{
if (handler != null) // this is false although I create a handler below in the vb code
{
handler(this, EventArgs.Empty);
}
}
This is the vb.net code for handling:
Imagine the above C# class's name is SizeRun
Dim run as SizeRun = new SizeRun()
AddHandler run.Validated, AddressOf SizeRun_Validated
Private Sub SizeRun_Validated(ByVal sender As System.Object, ByVal e As System.EventArgs)
' handle the event
End Sub
|
|
|
|
|
I can't see anything wrong with your code.
This (all C#) is basically your code put into a simple console app and it works perfectly!
using System;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
SizeRun run = new SizeRun();
run.Validated+= new ValidityChanged(SizeRun_Validated);
run.TestEvent();
Console.ReadKey();
}
static void SizeRun_Validated(object sender, EventArgs e)
{
Console.WriteLine("Validated Event Fired!");
}
}
public delegate void ValidityChanged(object sender, EventArgs e);
public class SizeRun
{
public void TestEvent()
{
OnValidated(EventArgs.Empty);
}
public event ValidityChanged Validated;
public void OnValidated(EventArgs e)
{
RaiseEvent(Validated, e);
}
protected void RaiseEvent(ValidityChanged handler, EventArgs e)
{
if (handler != null)
{
handler(this, EventArgs.Empty);
}
}
}
}
DaveBTW, in software, hope and pray is not a viable strategy. (Luc Pattyn)Expect everything to be hard and then enjoy the things that come easy. (code-frog)
|
|
|
|
|
CodingYoshi wrote: Dim run as SizeRun = new SizeRun()
AddHandler run.Validated, AddressOf SizeRun_Validated
The code you posted does not show the scope of run , nor does it show the OnValidated event being fired. There could be a disconnect between them.
led mike
|
|
|
|
|
Sco
led mike wrote: The code you posted does not show the scope of run
The scope of SizeRun is public else it will give me compilation errors.
led mike wrote: nor does it show the OnValidated event being fired
The method RaiseEvent() fires the event.
|
|
|
|
|
CodingYoshi wrote: The scope of SizeRun is public else it will give me compilation errors.
public is an Access Modifier which determines the Visibility[^] of the variable and is not the same thing as Scope[^]
So we still don't know the Scope of the variable
CodingYoshi wrote: The method RaiseEvent() fires the event.
The method RaiseEvent is called from OnValidated which appears to be an event handler
CodingYoshi wrote: public void OnValidated(EventArgs e)
{
RaiseEvent(Validated, e);
}
The code you posted does not show OnValidated being called or if it is a registered event handler we are not seeing where the event is being fired. Therefore it is possible that your VB code is trigging the event for a different instance of SizeRun class than the one that is used to register the event handler. This is the potential disconnect that I am talking about.
led mike
|
|
|
|
|
I just discovered indexers today (using Reflector and a bit of googling) and found that they solve some problems I had been having with a class. Having just found them, my initial thoughts were "excellent! this solves all of the problems of the world"
So my question is this:
Are indexers common knowledge (and I have been living under a rock until today)
OR
Are indexers obscure things only usually found in the System.whatever?
(The reason I ask is that the project I'm working on seems like a candidate for an article, but when I write it I dont want to patronise people by telling them all about this magic syntax I discovered if everybody already knows)
Thanks,
Chris
[Edit: After a couple of replies it seems that it is common knowledge, however I suspect that people have come from a C++ background - any VB background people care to chip in?]
modified on Monday, August 18, 2008 11:17 AM
|
|
|
|
|
c2423 wrote: Are indexers common knowledge
Yes
c2423 wrote: (and I have been living under a rock until today)
I don't know.
led mike
|
|
|
|
|
Thanks for your input! In conclusion I must just not have been paying attention to the C# books I glossed over...
Chris
|
|
|
|
|
c2423 wrote: Thanks for your input!
No problem. Man I sure missed an opportunity in replying to your other question!
c2423 wrote: (and I have been living under a rock until today)
I don't know, what's your address? I can look it up on Google Street View and tell you!
led mike
|
|
|
|
|
Indexers are nice and commonly used in the .NET framework. If you think they would make sense in your project and simplify the usage of it, then go for indexers.
regards
modified 12-Sep-18 21:01pm.
|
|
|
|
|
Yes, they simplify my project (in one place I even save an *entire line* of code )
And I know that the framework contains them (for example when reading a SqlDataReader's values)
However, my question was more along the lines of "do people generally know of their existance?"
Anyway, thanks for your input - its good to know that its not an alien concept for people!
Thanks,
Chris
|
|
|
|
|
c2423 wrote:
However, my question was more along the lines of "do people generally know of their existance?"
I think most people use them intuitively when accessing chars in strings, items in lists, values by key in dictionaries and lots of other stuff. Whenever the user knows that there's more data inside a class they either look for a GetXXX -Method or go for indexers without actually knowing that they just use "indexers".
regards
modified 12-Sep-18 21:01pm.
|
|
|
|
|
Perhaps I wasn't being clear in my posts:
Greeeg wrote: I think most people use them intuitively
Which is why I want to use them for my class
However there is a difference between understanding:
string x = "hello world";
char y = x[0];
And being able to write:
this[int indexno]
{
get { return something; }
}
What I wanted to know was are people familiar with how to add this functionality to a class, rather then can people use a class which already has this functionality.
|
|
|
|
|
c2423 wrote: What I wanted to know was are people familiar with how to add this functionality to a class, rather then can people use a class which already has this functionality.
This totally depends on the experience of the developer
Experienced developers who have been programming with C# for quite a while will definitely know of their existence, while newcomers to C# probably miss them and go the GetXXX -way.
modified 12-Sep-18 21:01pm.
|
|
|
|
|
When I first read "Indexer" I didn't know what you mean, but after seeing the example I realized you were talking about the [] operator. I think that almost every C++ developer might know that, as you can overload a lot of operators in C++ and it's something very useful.
BTW, the GetXXX method, is a method that connects to the internet and downloads adult contents from a porn site.
rotter
|
|
|
|
|
Thanks, exactly the answer I was looking for.
|
|
|
|
|
Again, not quite what I was looking for, but I think my question has been answered now anyway.
Thanks,
Chris
|
|
|
|
|
Hi folks! I have a project what I work on, and I have a local database. I am building a tool for cleaning the DB. The user can clean up the DB according to the selected date. The thing what I want to do is that the user can delete just files what are stored for more then 2 months. If the file is less then 2 months in the database then the user will not be able to delete the file. How can I do that? Any help, thx ahead
|
|
|
|
|
ru using SQL server??
Vikas Amin
My First Article on CP" Virtual Serial Port "[^]
modified on Thursday, July 24, 2008 5:33 PM
|
|
|
|
|
Hi..
i Need to load all the available system colors and system brushes into the combobox, can any one help me...
regards
Vinayskvs
|
|
|
|
|
SystemColors , SystemBrushes , KnownColor
|
|
|
|
|
I can use System.Colors, system.KnownColor, etc but i need to populate the entire Systembush names in the dropdown list..
|
|
|
|