|
In the above code snippet it appears that you are wary about 'anArrayList' not containing classes that are or inherit from MyClass. Unfortunately the only way to get it to continue through the loop is to write the foreach code yourself.
IEnumerator ie = anArrayList.GetEnumerator();
while(ie.MoveNext())
{
MyClass myclass = ie.Current as MyClass;
if( myclass != null )
{
DoStuff();
}
else
{
}
} A bit uglier, but it allows you to avoid an exception and you can continue processing the loop.
James
"Java is free - and worth every penny." - Christian Graus
|
|
|
|
|
|
Yes, that is ok.
There is one problem you may run into; and that is if you want to actually execute DoStuff on instances of MyClass as well as instances of a class that inherits from MyClass.
The above technique also won't work with all interfaces because of the way that the GetType() method works in regard to them.
Both cases can be solved by using the is and as operators. Essentially (not what really happens but the effect is the same) the is operator returns true of the left operand can be cast to the right operand. The as operator casts the operand to the type of the right operand, but returns null if the cast cannot be performed. If is returns true, then as will not return null and vice versa.
public class MyClass {}
public interface IMyInterface {}
public class Foo : MyClass {}
public class Bar : MyInterface {}
public class Baz : MyClass, IMyInterface {}
...
MyClass mc;
Foo foo;
Bar bar;
Baz baz;
mc is MyClass == true
mc is IMyInterface == false
foo is MyClass == true
foo is IMyInterface == false
bar is MyClass == false
bar is IMyInterface == true
baz is MyClass == true
baz is IMyInterface == true To me the is and as operators are more versitile than simply comparing the Type returned from GetType()/typeof.
James
"Java is free - and worth every penny." - Christian Graus
|
|
|
|
|
Thx, James
James T. Johnson wrote:
There is one problem you may run into; and that is if you want to actually execute DoStuff on instances of MyClass as well as instances of a class that inherits from MyClass.
Thats exactly what I ran into, but simplified the code when I posted (me bad).
So is / as should be used like:
class Player{}
class Dealer : Player {}
class Players : ArrayList {}
...
Players players = new Players();
void Method()
{
foreach (Player player in players)
{
if (player is Dealer)
{
Dealer dealer = player as Dealer;
dealer.DoDealerStuff();
}
}
}
Seems to make alot more sense after writing it myself, dunno if the post is neccesary, but its here now Submit shall be clicked .
MYrc : A .NET IRC client with C# Plugin Capabilities. See
http://sourceforge.net/projects/myrc for more info.
|
|
|
|
|
Yep, you got it!
James
"Java is free - and worth every penny." - Christian Graus
|
|
|
|
|
Tad bit nitpicky but this code could be a little bit faster.
<br />
if (player is Dealer) <br />
{ <br />
Dealer dealer = player as Dealer; <br />
dealer.DoDealerStuff(); <br />
}<br />
In this code the CLR must determine the type of player twice. The first time it will check when you call "player is Dealer". Then it has to check again which you do player as Dealer. It would be slightly more efficient to write it this way.
<br />
Dealer dealer = player as Dealer;<br />
if ( dealer != null ) {<br />
dealer.DoStuff();<br />
}<br />
Jared
jparsons@jparsons.org
www.prism.gatech.edu/~gte477n
|
|
|
|
|
|
I am creating a custom control called DropDownGroup that is similar to the functionality found in the main screen of Money 2002 (its basically a GroupBox that has a minimize and hide button in the header area).
I managed to create a functional version that inherits from Control that does all of its painting in OnPaint, and overrides DisplayRectangle so that a fully-docked child control will not cover the header area. However, just overriding DisplayRectangle doesn't disallow an undocked child control from being positioned on the header area (the GroupBox control has this unwanted feature as well).
To try and remedy this I decided to paint my header in the non-client area of the control. I overrode WndProc and intercepted WM_NCCALCSIZE, WM_HITTEST, WM_NCPAINT, and the WM_NC mouse messages. My WM_NCCALCSIZE handler modifies the client rectangle so that I have room for my header at the top. The WM_HITTEST handler returns a value for the caption or the client area. I paint my header in response to WM_NCPAINT, and I use the NC mouse messages in place of the OnMouse... handlers...
Everything was working fine (I have a custom designer class for the control, and when you try to drag a child to the header area it displays the 'no' icon just like with the title bar of a Form), except my buttons (not controls, just drawn ones) were not highlighting in response to the WM_NCMOUSEMOVE message when the cursor was over them. The functionality worked in that everything responded to the WM_NC button messages as expected. I just couldn't get the non-client area to redraw. I've tried a ton of things (sending WM_NCPAINTs, WM_PAINTs, and calling Invalidate, in various orders) but nothing seems to work.
Does anyone know how to get the non-client area of a Windows.Forms Control to repaint itself?
Why does sending WM_NCPAINT not actually cause a repaint of the non-client area (my WM_NCPAINT handler gets called and does its work, but nothing changes on the display)?
I have the ControlStyles AllPaintingInWmPaint, DoubleBuffer, and UserPaint all set. Could that be affecting it (by my testing it doesn't seem to since I've tried all combinations of the three)?
Thanks in advance for any help or guidance.
|
|
|
|
|
I need a control similar to the Property Grid, but that I can use without an object. I would like to set my own "properties" with code and be able to retrieve what the user entered.
Short of writing my own (which I don't have time, this is an urgent project), does anybody have an idea??
-- LuisR
──────────────
Luis Alonso Ramos
Chihuahua, Mexico
www.luisalonsoramos.com
"Do not worry about your difficulties in mathematics, I assure you that mine are greater." -- Albert Einstein
|
|
|
|
|
You could use the Reflection.Emit API to create classes at runtime.
James
"Java is free - and worth every penny." - Christian Graus
|
|
|
|
|
James T. Johnson wrote:
You could use the Reflection.Emit API to create classes at runtime.
That sounds way too hard for a simple beginner like me! this is my first program in C#/.NET! But anyway, I'll take a look at it!
-- LuisR
──────────────
Luis Alonso Ramos
Chihuahua, Mexico
www.luisalonsoramos.com
"Do not worry about your difficulties in mathematics, I assure you that mine are greater." -- Albert Einstein
|
|
|
|
|
Yeah, its definately not for the faint of heart; I haven't looked at the emit classes yet either
But unless you create your own PropertyGrid to work with an array of values thats the only option I can think of to use the existing grid.
If you don't mind not getting the look and feel of the property grid you could use a DataTable and a DataGrid to let the user enter data. It really loses its effectivness if you have more than a few different items to enter because of all the scrolling involved.
James
"Java is free - and worth every penny." - Christian Graus
|
|
|
|
|
Luis Alonso Ramos wrote:
Short of writing my own (which I don't have time, this is an urgent project), does anybody have an idea??
Hi, just write a simple Seetings Class, thats what I do!
public class Settings {
string name;
string password;
public string Name {get{return name;}set{name=value;}
public string Password {get{return password;}set{password=value;}
}
Then just seriallize to object to a stream and deserialize to open. Note if u change your classes properties, you cannot deserialize an "old" version of the class to a "new" version of the class. Alternatively, you can reflect all the properties to an XML file and read it from there (not too sure how to handle non-primative class there, still looking).
If you dont have time to do this, then you really dont have time
Hope this helps
READ MSDN
|
|
|
|
|
This sounds interesting... I now have a property grid with the object I want (more or less working)... In the object I have properties like "Name", "SubName", "Phone"... how can I make the control display "Commercial Name", "Branch Name" and "Phone Number" in the grid (not at the bottom in the help panel)???
Also, any way to set this at runtime (so I can get them from the resources for localization purposes)?
-- LuisR
──────────────
Luis Alonso Ramos
Chihuahua, Mexico
www.luisalonsoramos.com
"Do not worry about your difficulties in mathematics, I assure you that mine are greater." -- Albert Einstein
|
|
|
|
|
Global Property Grid
This should help you out.
Later,
Nathan
---------------------------
Hmmm... what's a signature?
|
|
|
|
|
I'm currently taking a look at it... I think that will be it... Thanks!!
-- LuisR
──────────────
Luis Alonso Ramos
Chihuahua, Mexico
www.luisalonsoramos.com
"Do not worry about your difficulties in mathematics, I assure you that mine are greater." -- Albert Einstein
|
|
|
|
|
I got it to work now... just two small problems:
1. The order of the properties... I tried setting NoSort (the docs say that the grid sorts them as returned by the properties collection) and added an Index attribute to each property... but how do I use the Index attribute to return properties in a certain order when enumerated??
2. Is there a way I can make of my properties display a multiline edit control???
Thanks!
-- LuisR
──────────────
Luis Alonso Ramos
Chihuahua, Mexico
www.luisalonsoramos.com
"Do not worry about your difficulties in mathematics, I assure you that mine are greater." -- Albert Einstein
|
|
|
|
|
Luis Alonso Ramos wrote:
2. Is there a way I can make of my properties display a multiline edit control???
The way that the TextBox control displays a multiline text string in the propertygrid is that it uses a string array (string[]) called Lines. If you want your object to do the same thing, just add a string[] property. Each line ( a line ends with an System.Enviroment.NewLine ) is an individual item in the array. If you add a string[] property and then when the object is shown in the propertygrid you can click your "Lines" property and there will be a little button with "..." on it. If you click the button it will popup a dialog that will allow you to type just like notepad.
You will then probably have to concatenate the strings in the array to make one "text" property...
Hope this helps for item 2. I am still looking into item 1.
Later,
Nathan
---------------------------
Hmmm... what's a signature?
|
|
|
|
|
Thanks... I just looked at it... but I would have to customize the dialog box that pops up (language, caption of labels, and so on.) I think what I will do is use the description pane to ask the user to insert semicolons (or something else) to signal new lines, and replace them by new lines before saving the string.
Again, thank you very much!
-- LuisR
──────────────
Luis Alonso Ramos
Chihuahua, Mexico
www.luisalonsoramos.com
"Do not worry about your difficulties in mathematics, I assure you that mine are greater." -- Albert Einstein
|
|
|
|
|
Inside of my control that I built, I want some sort of function like OnFinishInit that will be called once the control is added to it's form.
Currently, when a particular property is set to true , then I add a collection property to a ArrayList.
Unfortunately, the collection property is below my boolean property, and the collection never gets added because the collection isn't built until after the boolean property is set.
So, I need to wait until all properties are loaded before I try to add these collections to the array.
Thoughts?
|
|
|
|
|
I think the System.ComponentModel.ISupportInitialize interface will give you what you want. Simply add that bit of code to the EndInit() method.
James
"Java is free - and worth every penny." - Christian Graus
|
|
|
|
|
Perfect!!! Thanks for your help.
|
|
|
|
|
hello,
i'm trying to do a File.Copy but over the wire. more specifically an UpLoad, since it's starting from a Client machine.
Catch is this is via a WinForm/UserControl/ComponentModel object(s). so nothing to do with any kind of ASP, ASP.NET or otherwise. in the end i'm just trying to take a file of some type, be it a .jpg/.dll/.something and send/save it to a server over the net.
i've been experimenting with a number of classes; WebClient, HttpWebRequest and HtmlInputFile/HttpPostedFile. the last 2 being specific to ASP.NET, as i thought i might be able to make the system think it was coming from as ASP.NET page or something like that. i've been using a WebServer(IIS) for the connection, specifically to a Virtual Directory. which is where the file(s) will need to be in the end anyways. but i'm having no luck passing the file to the virtual file path.
any advice or help would be great.
Thank you,
Orion
|
|
|
|
|
|
sorry.., yes just simply transfering a file over the internet from my client to my server. Absolutely nothing to do with a web pages.
i'm sure i'm missing something obvious. although every example i look at is from web page to web page.
i am trying to put the file in C:\Inetpub\wwwroot\SomeDirectory, but again has nothing to do with web sites. these files are dll's and source code files.
Orion
|
|
|
|