Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Πρόβλημα με προσθήκη nodes σε treeview.

Îåêßíçóå áðü ôï ìÝëïò M@jestic. Τελευταία δημοσίευση από το μέλος object+ στις 18-12-2009, 03:19. Υπάρχουν 24 απαντήσεις.
Σελίδα 2 από 2 (25 εγγραφές)   < 1 2
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  08-12-2009, 18:41 55773 σε απάντηση της 55677

    Απ: Πρόβλημα με προσθήκη nodes σε treeview.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
     
    private void Update_TreeView()
            {
               
                try
                {
                    
                    
                    // Gia kathe xristi pou exei ginei registered.
                    for (int i = 0; i < treeView1.Nodes[0].Nodes.Count; i++)
                    {
                        // An einai sti lista me tous 'Online', tote 'prasino'.
                        if (listBox_Users.Items.Contains(treeView1.Nodes[0].Nodes[i ].Text))
                        {
                            treeView1.Nodes[0].Nodes[i ].ImageIndex = 1;
                            treeView1.Nodes[0].Nodes[i ].SelectedImageIndex = 1;
                        }
                        // Allios 'kokkino'.
                        else
                        {
                            treeView1.Nodes[0].Nodes[i ].ImageIndex = 2;
                            treeView1.Nodes[0].Nodes[i ].SelectedImageIndex = 2;
                        }
    
                        // An einai o topikos xristis, tote 'mple'.
                        if (treeView1.Nodes[0].Nodes[i ].Text == userName)
                        {
                            treeView1.Nodes[0].Nodes[i ].ImageIndex = 3;
                            treeView1.Nodes[0].Nodes[i ].SelectedImageIndex = 3;
                        }
                    }
    
                    // Ananeonei tin position kathe xristi.
                    foreach (UserInfo ui in UsersList)
                    {
                        foreach (TreeNode tn in treeView1.Nodes[0].Nodes)
                        {
                            if (ui.uName == tn.Text)
                            {
                                // ananeonei tin timi sto treeview.
                                tn.Nodes[0].Text = position[ui.uID - 1].ToString();
                                break;
                            }
                        }
                    }
                    
                }
                catch (Exception)
                {
                }
               
            }
    Εκει που δεν ξερω γιατι γινετε αυτο ειναι το γεγονος οτι αυτο συμβαινει μονο τη πρωτη φορα που παει να προσθεσει χρηστη.Τη δευτερη φορα που θα προσπαθησει να συνδεθει καποιος χρηστης εκτελουνται όλες οι συναρτησεις κανονικα !

    Αλλιως κολλαει στο update του treeview.

    Δηλαδη...τη πρωτη φορα που συνδεετε ο αλλος χρηστης πρεπει να εκτελεσει το update του δεντρου και να μπει στην for,δε το κανει με αποτελεσμα η συναρτηση που καλει το update να μπαινει σε exception και εμφανιζει το παραπανω μυνημα,με το index.

    Τη δευτερη φορα που θα προσπαθησει θα εκτελεσει κανονικα το update.

    Τονιζω οτι τη δευτερη φορα ολα εκτελουνται κανονικα! Εγω αυτο δε μπορω να καταλαβω πως συμβαινει...αν χρειαζεστε και τη συναρτηση που καλει αυτες τις 2 συναρτησεις πειτε μου να το ποσταρω.απλα για να μην σας πεταω κωδικα ετσι.
    Ευχαριστω για ολα τα προηγουμενα posts ελυσαν αρκετα θεματα!

    Οσο για το δεντρο που με ρωτησατε εδω οριζετε.
    1
    2
    3
    4
    5
    6
    7
    8
     
    // Rythmizei to treeview.
                imagelist.Images.Add(Resource1.book);
                imagelist.Images.Add(Resource1.pioni);
                imagelist.Images.Add(Resource1.pioni_off);
                imagelist.Images.Add(Resource1.pioni_self);
                imagelist.Images.Add(Resource1.block);
                treeView1.Nodes[0].Text = userLesson + "-" + userRoom;
                treeView1.ImageList = imagelist;


  •  09-12-2009, 00:47 55780 σε απάντηση της 55773

    Απ: Πρόβλημα με προσθήκη nodes σε treeview.

    M@jestic:


    Οσο για το δεντρο που με ρωτησατε εδω οριζετε.
    1
    2
    3
    4
    5
    6
    7
    8
     
    // Rythmizei to treeview.
                imagelist.Images.Add(Resource1.book);
                imagelist.Images.Add(Resource1.pioni);
                imagelist.Images.Add(Resource1.pioni_off);
                imagelist.Images.Add(Resource1.pioni_self);
                imagelist.Images.Add(Resource1.block);
                treeView1.Nodes[0].Text = userLesson + "-" + userRoom;
                treeView1.ImageList = imagelist;



    Αν έτσι ορίζεις το root node λογικό είναι να σου σκάει και μάλιστα με ArgumentOutofIndex exception.Θα περίμενα να δω κάτι τέτοιο:

    // Rythmizei to treeview.
                imagelist.Images.Add(Resource1.book);
                imagelist.Images.Add(Resource1.pioni);
                imagelist.Images.Add(Resource1.pioni_off);
                imagelist.Images.Add(Resource1.pioni_self);
                imagelist.Images.Add(Resource1.block);
                treeView1.Nodes.Add(userLesson + "-" + userRoom);
                treeView1.ImageList = imagelist;

    Δοκίμασε  το και αν λυθεί το πρόβλημα έχω τη θεωρία μου γιατί σου έτρεχε κανονικά ο κώδικας τη δεύτερη φορά (που στην ουσία δεν είναι δεύτερη φορά,αφού μετά το exception επανεκινείς το πρόγραμμα λογικά).

  •  09-12-2009, 04:33 55785 σε απάντηση της 55780

    Απ: Πρόβλημα με προσθήκη nodes σε treeview.

    Το treeView.Nodes ειναι μια collection class. Ψαξε στο google πως φτιαχνετε μια collection class με IList, ICollection, IEnumelabre interfaces.
    Τεσπα, μια τετοια class by default εχει ως index -1 για αυτο και σου βαραει καμπανα. Το Exception το περνει απο αυτο το κομματι 
    public virtual TreeNode this[int index]
    {
        get
        {
            if ((index < 0) || (index >= this.owner.childCount))
            {
                throw new ArgumentOutOfRangeException("index");
            }
            return this.owner.children[index];
        }
        set
        {
            if ((index < 0) || (index >= this.owner.childCount))
            {
                throw new ArgumentOutOfRangeException("index", SR.GetString("InvalidArgument", new object[] { "index", index.ToString(CultureInfo.CurrentCulture) }));
            }
            value.parent = this.owner;
            value.index = index;
            this.owner.children[index] = value;
            value.Realize(false);
        }
    }

    Κανε αυτο που λεει και ο απο πανω μου. Add(...)
    Και το ποιο σημαντικο, οταν εχεις δυο UI και θες να περασεις ενα αντικειμενο απο το πρωτο στο δευτερο, να του περνας κλωνο.
    Υγ: Ο κωδικας ειναι απο reflector
  •  09-12-2009, 17:49 55808 σε απάντηση της 55780

    Απ: Πρόβλημα με προσθήκη nodes σε treeview.

    darklynx:

    Αν έτσι ορίζεις το root node λογικό είναι να σου σκάει και μάλιστα με ArgumentOutofIndex exception.Θα περίμενα να δω κάτι τέτοιο:

    // Rythmizei to treeview.
    imagelist.Images.Add(Resource1.book);
    imagelist.Images.Add(Resource1.pioni);
    imagelist.Images.Add(Resource1.pioni_off);
    imagelist.Images.Add(Resource1.pioni_self);
    imagelist.Images.Add(Resource1.block);
    treeView1.Nodes.Add(userLesson + "-" + userRoom);
    treeView1.ImageList = imagelist;

    Δοκίμασε  το και αν λυθεί το πρόβλημα έχω τη θεωρία μου γιατί σου έτρεχε κανονικά ο κώδικας τη δεύτερη φορά (που στην ουσία δεν είναι δεύτερη φορά,αφού μετά το exception επανεκινείς το πρόγραμμα λογικά).



    Δεν λυθηκε το προβλημα ετσι, απλα με αυτο το τροπο προσθετει ενα node ακομα. π.χ. αν πριν εβγαζε cosy-1 με αυτη την εντολη βγαζει κατω απο αυτο myLesson και απο κατω τον χρηστη.

    κατα τα αλλα συνεχίζει το σφαλμα με τον index.

    Σας βαζω εδω και ενα μερος της συναρτηση που καλει τις 2 προηγουμενες (add_player & update_treeview) και αυτη ειναι κ η συναρτηση στην οποια πεταει το exception.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
     
    private void OnReceive(IAsyncResult ar)
            {
                try
                {
                    clientSocket.EndReceive(ar);
    
                    Packet_Data packet_received = new Packet_Data(Data_byte);
    
                    // Prosorines metavlites.
                    string Name = null;
                    string Email = null;
                    int index = 0;
    
                    if (packet_received.userName != null)
                    {
                        // Diaxorismos Name kai Email.
                        // To userName perilamvanei ta eksis: "Name*Email", opote xorizetai se "Name" + "Email".
                        Name = packet_received.userName;
                        index = Name.IndexOf('*');
                        Email = Name.Substring(index + 1);
                        Name = Name.Remove(index);
                    }
    
                    // Otan lamvanei mia energeia apo allo xristi, akougetai enas ixos.
                    if (Email != userEmail && packet_received.cmdCommand != Command.Null)
                    {
                        System.Media.SoundPlayer sound1 = new System.Media.SoundPlayer(Resource1.s1);
                        sound1.Play();
                    }
    
    
                    // Switch ......................................................................
                    // Kanei tis antistoixes energeies analoga me tin entoli pou lamvanei.
                    switch (packet_received.cmdCommand)
                    {
                        case Command.Login:
                            // Prosthetei ton xristi sto listbox.
                            listBox_Users.Items.Add(Name);
    
                            // Prosthetei ton paikti sti lista.
                            Add_Player(Email, Name);
    
                            packet_received.userMessage += "] " + resource.GetString("is_online") + " ***";
    
                            break;
    
                        case Command.Logout:
    
                            listBox_Users.Items.Remove(Name);
    
                            packet_received.userMessage += "] " + resource.GetString("is_offline") + " ___";
    
                            break;
    
                        case Command.Message:
    
                            packet_received.userMessage = Name + " > " + packet_received.userMessage;
    
                            break;
    
                                               
                        case Command.List:
    
                            listBox_Users.Items.AddRange(packet_received.userMessage.Split('*'));
                            listBox_Users.Items.RemoveAt(listBox_Users.Items.Count - 1);
                            textBox_CHAT.Text += "*** [" + userName + "] " + resource.GetString("is_online") + " ***\r\n";
    
                            break;
                    }
                    // End Switch ........................................................................
    
                    // Ananeose to treeview.
                    Update_TreeView();
    
                    // An to mynima pou elave einai gia to chat, to prosthetei sto textbox tou chat.
                    if (packet_received.userMessage != null && packet_received.cmdCommand != Command.List)
                    {
                        textBox_CHAT.Text += packet_received.userMessage + "\r\n";
                        textBox_CHAT.SelectionStart = textBox_CHAT.TextLength;
                        textBox_CHAT.ScrollToCaret();
                    }
    
                    Data_byte = new byte[2048];
    
                    clientSocket.BeginReceive(Data_byte, 0, Data_byte.Length, SocketFlags.None,
                                              new AsyncCallback(OnReceive), null);
    
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                    ask_to_exit = false;
                    Application.Restart();
                }
            }

  •  10-12-2009, 16:03 55826 σε απάντηση της 55773

    Απ: Πρόβλημα με προσθήκη nodes σε treeview.

    Με κομματια κωδικα ειναι δυσκολο(βαρετο) να καταλαβω τι παιζει. Το exception τι λεει? τεσπα αφου ξεμπερδεψες με το cross-thread δες το παρακατω κωδικα και προσπαθισε να τον φερεις στα μετρα σου. 

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;

    using System.Threading;
    namespace treeview
    {
        public partial class Form1 : Form
        {
            Thread t;
            Random r;
            List<string> users;
           
            public Form1()
            {
                InitializeComponent();
                t = new Thread(func);
                r = new Random();
                users = new List<string>() { "lola", "pipis", "nikos", "petros", "lila", "pila" };
                
                treeView1.Nodes.Add(new TreeNode { Name = "Root", Text = "Users:" });

                foreach (var item in users)
                {
                    AddInRootNode(new TreeNode { Name = item + "_key", Text = item });   
                }
                this.Load += delegate
                {
                    t.Start();
                };
                
            }

            //allo thread
            void func()
            {
                for (int i = 0; i < 100; i++)
                {
                    bool active = r.Next() % 2 == 0;//random bool

                    string key = users[r.Next(users.Count )] + "_key";//random key
                    UpdateNode(key, active);

                    Thread.Sleep(1000);
                }

            }

            void AddInRootNode(TreeNode node)
            {
                var root = treeView1.Nodes.Find("Root", false).Single();
                if (root == null)
                    throw new Exception("Den yparxei root");
                root.Nodes.Add(node);
            }
            void UpdateNode(string nodeKey,bool active)
            {
                var nodeForUpdate = treeView1.Nodes.Find(nodeKey, true).Single();
                if (nodeForUpdate == null)
                    throw new Exception("Den yparxei node me to key:" + nodeKey);
                if (active)
                    nodeForUpdate.ForeColor = Color.Blue;
                else
                    nodeForUpdate.ForeColor = Color.Red;

            }
          
        }
       
    }

  •  10-12-2009, 17:27 55831 σε απάντηση της 55826

    Απ: Πρόβλημα με προσθήκη nodes σε treeview.

    object+:
    Με κομματια κωδικα ειναι δυσκολο(βαρετο) να καταλαβω τι παιζει. Το exception τι λεει? τεσπα αφου ξεμπερδεψες με το cross-thread δες το παρακατω κωδικα και προσπαθισε να τον φερεις στα μετρα σου. 



    To exception αυτη τη στιγμη μου λεει: Index was outside the bounds of the array. Απλα εγω δε μπορω να καταλαβω γιατι δεν υπαρχει array.και το πιο σημαντικο γιατι μετα το restart του προγραμματος δουλευει κανονικα. Ευχαριστω για το κωδικα θα προσπαθησω να το προσαρμοσω και να δω τι θα γινει!
  •  11-12-2009, 06:29 55834 σε απάντηση της 55831

    Απ: Πρόβλημα με προσθήκη nodes σε treeview.

    M@jestic:

    To exception αυτη τη στιγμη μου λεει: Index was outside the bounds of the array. Απλα εγω δε μπορω να καταλαβω γιατι δεν υπαρχει array.και το πιο σημαντικο γιατι μετα το restart του προγραμματος δουλευει κανονικα. Ευχαριστω για το κωδικα θα προσπαθησω να το προσαρμοσω και να δω τι θα γινει!
    Η συναρτηση που ποσταρες ειναι τικγα στα array. Για να μη ψαχνεσε χρησιμοποιησε key στο treeview (ή σε οτι δουλευει με nodes). Αν θες να ψαχνεσαι, βγαλε το try catch και δες που θα σου χτυπησει ο debugger
  •  14-12-2009, 02:26 55866 σε απάντηση της 55808

    Απ: Πρόβλημα με προσθήκη nodes σε treeview.

    Η ύπαρξη αυτής της συνάρτησης δικαιολογεί το exception που σου πέταξε η εφαρμογή για την BeginInvoke,μια που ασύγχρονες συναρτήσεις σαν και αυτή καλούνται στο δικό τους thread και άρα τα μη thread-safe controls δεν μπορούν να λειτουργήσουν με απευθείας κλήση των συναρτήσεων.Άρα να περιμένεις και άλλα τέτοια σφάλματα,αφού δεν έχεις καθαρίσει με αυτό το ζήτημα μέσα στην συνάρτηση.

    Όσον αφορά για το αρχικό σου σφάλμα,πράγματι έχεις πολλά arrays και είναι δύσκολο να βρεις άκρη χωρίς καλό debugging.Π.χ η Data_byte που περνάς στην BeginReceive την χρησιμοποιείς σωστά.Όταν όμως καλείς πρώτη φορά την BeginReceive -πράγμα που συμβαίνει εκτός της OnReceive-την array από bytes που περνάς τη δεσμεύεις σωστά;

    Ξαναπροσπάθησε να βρεις που ακριβώς σου χτυπάει (μέσα στην OnReceive ή όχι,αν ναι μέσα στην AddPlayer ή την Update_Treeview κτλ) χρησιμοποιώντας breakpoints,step over commands και step into για να μπαίνεις μέσα στις συναρτήσεις.

  •  17-12-2009, 13:47 55941 σε απάντηση της 55866

    Απ: Πρόβλημα με προσθήκη nodes σε treeview.

    1
    2
    3
    4
    5
     
     if (ui.uName == tn.Text)
                            {
                                // ananeonei tin timi sto treeview.
                                tn.Nodes[0].Text = position[ui.uID - 1].ToString();
                                break;

    εδω το position παιρνει αρνητικη τιμη γι αυτο και χτυπαει το προγραμμα.Γιατι το uID ειναι ενα struct το οποιο ξεκιναει απο 0 οποτε για το πρωτο χρηστη η τιμη γινετε -1. Πως μπορω να αρχικοποιησω ενα struct με ακεραιους ωστε να ξεκιναει απο 1 και οχι απο 0;

    Ευχαριστω παρα πολυ με εχετε βοηθησει παρα πολυ να λυσω αρκετα θεματα!ευχαριστω για το χρονο σας!
  •  18-12-2009, 03:19 55950 σε απάντηση της 55941

    Απ: Πρόβλημα με προσθήκη nodes σε treeview.

    Δεν εχεις constructor και παει ο defualt. Στην πραγματικοτητα οι τιμες ειναι null και οχι 0.
    Δες το παρακατω να καταλαβεις

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;

    namespace ConsoleApplication3
    {
        class Program
        {
            struct Struct1
            {
                public int value1;
                public int value2;
            }
            struct Struct2
            {
                public int? value1;
                public int? value2;
            }
            static void Main(string[] args)
            {
                Struct1 s1 = new Struct1();
                Struct2 s2 = new Struct2();
                Console.WriteLine("value1:{0} value2:{1}",s1.value1,s1.value2);//zero values

                if(s2.value2 ==null)
                    Console.WriteLine("einai null");
                Console.Read();
              
            }
        }
    }

Σελίδα 2 από 2 (25 εγγραφές)   < 1 2
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems