|
Hello,
I have a winform application which has a treeview and listview with n number of columns. I want to reorder the columns but the treeview data is not getting interchanged. How do i trigger the event wherein on column reorder the row data is changed.
Currently on ColumnReorder event im swapping the childnode data based on olddisplay index and newdisplay index and storing it in childnode.tag. But im unable to trigger the drawnode event to display the reordered information.
For example if i have 3 columns say Folder, DateCreated and Size and when i drag and drop "DateCreated" column after "Size" i want the data in "DateCreated" column to be moved.
Thanks
|
|
|
|
|
If your intent is to re-build the TreeView based on re-ordering the columns in the ListView, I think that's not a good design choice because of the amount of work you'd have to do to re-build the TreeView node-structure.
If you absolutely have to have different views, I would use multiple TreeViews, each one built to match a given ListView column order; then I'd just display the TreeView that matches the current ListView column order. Of course, depending on how many items you display, how many columns, etc. that could be expensive in terms of memory consumption and time-to-build the TreeViews.
«I want to stay as close to the edge as I can without going over. Out on the edge you see all kinds of things you can't see from the center» Kurt Vonnegut.
|
|
|
|
|
Hi,
Im supposed to have the design like that hence im using treeview and listview. How do i rebuild Treeview on reordering of columns. I have the new treeview data but im unable to trigger the event to write the new treeview data.
Thanks
|
|
|
|
|
To help you further with this, I'd need to know:
1. did you write the code that populates the ListView, and builds the TreeView Nodes based on the ListView ?
2. if you did write the code: please describe, in a general way, how you build the TreeView Nodes.
3. is the ListView being populated by being 'bound to a DataSource ?
4. Do you know how to write code that recursively parses a TreeView, accessing every Node ?
«I want to stay as close to the edge as I can without going over. Out on the edge you see all kinds of things you can't see from the center» Kurt Vonnegut.
|
|
|
|
|
Hi,
1) Yes im using code which populates the listview and builds treeview nodes based on it.
2) I have around 20 columns in listview and for each treeview node i store the values of all columns in node.tag and populate it.
3)I didnt understand what bound to a datasource means.
4) No i dont have idea how to recursively parse a Treeview.
Thanks
|
|
|
|
|
1) Yes im using code which populates the listview and builds treeview nodes based on it.
Okay, but I still don't have a clear idea of what is actually displayed in the TreeView: assuming there's one "root-node" for each row in the ListView, does that root-node have "child-nodes" ? If so, what are they: one child node per column ?
Please describe exactly what I'd see in one root-node before and after a re-ordering of any column.
2) I have around 20 columns in listview and for each treeview node i store the values of all columns in node.tag and populate it.
That doesn't sound quite right, but what exactly are you storing in the Tag: an instance of a Class or Struct ?
3)I didnt understand what bound to a datasource means.
Let's leave that issue alone then.
4) No i dont have idea how to recursively parse a Treeview.
That's easy to do, but only necessary when you have a multi-level TreeView where any Node can have any number of Child Nodes, and so on.
«I want to stay as close to the edge as I can without going over. Out on the edge you see all kinds of things you can't see from the center» Kurt Vonnegut.
|
|
|
|
|
Hi,
1) For example im displaying C:\ drive details in winform and for treeview C:\ drive will be the assembly/root node. The childnodes will be all the folders present in the drive and these folders can again have multiple folders.
-----------------------------------------------------------------------------------------------------
| Name | Date Modified | Type | Size |
------------------------------------------------------------------------------------------------------
C
|_ TestData | 21/10/2015 | File Folder | |
|_ APP | 21/10/2015 | File Folder | |
|_Test1 | 16/10/2015 | Text Document | 72 KB |
|_Test2 | 18/10/2015 | Text Document | 40 KB |
|_ Temp | 11/11/2015 | File Folder | |
|_ Image1 | 01/06/2015 | JPEG image | 39 KB |
As shown above, this roughly shows my winform display for rootnodes and childnodes. So when i try to reorder/rearrange column 2 to column 3 so date modified becomes column 3 and Type becomes column 2 but the corresponding treeview data remains same name dates are still present in column 2 and filetypes in column 3. I want this data also to be rearranged. I have stored the data after rearranging in a string variable but i dont know how to rewrite this information and display it.
2) In childnode.Tag i pass the treeview row data
For example for the above scenario
childNode.Tag = name + \t + date + \t + type + \t + size;
name,date,type and size are string variables.
Thanks
|
|
|
|
|
As I understand it now:
1. you do not want to change what is displayed in the TreeView when you re-order Columns in the ListView:
1.a. you want re-ordering columns in the ListView to properly move the Column data
And, I'm puzzled because: if you are doing a column re-order the data should move with it.
So, please show your code ... the EventHandler ... that responds to the user at run-time re-ordering columns.
And, why did you choose to store the various column fields as Text in the Tag property of TreeNodes ?
«I want to stay as close to the edge as I can without going over. Out on the edge you see all kinds of things you can't see from the center» Kurt Vonnegut.
modified 14-Nov-15 3:59am.
|
|
|
|
|
Hi,
1) Yes i do not want to change the Treeview structure when columns in listview are reordered.
I want the corresponding column data to move when columns are reordered.
Im not sure how will the data be moved if column is reordered. I have listed the code which im using on reorder
private void ListView_ColumnReordered(Object sender, ColumnReorderedEventArgs e)
{
int iNewOrder, iOldOrder = 0;
iNewOrder = e.NewDisplayIndex;
iOldOrder = e.OldDisplayIndex;
string strNodeInfo;
string tempVar;
foreach (TreeNode childNode in rootNode.Nodes)
{
// im interchanging the values
tempVar = string.Copy(childAttributesOrder[iOldOrder]);
childAttributes[iOldOrder] = string.Copy(childAttributes[iNewOrder]);
childAttributesOrder[iNewOrder] = string.Copy(tempVar);
childNode.Tag = childAttributes[0] + seperatorTAB + childAttributes[1] + seperatorTAB + childAttributes[2] + seperatorTAB + childAttributes[3];
}
}
I didnt know of any other way of storing the values except in childnode.tag.
Thanks a lot for your replies.
|
|
|
|
|
Hi,
Can you help me out im still stuck in the reorder issue.
Thanks
|
|
|
|
|
I use for loop to creat serise in chart. So the default color is first series is blue, ant 2rd is orange.
But i want to modify chart series default, i want 1st color is Red. I need for loop to creat it ,so how to do it?
|
|
|
|
|
|
Hi All,
Beginner C# programmer here, I am creating a survey project and I was stuck on how will I populate my check boxes.
I have a Table/data stored like this.
id_no prodTyp_Code SN_Skill1 SN_Skill2 SN_Others SN_ProdTyp
12345 T-Shirt 1 0 null null
12345 Jacket 1 1 null null
12345 Shorts 1 1 null null
12345 Pants 0 0 null null
I don't know how will I populate it to my UI.
(Please see below image)
My Checkboxes UI[^]
Please advise me.
Thank you.
|
|
|
|
|
Assuming your checkboxes are for SN_Skill1 and SN_Skill2, when you read your data in a simple boolean conversion will give you a field that is a more meaningful check value.
|
|
|
|
|
dx1 = u - x1 - x1^3
dx2 = -x2
how to make a diagram to analyze the bifurcation of the function
P.S. the x-axis of bifurcation is u
the y-axis of bifurcation is || X ||
{the amplitude (or norm) of the equilibrium point }
|
|
|
|
|
As far as I can see, your question has nothing to do with C#.
|
|
|
|
|
You may not like the previous answer, but it is still correct. Hence, I upvoted it.
Try a matlab forum, or show us some C# code.
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
|
|
|
|
|
Imagine I have such code:
public static List<SocketStructure> GetHostAddressesList()
{
lock (m_locker)
{
if (m_isInited == false)
{
return null;
}
return m_HostAddresses;
}
}
Usage in other class
List<SocketStructure> tmp = DppModuleParameters.GetHostAddressesList();
for (int i = indexHost; i < tmp.Count; i++)
{
}
My question is you can see above once I got reference to m_HostAddresses , even though there is lock in the getter, I am losing the thread safety, because, tmp still points to m_HostAddresses right? So if another thread modifies m_HostAddresses , then tmp will have old value right?
What is the way to protect against this?
Would it be better instead of getter to have something like deep copy? I pass some temporary structure to function and instead of returning reference as getter does, the function would copy host addresses to that structure inside lock. Would this be better?
Or I should use getter each time I want to refer to that variable instead of storing in tmp?
BTw. The only method that can modify host addresses is also protected with same lock.
|
|
|
|
|
Well...yes and no.
When you set tmp to the collection, it will maintain the same value - it "points" at the same collection until you specifically set tmp to a different value with the assignment operator. But the collection it refers to can be changed by Add and Remove operations without affecting the value in the variable - it's the same collection regardless of what happens to it's contents. There is no way to "guard against this" because it is exactly what you expect to happen.
Consider your car: it's the same car if it just has you driving as it is if you add two passengers in the rear seats, or take out the spare tyre and leave it at home. The variable "my car" doesn;t change, but it's content does.
It you want thread safety with a collection, then you need to use a lock round each access to the collection: Add, Remove, Insert, and get element, not so much in the getter - unless your getter returns a copy of the collection instead of the "real thing".
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
|
|
|
|
|
With tmp variable is a bit tricky, even if I have lock in Add function,
if I store the reference in tmp it will still refer to old variable
but If I call getter each time, then it will give me new value, isn't it?
|
|
|
|
|
Member 12061600 wrote: The method which can modify my list is actually protected under SAME lock.
So I guess I am on the safe side
No, because your existing lock doesn't protect anything - you can still be accessing the list from one thread while a different thread is deleting items. You need to apply the lock each time you access or modify the content (which means pretty much every time you do tmp.anything)
A copy is safer:
return m_HostAddresses.ToList(); would do it.
But even then, if the actual items in the collection are being changed, then they need a lock as well:
SocketStructure ss = tmp[10];
ss.FavouriteFruit = new Banana(); is still not thread safe if anyone else can be accessing the same element of the original collection.
Member 12061600 wrote: but If I call getter each time, then it will give me new value, isn't it?
Just existing getter will return the same value - because it returns a reference to the collection.
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
|
|
|
|
|
Please don't delete questions, it makes life a PITA at times, if you have just typed up a reply and the question has vanished...
You need to brush up on what a reference is: Using struct and class - what's that all about?[^] may help as it explains why a value and a reference are different.
Your getter always returns a reference: and that's true if it returns a copy or the original collection. If your getter returns the original, then you don't get a new value each time, you get the same reference - which "points at" the same collection.
If we go back to cars, then if you put your mobile in the glove box of "your car" then under normal circumstances you wouldn't expect to find it in "my car". But... what if we were married, and had a single car between us? Then "your car" and "my car" refer to the same actual vehicle, so you can put the mobile in your glove box, and I can find it in mine!
Your existing getter is returning the same "vehicle" each time it's called, so anything that one thread does to the underlying collection affects the data a different thread accesses. This is why locks are so important (and difficult to understand!)
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
|
|
|
|
|
I meant different - hard to explain.
With my existing getter, if I store reference in TMP.
And my Setter (which is locked) modifies list in another function,
tmp will still have old value?
If instead of tmp I use getter each time, I will be able to
see the changed value?
PS I am thinking to go with solution of returning copy, that seems better
|
|
|
|
|
That's where it gets complicated...
The value in tmp will only change when you use an assignment operator.
But the object it refers to can be changed!
Let's try an example.
int[] arr = new int[] {1, 2, 3, 4, 5};
int[] tmp = arr;
Both tmp and arr refer to the same array of 5 integers:
private void PrintThem(int[] data)
{
foreach (int i in data)
{
Console.WriteLine(i);
}
}
...
int[] arr = new int[] {1, 2, 3, 4, 5};
int[] tmp = arr;
PrintThem(arr);
PrintThem(tmp);
will produce the same numbers.
And if I do this:
int[] arr = new int[] {1, 2, 3, 4, 5};
int[] tmp = arr;
arr[2] = 666;
PrintThem(arr);
PrintThem(tmp);
You will get the same sequence printed twice:
1
2
666
4
5
1
2
666
4
5
It's only when I create a new array that it changes:
int[] arr = new int[] {1, 2, 3, 4, 5};
int[] tmp = arr;
arr[2] = 666;
arr = new int {7, 8, 9};
PrintThem(arr);
PrintThem(tmp);
Will produce:
7
8
9
1
2
666
4
5 If your setter modifies m_HostAddresses by assigning it a new collection:
m_HostAddresses = new List<SocketStructure>(); then there is no threading problem because the collections are different.
But if it modifies the content instead:
lock (m_locker)
{
m_HostAddresses.Add(new SocketStructure());
}
Then that isn't thread safe unless every time you access the collection you add the lock round that code as well.
Even returning a copy may not cure this problem, if any of the SocketStructure elements in the collection are altered at any point, because the copy of the collection does not generate a copy of all the elements in it, just the references to them!
This can take a bit of getting your head round, and without being able to see when your eyes start to glaze over it's very difficult to know if you understand what I mean.
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
|
|
|
|
|
I see
Everytime I modify m_HostAddresses - there is lock inside that function
Maybe I need something like this?
public static SocketStructure[] GetHostAddressesList() {
lock(m_locker)
{
List<SocketStructure>tmp = new List<SocketStructure>tmp();
for(int i = 0; i<m_HostAddress.Count(); i++)
{
SocketStructure s = new SocketStructure();
s.IP = m_HostAddress[i].IP;
s.port = m_HostAddress[i].port;
tmp.Add(s);
}
return tmp.ToList();
}
}
|
|
|
|
|