|
Hi,
I am working on a Folder Browser for a program, my only guess of what to use is TreeView, but i have never used it before. I have searched on Codeproject for similar application that has a FolderBrowser, but they seems to advanced for me.
Can anyone tell/show me how to make such a program.
Though i do not have a clue on how to do, i started by doing this:
private System.Windows.Forms.TreeView _Directory = new System.Windows.Forms.TreeView();
private void AddTo_Directory()
{
DirectoryInfo all = new DirectoryInfo("c:\\");
foreach(DirectoryInfo x in all.GetDirectories())
{
this._Directory.Nodes.Add(x.ToString());
}
}
but that just give me the directories in "c:\\", I have no idea on how to get all the sub directories!
Thanks
QzRz
QzRz
|
|
|
|
|
You will have to make a recursive algorithm:
<br />
private void AddDirectory(DirectoryInfo dir, TreeNodeCollection col)<br />
{<br />
TreeNode node = col.Add(dir.Name);<br />
try <br />
{<br />
foreach(DirectoryInfo x in dir.GetDirectories())<br />
AddDirectory(x, node.Nodes);<br />
} <br />
catch {}<br />
}<br />
Now you could call AddDirectory(new DirectoryInfo("I:\\"), _tree.Nodes); to fill the tree with the complete hierarchie. The problem that arises is that this will load the entire folder structure of your hdd to the treeview at once. This would probably be frustrating to the user.
To avoid this you should always onle fill into the tree what you have to. So your first step isnt that wrong, because you are filling only the subfolders of the first hierarchie. To add needed subfolders when a node is expanded you will need to catch the AfterExpand event of the treeview and add the needed subfolders to the nodes in the expanded node. The following functions should work to do this:
<br />
private void AddParent(string dir) <br />
{<br />
DirectoryInfo dirInfo = new DirectoryInfo(dir);<br />
TreeNode node = _tree.Nodes.Add(dirInfo.Name);<br />
node.Tag = dirInfo;<br />
GetDirectories(dirInfo, node.Nodes);<br />
}<br />
<br />
private void GetDirectories(DirectoryInfo dir, TreeNodeCollection col) <br />
{<br />
try <br />
{<br />
foreach(DirectoryInfo x in dir.GetDirectories())<br />
{<br />
TreeNode node = col.Add(x.Name);<br />
node.Tag = x;<br />
}<br />
} <br />
catch {}<br />
}<br />
<br />
private void Tree_AfterExpand(object sender, System.Windows.Forms.TreeViewEventArgs e)<br />
{<br />
foreach (TreeNode node in e.Node.Nodes)<br />
GetDirectories((DirectoryInfo)node.Tag, node.Nodes);<br />
}<br />
Tree_AfterExpand must be set as the eventhandler of the corresponding event of your treeview. For each drive you want to add there must be one call to AddParent.
|
|
|
|
|
Robert,
Snap. Your way of dynamically creating the tree of course would be better ...
Allan
|
|
|
|
|
Thanks alot... it helped me alot
I only have one more question (I think)...
Do you know if the "Environment" is the best way to get all the logical drives?
Thanks
QzRz
QzRz
|
|
|
|
|
To determine if its the best way I would have to know ALL ways to get this information .
The only other way I know of (beside direct api calls) is System.IO.Directory.GetLogicalDrives , but I dont know if there is any difference between the two.
|
|
|
|
|
Looks like you need a bit of recursion:-
private void Form1_Load(object sender, System.EventArgs e)
{
AddDirectories(_Directory.Nodes, new DirectoryInfo("c:\\"), 1);
}
private void AddDirectories(TreeNodeCollection tn, DirectoryInfo dir, int level)
{
if (level <= 5)
{
try
{
DirectoryInfo[] dirs = dir.GetDirectories();
foreach(DirectoryInfo subDir in dirs)
{
TreeNode newNode = tn.Add(x.ToString());
newNode.Tag = subDir;
AddDirectories(newNode.Nodes, subDir, level + 1);
}
}
catch
{
}
}
}
The AddDirectories() method calls itself passing in DirectoryInfo and the new node for each new directory it finds and so on. The level variable in this example serves as a way to restrict how far into the directory tree the method should go. Also I usually store the DirectoryInfo into the tag of the newly created node so I can make use of it later when the node is selected by the user.
|
|
|
|
|
Hej!
We are working on a ASP site that is connected to a database(Access)(On the Same SERVER).
We are also developing a Server/Client program. This Server(C#) will have to be connected to the database one way or the other.
It have to react when a change is made to the database.
We have then thougt of the ASP to trigger the event at the Server(C#), is there any way to do this easy? The Server will be located at the same SERVER as the ASP site.
One other thougt is to let the Server program look in the database for changes, but only one can be connected to the database and by this the C# server will not be able to read it thou the ASP site is working against it.
Pleas help!
Best Regards
Jimmy
|
|
|
|
|
Do you mean ASP, or ASP.NET ?
Christian
I have several lifelong friends that are New Yorkers but I have always gravitated toward the weirdo's. - Richard Stringer
|
|
|
|
|
I mean regular ASP, is it posible?
//SnowJim
|
|
|
|
|
That's a real shame ( on many levels, I feel sorry for you ).
I'd say your best bet is COM. From memory, the mechanism for a COM object to call it's own is called 'connection points' ( this is deep, dark memory banks we're accessing though ), I dunno if they work with C#/COM interop, but clearly COM is the thing that ASP and C# can both use to talk to each other, so I reckon that's where your answer lies, unless you want to do something really ugly like have the C# code poll a file or table to find out when changes occur ( I am not suggesting this is a good idea ).
Is the ASP site legacy code ?
Christian
I have several lifelong friends that are New Yorkers but I have always gravitated toward the weirdo's. - Richard Stringer
|
|
|
|
|
Yeah its a shame, but it would take to much time to tech us ASP.net right no.
COM sounds intressting, i will have to searth some sites for COM with ASP and C#.
I thougt of the ugly way you mention about the C# vode poll a file or table, but it dont simes right to use.
Is the ASP site legacy code ?
It is coded by hand and we are only using our own code, or what do you mean?
//SnowJim
|
|
|
|
|
Snowjim wrote:
It is coded by hand and we are only using our own code, or what do you mean?
I meant, are you starting a new ASP site ( if so, I can't imagine why ), or have you inherited one.
Snowjim wrote:
it would take to much time to tech us ASP.net right no.
You obviously know C#, I don't see where the problem lies. The worst you could do is write an ASP.NET site that could be improved upon later.
Snowjim wrote:
COM sounds intressting, i will have to searth some sites for COM with ASP and C#.
You don't spin up COM objects now in your ASP project ? How do you handle the middle tier development ?
Snowjim wrote:
but it dont simes right to use.
No, it would be plain terrible
Christian
I have several lifelong friends that are New Yorkers but I have always gravitated toward the weirdo's. - Richard Stringer
|
|
|
|
|
I meant, are you starting a new ASP site ( if so, I can't imagine why ), or have you inherited one.
We are building a Forum with ASP(not about ASP), to this forum we are building a Server/Client.
This Server/Client program will offer notification when someone is applaying to i thread that the user have subscibed to or somthing like that. The server will get the info that the client requests form the ASP Forum page(or how we now whould have to sulve the problem).
This way users will get posibility to answare on threads and PM with out going to the FORUM page.
This project is a School project
We dont use COM and have never done, but it would be intressting to learn, if its the way to go(only way maby? besides the ugly one)
Best Regards
SnowJim
|
|
|
|
|
Snowjim wrote:
We are building a Forum with ASP(not about ASP), to this forum we are building a Server/Client.
OK - well, I strongly recommend you don't do this, but use ASP.NET instead.
Reasons - first and foremost, asp sucks. Secondly, you're learning or know C# already, and COM means C++. You cannot do a meaningful ASP site without a middle tier, which means you need to write a COM component. This is a hell of a pain if you don't already know COM and C++.
Snowjim wrote:
We dont use COM and have never done, but it would be intressting to learn, if its the way to go(only way maby? besides the ugly one)
COM is required to do anything half decent in ASP, assuming you want to do it properly. ASP.NET is definately the way to go here. Who suggested asp, your teacher ?
Christian
I have several lifelong friends that are New Yorkers but I have always gravitated toward the weirdo's. - Richard Stringer
|
|
|
|
|
We can C++ good, and if there is no other way we will have to make the COM component one way or the other.
Ther ASP forum is on good way to finish as well ass the Server/Client.
Yes we was about to gå with ASP.NET but our teacher dident agree, it was harder for him to check our project.
He also whanted us to use Access insted of SQL becourse its easyer for him to check.
//SnowJim
|
|
|
|
|
OK, so your core problem is that your teacher is a moron. I suggest finding another course, or at least not putting too much faith in this one.
The only decent way to do ASP development is to put the business logic in a C++/COM component and then call it from the asp, that way you can limit the ugly VBscript code to next to nothingness. There are plenty of articles around on COM development, but it's a bit of a mind melt at first, at least it was for me.
Christian
I have several lifelong friends that are New Yorkers but I have always gravitated toward the weirdo's. - Richard Stringer
|
|
|
|
|
Okay, i understand.
Thanks alot for all help, maby we do the ugly way after al, if we not are going to use this forum for real anyway.
And build a forum in ASP.net later on.
Best Regards
Snowjim
|
|
|
|
|
I've got to agree with Christian. This is a really bizare way to design an application.
Another option for getting the ASP application to comunicate with the server is through a WebService interface rather then a COM interface. That way you would at least learn something about ASP.Net and use something that in it's early stages of adoption, rather then on it's last legs like COM.
I can imagine the sinking feeling one would have after ordering my book,
only to find a laughably ridiculous theory with demented logic once the book arrives - Mark McCutcheon
|
|
|
|
|
Okay! thanks alot, we will look in to Webservices, wh have thougt of that before but we dident know that is suported ASP to.
//SnowJim
|
|
|
|
|
|
Hello!~I am a newcomer. Currently, I am doing a project which requires to change some java code to C#. But the java code import the java_cup.runtime.* library, is there any C# parser that has the same function?
I am now using the C# cup from http://www.infosys.tuwien.ac.at/cuplex/cup.htm[^]
, but there are some errors. Can anyone help? Thx a lot!!~
|
|
|
|
|
the subject says it all, how do I create an event handler for when a the active tab in the tab control is changed?
|
|
|
|
|
Select your TabControl in the Form Designer, go to the properties window, select the events view by clicking on the yellow bolt and finally double click on the entry TabIndexChanged.
Visual Studio will then create the following code for you. Of course you can code this by yourself too.
this.tabControl1.TabIndexChanged += new EventHandler(tabControl1_TabIndexChanged);
private void tabControl1_TabIndexChanged(object sender, EventArgs e)
{
}
www.troschuetz.de
|
|
|
|
|
In the documentation on this method it says i can extract the read data within the callback method? i dont understand how to do this...
eg
NetworkStream str = (NetworkStream) result.AsyncState;
byte[] myReadBuffer = new byte[2048];
int numberOfBytesRead = 0;
numberOfBytesRead = str.EndRead(result);
it says "To obtain the received data, call the AsyncState method of the IAsyncResult, and extract the buffer contained in the resulting state object"
so in my case the IAsyncResult = result and I case the stream state from it but how do i get the data? as theres no method to call??
confused
mike
|
|
|
|
|
Create a object which looks something like this
class ObjectState
{
public byte[] myReadBuffer = new byte[2048];
public NetworkStream str = set the network stream object u had created
}
now when you call beginread call it this way
ObjectState state = new ObjectState();
networkstream.BeginRead(state.myReadBuffer, 0, 2048, AsyncCallback method pointer, state)
//Pass state object to last parameter of BeginRead.
when u endread
ObjectState state;
state = (objectState) result.AsyncState;
int numberOfBytesRead = 0;
numberOfBytesRead = str.EndRead(result);
now use state.myReadBuffer; //This should contain the data u r looking for
|
|
|
|