|
how do i get all the treenodes in a treeview including the subdirectories??
treenodecollection = treeview.topnode.nodes return only the child nodes of the topnode and doesnt include the subdirectories.
i = treeview.topnode.getnodecount(true) does return the count but doesnt seem to return the nodecollection as such.
Is there any method available or it has to be implemented recrusively.
thanks.
|
|
|
|
|
I believe you'll have to loop through the node collection for each node.
James
"Java is free - and worth every penny." - Christian Graus
|
|
|
|
|
I'm just wondering about the C# using operator and what it means in terms of style.
In C# you can either do:
Font font = new Font("Arial", 10.0f);
...
font.Dispose();
or
Font font = new Font("Arial", 10.0f);
using (font)
{
...
}
Has anyone used the using keyword? If so, why? For convenience? Style? For fear that IDisposable may be changed in future releases and using will still work while Dispose may not?
Just curious.
cheers,
Chris Maunder
I spent a minute looking at my own code by accident. I was thinking "What the hell is this guy doing?" - @Logan
|
|
|
|
|
a using statement written like this:
using( Font font = new Font("Arial", 10.0f) ) {
// use font
}
actually translates to this:
try {
Font font = new Font("Arial", 10.0f) );
// use font
} finally {
if ( font != null ) {
((IDisposable)font).Dispose();
}
}
now i don't know about you...
but i find the "using" method much clearer and easier to read.
|
|
|
|
|
Except that if there is more than 1 resource it gets ugly.
|
|
|
|
|
Excellent point.
It's strange that in C++/SDK code you rarely see developers checking every return code and every HRESULT to ensure that things are going smoothly. I wonder if constructs like using will enourage more developers to be a little more careful.
cheers,
Chris Maunder
I spent a minute looking at my own code by accident. I was thinking "What the hell is this guy doing?" - @Logan
|
|
|
|
|
I liked it initially but it really gets ugly for nested loops and more than 1 resource. C++ smart types are far better. I prefer to use try {} finally {} now.
|
|
|
|
|
|
the garbage collector is for handling memory, not scares resources like GDI stuff, file locks, and database connections.
|
|
|
|
|
|
maybe, but not neccessarily before somebody else NEEDS that resource NOW.
GC is designed to handle memory deallocation. It's not really designed to handle database connection management. that's oledb's responsibility, and it would do it much better than any generic garbage collection could.
|
|
|
|
|
GC process doesnot call Dispose it only calls Finalize. Dispose is to free resources.
In Finalize you can free only unmanaged resources and not managed resources. So in case of Font this is ok but again it takes time. I prefer to clean up stuff myself.
More important is freeing managed stuff. (I realized this after seeing areecnt thread in DOTNET list).
StreamWriter writes text in buffers. The buffer is a byte array. So in Finalize you can't flush the buffer. So the only place where you can flush the buffer is Dispose/Close. In these cases you need to call Dispose/Close.
May be our resident C# specialist JTJ can add more to it
|
|
|
|
|
You pretty much summarized the reason to explicitly call Dispose on objects that implement it
One thing I noticed though; was you said it can make the code ugly if you have multiple objects to call dispose on; you can simplify it; if they are in one block.
Font f = ....;
Brush br = ....;
Bitmap bi = ....;
try
{
.....
}
finally
{
f.Dispose();
br.Dispose();
bi.Dispose();
} Could become
using(Font f = ....)
using(Brush br = ....)
using(Bitmap bi = ....)
{
.....
} Which is much much cleaner than the mass indentation you would get otherwise.
James
"Java is free - and worth every penny." - Christian Graus
|
|
|
|
|
using(Font f = ....)
using(Brush br = ....)
using(Bitmap bi = ....)
This works. But unfortunately, the generated code still has 3 try{}finally{} blocks.
|
|
|
|
|
um, could you give me an example of ugliness?
the more resources "used", the more code it autogenerates for you!
the using statement lets you focus on the intent of the code instead of the mundane plumbing.
|
|
|
|
|
It's a matter of personal preference
File f1 = null;
File f2 = null;
try
{
}
finally
{
if (f1 != null)
f1.Dispose();
if (f2 != null)
f2.Dispose();
}
using(f1 = new File(..))
{
using(f2 = new File(..))
{
}
}
I prefer the former.
|
|
|
|
|
um... you can put both in the same using statement parens.
so it becomes
using(
Font f1 = new File(..),
Font f2 = new File(..)
) {
// do your thang
}
|
|
|
|
|
Wow, I never knew that. Thanks.
But still C++ detructor stuff is far better.
|
|
|
|
|
Andy Smith wrote:
using(
Font f1 = new File(..),
Font f2 = new File(..)
) {
Actually you can't quite do that.
If you have multiple variables of the same type it will work, but you need to omit the second "Font"; so it becomes using(Font f1 = new Font(...), f2 = new Font(...)) .
If you wish to declare two different types you can do that as well; but you need to use two using statements.
using(Font f1 = new Font(...))
using(FileStream file = new FileStream(...))
{
...
} That's a lot of elipsis
James
"Java is free - and worth every penny." - Christian Graus
|
|
|
|
|
oh, ya, thanks for the correction.
still better than the alternative.
|
|
|
|
|
|
Hi
I dont even know how to start asking what I want to know.
1. I assume these are only for variables (objects, whatever) that is needed in a global scope. My understanding is that if you declare and create a new object within {} it will be disposed/finalized automatically when the {} ends.
Is my understanding correct?
2. If correct, does the above post refer to disposing/finalizing global variables when they no longer needed, in case they taking up too many resources?
3. Now I'm too confused what the hell I wanted to know
I think I'll go read up on it some more.
PS: Can someone perhaps explain with a realworld / code why it should be used and where specifically.
READ MSDN
|
|
|
|
|
your understanding on 1 is incorrect.
the variable may go out of scope at the end of a block, but that does not mean that the GC will immediately collect it. The GC collects memory on its own schedule.
|
|
|
|
|
thx, some reading made me understand some more ( i somehow understand MSDN english better than some of the people's posts here ).
to sum it up:
u would only use the using statement when u need to immediately free up resources, if so desired, else the GC will take care of it in its own time.
READ MSDN
|
|
|
|
|
Hi!
Can I use OpenGL from C#?
If yse how do I do it? Can I get an example?
Thanks
Ilan Ehrenfeld
|
|
|
|