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

 

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

Linq Objects saved and load from ClipBoard

Îåêßíçóå áðü ôï ìÝëïò Johnnyxp64. Τελευταία δημοσίευση από το μέλος Markos στις 30-12-2008, 11:34. Υπάρχουν 13 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  24-12-2008, 17:12 47141

    Linq Objects saved and load from ClipBoard

    Χρονια πολλα σε ολλους,

    εχω κολησει με ενα σημαντικο προβλημα.Ζητησα και απο τον Αι-Bill να μου φερει την λυση αλλα δεν το βλεπω να ξερει vb.net. Τα παρατησε λεει απο την vb.4. :P

    Προσπαθω να αντιγραψω και να καλεσω επιτυχως μια List (of objects) που φτιαχνω και μεσα της εχει αντικειμενα που ειναι Linq records

    με την Clipboard.SetData("format as string", ObjectName)

    ενω καταφερνω και περνω οτι αλλο θελω απο το clipboard ΔΕΝ μπορεσα με τιποτα να βρω τι format name εχει ενα list!

    δοκιμασα και το list.getType.Tostring αλλα δεν ! το List ποθ ερχεται ΑΝ ερχεται ειναι ΠΑΝΤΑ Nothing. αρα δεν το ζηταω σωστα.

    εχεις κανεις κανει κατι παρομοιο? μια List να μεταφερθει μεσω clipboard? 

    σας ευχαριστω ελπιζω σε καποιο παραδειγμα με vb.net code.

    καλες γιορτες


    This Business Is Binary. You are a 1 or a 0. Alive or Dead.-
  •  25-12-2008, 10:15 47149 σε απάντηση της 47141

    Απ: Linq Objects saved and load from ClipBoard

    Να αρχίσω από τον εύκολο τρόπο ή από τον δύσκολο; Smile

    • Δεν έχω υπόψη μου πως υλοποιείται από τρίτους κάτι παρόμοιο, αλλά κάποια στιγμή που είχα κολλήσει και είχα ξεμείνει από ιδέες πως θα υλοποιήσω κάτι παρόμοιο, παρατήρησα ότι στο Excel όταν κάνεις copy & paste κελιά, ένα από τα formats που βάζει μέσα στο ClipBoard είναι το CSV. Με πιο απλά λόγια, αν βάλεις τα δεδομένα σου σαν CSV format μέσα στο ClipBoard μπορείς να τα μεταφέρεις σαν text, αλλά μπορείς να ξανασυνθέσεις τα δεδομένα σου σε όποια μορφή θες, στην εφαρμογή που θα έχουν μεταφερθεί μέσω ClipBoard.
    • Ο δύσκολος τρόπος είναι να ορίσεις ένα δικό σου format στο ClipBoard που να ικανός να μεταφέρει τα δεδομένα σου - από εκεί και πέρα θα πρέπει και να τα γράφεις και να τα διαβάζεις σε αυτό το format που στην συνέχεια θα το μετατρέπεις σε ότι θέλεις. Δεν είναι ότι πιο εύκολο πράγμα στην υλοποίηση, αλλά υπάρχει μια συζήτηση που μπορείς να πάρεις μιας ιδέα για το τι απαιτείται...

     

    George J.


    George J. Capnias: Χειροπρακτικός Υπολογιστών, Ύψιστος Γκουράρχης της Κουμπουτερολογίας
    w: capnias.org, t: @gcapnias, l: gr.linkedin.com/in/gcapnias
    dotNETZone.gr News
  •  26-12-2008, 18:08 47168 σε απάντηση της 47149

    Απ: Linq Objects saved and load from ClipBoard

    ευχαριστω για το ν ενδιαφερον, αλλα και τα 2 μου φαινονται πολυ συνθετα για κατι τοσο "απλο" που θελω να κανω.......

    σαν να πηρε το ματι μου κατι οτι πρεπει να κανω το περιεχομενο πρωτα seriazation!??

    ελπιζω να υπαρχει καποιος που να εχει κανει κατι παρομοιο.


    This Business Is Binary. You are a 1 or a 0. Alive or Dead.-
  •  26-12-2008, 22:10 47173 σε απάντηση της 47168

    Απ: Linq Objects saved and load from ClipBoard

    Αυτό που θέλεις να κάνεις δεν είναι απλό. Προσπαθείς να χρησιμοποιήσεις το Clipboard για κάτι για το οποίο δεν φτιάχτηκε.

    Μπορείς μεν να χρησιμοποιήσεις serialization για να μεταφέρεις αντικείμενα από τη μία εφαρμογή στην άλλη, θα πρέπει όμως και η δεύτερη εφαρμογή να καταλαβαίνει τί είναι αυτά τα αντικείμενα, δηλαδή θα πρέπει να χρησιμοποιεί τα ίδια assemblies για να μπορέσει να κάνει deserialize τα δεδομένα του clipboard. Αν όμως συμβαίνει αυτό, γιατί να μεταφέρεις τα αντικείμενα τα ίδια και να μην μεταφέρεις απλά το ID τους και να φορτώσεις τα αντικείμενα στην δεύτερη εφαρμογή?


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  27-12-2008, 14:22 47184 σε απάντηση της 47173

    Απ: Linq Objects saved and load from ClipBoard

    χμμμμ, να μεταφερω το id?

    βασικα θελω να μεταφερω απο ενα παραθυρο (windform) της ιδιας εφαρμογης εγγραφες Linq σε ενα αλλο. της ιδιας εφαρμογης παντα.

    νομιζω μου εδωσες μια εναλακτικη πολυ καλη ιδεα! θα δοκιμασω να μεταφερω τα id των εγγραφων ως κειμενο και μετα να τα ξαναφορτωσω sto paste σε νεο List of Linq Objects.

    tnx a lot αν πεσω σε αδιεξοδο θα ενημερωσω το post.


    This Business Is Binary. You are a 1 or a 0. Alive or Dead.-
  •  27-12-2008, 14:31 47185 σε απάντηση της 47168

    Απ: Linq Objects saved and load from ClipBoard

    Τελικά δεν άντεξα. Με έπιασαν τα στερητικά μου (ήδη από εχθές). Ως προς το θέμα μας τώρα, θα συμφωνήσω με τον Παναγιώτη Καναβό. Όντως δεν είναι απλό. Όσον αφορά στο serialization παραθέτω τα εξής από εδώ:

    Objects placed on the clipboard must be serializable. Unfortunately, .NET doesn't raise an exception if you place a non-serializable object in the clipboard or data object. It includes the format, but stores null. This makes it look like the clipboard isn't working. If your object can't be serialized, consider creating a byte array and storing it in the clipboard as a memory stream. You will also have to retrieve it as a memory stream and reconstitute the object from the byte array.

    Αν σε ενδιαφέρουν μόνο τα data μπορείς να τα μετατρέψεις σε CVS format που αναγνωρίζεται από την DataFormats class. Είναι η "εύκολη" λύση που σου προτείνει και ο Γιώργος Καπνιάς. Κάτι που εγώ θέλω, μιας κι έχω αδυναμία στα datasets και στα datatables, είναι να μετατρέπω τα δεδομένα σε datatable για πολλούς και διάφορος λόγους. Συν τοις άλλοις, μπορώ να τα κάνω copy-paste προς και από τον clipboard με xmlserialization. Ο κώδικας που παραθέτω πιο κάτω είναι διερευνητικός. Αν κάποιος ενδιαφέρεται να κάνει προτάσεις βελτίωσης, βεβαίως και είναι ευπρόσδεκτες.

    Αν και το θεωρώ περιττό, πρέπει να αναφέρω ότι για να λειτουργήσει ο κώδικας χρειάζονται τα παρακάτω statements:

    using System.Reflection;

    using System.Xml.Serialization;

    using System.IO;

    Σε μία κενή φόρμα έβαλα ένα datagridview και δύο buttons (btnCopy και btnPaste). Πρόσθεσα ένα LinqToSql Classes και στον designer έκανα drag n' drop ένα πίνακα από βάση δεδομένων με test data. Τα ονόματα είναι της δικής μου βάσης και πιστεύω ότι δε θα δημιουργήσουν πρόβλημα κατανόησης. Στα αντίστοιχα button events πρόσθεσα τον παρακάτω κώδικα. Νομίζω ότι τα σχόλια είναι κατανοητά και δε χρειάζεται περαιτέρω επεξήγηση.

    private void btnCopy_Click(object sender, EventArgs e)
    {
       // Καθάρισε το DataSource για checking...
       dataGridView1.DataSource = null
       //
       // Όρισε το ling query
       //
       VSFDataClassesDataContext db = new VSFDataClassesDataContext();
       var femData = from female in db.FemaleDatas
                     select female;
       //
       // Πάρε το mapping του row
       //
       System.Data.Linq.Mapping.MetaType rowType=db.Mapping.GetTable(typeof(FemaleData)).RowType;
       //
       // Καθόρισε τις ιδιότητες των DataColumns και δημιούργησέ τα
       //
       DataColumn[] columns = new DataColumn[rowType.DataMembers.Count];
       //
       int i = 0;
       foreach (var member in rowType.DataMembers)
       {
          string memberName = member.Name; // το όνομα του column
          string memberDbType = member.DbType;
          bool canBeNull = member.CanBeNull;
          //
          Type t = typeof(string); // Default Type
          switch (memberDbType.ToUpper())
          {
             case "SMALLDATETIME":
                t = typeof(DateTime);
                break;
             case "DATETIME":
                t = typeof(DateTime);
                break;
             case "SMALLINT":
                t = typeof(short);
                break;
             case "INT":
                t = typeof(int);
                break;
             case "FLOAT":
                t = typeof(double);
                break;
          }
          columns[ i ] = new DataColumn(memberName);
          columns[ i ].DataType = t;
          columns[ i ].AllowDBNull = canBeNull;
          i++;
          //

       }
       //
       // Δημιούργησε το DataTable
       //
       DataTable table = new DataTable();
       table.TableName = "Females";
       table.Columns.AddRange(columns);
       //
       // Linq... η χαρά του Reflection
       //
       foreach (FemaleData f in femData)
       {
          PropertyInfo[] propInfo = f.GetType().GetProperties();
          DataRow dr = table.NewRow();
          for (i = 0; i < propInfo.Length; i++)
          {
             dr.BeginEdit();
             if (propInfo[ i ].GetValue(f, null) != null)
             {
                string typeStr = propInfo[ i ].PropertyType.ToString();
                if (typeStr.Contains("Nullable"))
                {
                   int fIdx = typeStr.IndexOf("[");
                   int lIdx = typeStr.IndexOf("]");
                   typeStr = typeStr.Substring(fIdx+1, lIdx - fIdx-1);
                }
                switch (typeStr)
                {
                   case "System.String":
                      dr[propInfo[ i ].Name] = propInfo[ i ].GetValue(f, null).ToString();
                      break;
                   case "System.Int16":
                      dr[propInfo[ i ].Name] = (short)propInfo[ i ].GetValue(f, null);
                      break;
                   case "System.Int32":
                      dr[propInfo[ i ].Name] = (int)propInfo[ i ].GetValue(f, null);
                      break;
                   case "System.DateTime":
                      dr[propInfo[ i ].Name] = (DateTime)propInfo[ i ].GetValue(f, null);
                      break;
                   case "System.Double":
                      dr[propInfo[ i ].Name] = (Double)propInfo[ i ].GetValue(f, null);
                      break;
                }
                //
                // Αυτό δουλεύει, αλλά...
                // dr[propInfo[ i ].Name] = propInfo[ i ].GetValue(f, null); ...AutoUnboxing ΜΠΛΙΑΑΑΑΧ!!!
                //
             }
             else
             {
                dr[propInfo[ i ].Name] = System.DBNull.Value;
             }
             dr.EndEdit();
          }
          table.Rows.Add(dr);
       }
       table.AcceptChanges();
       //
       // Serialize το DataTable και βάλτο στον ClipBoard
       //
       Stream stream = new MemoryStream();
       XmlSerializer xmlSerializer = new XmlSerializer(typeof(DataTable));
       xmlSerializer.Serialize(stream, table);
       Clipboard.Clear();
       Clipboard.SetDataObject(stream);
       //
       MessageBox.Show("Τα δεδομένα βρίσκονται στον Clipboard...");
    }

    και

    private void btnPaste_Click(object sender, EventArgs e)
    {
       XmlSerializer xmlSerializer = new XmlSerializer(typeof(DataTable));
       DataObject dObj = (DataObject)Clipboard.GetDataObject();
       Stream stream = dObj.GetData(typeof(MemoryStream)) as Stream;
       DataTable newTable = xmlSerializer.Deserialize(stream) as DataTable;
       Clipboard.Clear();
       //
       dataGridView1.DataSource = newTable;
    }

    Τα παραπάνω δουλεύουν στο παράδειγμά μου και, αν δεν έχω κάνει καμιά πατάτα στο copy - paste πρέπει να δουλέψουν και σε σένα. Βέβαια, ο κώδικας είναι ατελής μιας και δεν περιλαμβάνονται όλα τα datatypes παρά μόνο εκείνα που χρησιμοποίησα στον πίνακα. Όπως ανέφερα και παραπάνω, προτάσεις βελτίωσης είναι ευπρόσδεκτες.

    Τώρα αν δε σε ικανοποιεί αυτό μπορείς να χρησιμοποιήσεις LinqToSql serialization. Ρίξε μόνο μια ματιά σ' αυτό το άρθρο. Επίσης στο CodeProject βρήκα αυτήν τη library. Δεν την έχω χρησιμοποιήσει, αλλά μπορείς να το κάνεις εσύ και να μας δώσεις feedback. Αξίζει ακόμα να ρίξεις μια ματιά στην XmlSerializer class. Ένα λεπτό σημείο που αναφέρεται εκεί είναι το:

    The XmlSerializer cannot serialize or deserialize the following:

    Ελπίζω να βοήθησα.

    Σημ.: Συγνώμη για τα [ i ], αλλά στην προεπισκόπηση, χωρίς τα κενά, μου έβγαζε... γλόμπους!


    Ακόμα κι ένας άνθρωπος μπορεί ν' αλλάξει τον κόσμο. Μη θέλεις να κυβερνήσεις. Απλά δείξε το μονοπάτι κι ο κόσμος θ' ακολουθήσει!!
  •  27-12-2008, 18:07 47190 σε απάντηση της 47185

    Απ: Linq Objects saved and load from ClipBoard

    The XmlSerializer cannot serialize or deserialize the following: 

    Arrays of ArrayList 

    Arrays of List(T))


    Μαρκο σε ευχαριστω θα ριξω μια ματια και στα links, αν γινοταν το παραπανω θα ηταν τελεια αλλα μην τα θελουμε ολα.  περα απο το τι γινεται και ποσο ευκολο ειναι, εχει να κανει με το χρονο που διαθετω για να βρω μια λυση για αυτο το προβλημα. πρεπει να δω τι με συμφερει και τι οχι! αμα ειναι να μου παρει 10 ωρες καλητερα να μεταφερω ενα sqlquery και να κανω με "πατεντα" την δουλεια μου....θα δουμε ομως.

    σας ευχαριστω ολους για το υλικο και τις κατευθυνσεις! τωρα μενει να μελετησω την "καλητερη" και "συμφερουσα" λυση για μενα και θα απαντησω μετα απο τα αποτελεσματα.

    αντιο


    This Business Is Binary. You are a 1 or a 0. Alive or Dead.-
  •  28-12-2008, 02:51 47225 σε απάντηση της 47185

    Απ: Linq Objects saved and load from ClipBoard

    Second Thought...

    Δε νομίζω ότι έχω κανένα όφελος αν κάνω το unboxing manually τη στιγμή που έτσι κι αλλιώς κατά το assignment:

    dr[propInfo[ i ].Name] = something;

    η τιμή γίνεται πάλι boxed σε object. Συνεπώς, μάλλον επεμβαίνω σε βάρος της επεξεργασίας παρά τη διευκολύνω. Μάλιστα και ο όρος AutoUnboxing είναι ατυχής. Implicit Unboxing είναι πιο σωστό, αν και αυτός ο όρος είναι επίσης δόκιμος. Εσείς τι λέτε;

    Αν συμφωνείτε με τα παραπάνω, να κάνω editing στον κώδικα και να τον διορθώσω.


    Ακόμα κι ένας άνθρωπος μπορεί ν' αλλάξει τον κόσμο. Μη θέλεις να κυβερνήσεις. Απλά δείξε το μονοπάτι κι ο κόσμος θ' ακολουθήσει!!
  •  28-12-2008, 14:12 47235 σε απάντηση της 47225

    Απ: Linq Objects saved and load from ClipBoard

    κοιτα για να ειμαι ειληκρινης copy-paste κωδικα δεν δουλευω ποτε, τον διαβαζω και προσπαθω να κανω τον δικο μου, αλιος δεν μαθαινεις.(ασε που γραφω vb.net)

    οποτε μην τρελαινεσαι για 1-2 διορθωσης.Smile

    στο θεμα μας ομως, ειπατε οτι προσπαθω να περασω στο clipboard αντικειμενα και συγκεκριμενα format για τα οποια δεν εχει σχεδιαστει!

    εξιγιστε μου λιγο γιατι παραδhγμα αμα περασω ενα treenode με ενα απλο τροπο clipboard.SetData("TreeNode",myNode) και το διαβασω επισεις με τον ευκολο τροπο: 

    Dim MyNode as treeNode=Clipoboard.GetData("TreeNode") 

    ολα  ερχονται κανονικοτατα!? ουτε serialization ουτε csv ουτε τιποτα τοτοιο.

    το παραδειγμα με το treenode ειναι τυχαιο.

    αν μπορουσα να βρω πως λεγεται το format του List (of Object) ως string κατι μου λεει οτι θα την εκανα την δουλεια μου. εκτος κι αν επεσα στην περιπτωση που τετοιου ιδους αντικειμενα ΔΕΝ μπορει να τα μεταφερει.

    σας αφηνω να πειραματιστω και με αυτα που μου δωσατε.

    tnx againYes


    This Business Is Binary. You are a 1 or a 0. Alive or Dead.-
  •  28-12-2008, 15:02 47236 σε απάντηση της 47235

    Απ: Linq Objects saved and load from ClipBoard

    Ναι έχεις δίκιο για τα treenodes. Μάλιστα αυτό που λες τεκμηριώνεται κι εδώ. Όμως, θα σε παραπέμψω πάλι στο αρχικό μου post. Εκεί σου αναφέρω ότι 'Objects placed on the clipboard must be serializable.' Το πιο πιθανό είναι η treenode class να είναι serializable. Για να είμαι ειλικρινής, δε βρήκα άλλη ερμηνεία μιας και το treenode δεν υπάρχει στα DataFormats. Ελλείψει, λοιπόν, άλλης εξήγησης καταλήγω στο συμπέρασμα που σου ανέφερα.

    Επίσης σκέφτηκα λίγο και πάνω στη λύση που σου προτείνει ο Παναγιώτης. Δηλαδή να κάνεις copy μόνο τα IDs και στη συνέχεια να ξαναφορτώσεις τα δεδομένα. Όταν το διάβασα αρχικά, το βρήκα πολύ καλή ιδέα και ένα έξυπνο workaround. Έτσι, όμως, ίσως αντιμετωπίσεις άλλα προβλήματα. Για παράδειγμα, τι θα συμβεί αν μεταξύ copy και paste (που γίνονται σε εντελώς διαφορετικές χρονικές στιγμές μη ελεγχόμενες από εσένα) τα δεδομένα αλλάξουν; Ο χρήστης έχει συνηθίσει όταν κάνει copy - paste να παίρνει στο paste τα αρχικά του δεδομένα. Αυτό με έχει σώσει πολλές φορές. Για παράδειγμα, κάνω paste κώδικα από το internet, τον τροποποιώ και στη συνέχεια το μετανιώνω. Ξέρω ότι ο αρχικός είναι στον clipboard και δε ψάχνω πάλι την σελίδα που τον βρήκα.

    Δε ξέρω αν είναι υποχρεωτικό να έχει η εφαρμογή σου αυτού του είδους τη λειτουργικότητα (copy - paste). Αλλά αν αποφασίσεις ότι πρέπει να την έχει, ίσως θα πρέπει να πάψεις να ψάχνεις για shortcuts και να την υλοποιήσεις όπως πρέπει. Αν ο βαθμός δυσκολίας είναι μεγάλος ίσως θα πρέπει να αναθεωρηθεί το χρονοδιάγραμμα ή/και αυτή καθ' εαυτή η λειτουργία του copy - paste.

    Update:

    Αντιγράφω από το documentation της treenode που κοίταξα μόλις τώρα (βλακεία μου που δεν το κοίταξα νωρίτερα):

    Notes to Inheritors:

    Because the TreeNode class implements the ISerializable interface, derived classes intended to be serializable must also implement this interface and special constructors as described in Custom Serialization.


    Ακόμα κι ένας άνθρωπος μπορεί ν' αλλάξει τον κόσμο. Μη θέλεις να κυβερνήσεις. Απλά δείξε το μονοπάτι κι ο κόσμος θ' ακολουθήσει!!
  •  29-12-2008, 17:11 47270 σε απάντηση της 47236

    Απ: Linq Objects saved and load from ClipBoard

    Και μιας και το θίξαμε, και η DataTable class κάνει implement και το ISerializable και το IXmlSerializable. Οπότε μπορούμε απλά να γράγουμε κατά το copy:

    Clipboard.SetData("DataTable", table);

    και κατά το paste:

    DataTable newTable = (DataTable) Clipboard.GetData("DataTable");

    Απείρως πιο απλός τρόπος...


    Ακόμα κι ένας άνθρωπος μπορεί ν' αλλάξει τον κόσμο. Μη θέλεις να κυβερνήσεις. Απλά δείξε το μονοπάτι κι ο κόσμος θ' ακολουθήσει!!
  •  29-12-2008, 17:24 47271 σε απάντηση της 47270

    Απ: Linq Objects saved and load from ClipBoard

    ayto itan

    TNX man.

    Edit:

    Με βολευει να εχω ολο το αντικειμενο ακομα και με τα "περιτα" χαρακτιριστηκα του. σας ευχαριστω για το ενδιαφερον και τις διαφορετικες "ματιες" στο θεμα, ολα ειναι υπο ελεγχο και υπο εξεταση αν κατι αλλαξει στις εντολες μου.

    λυπαμε αλλα κωδικα δεν μπορω να δωσω. και γιατι ειναι θεμα δικαιομάτων που δεν μπορω να παρακουσω, και κυριως ειναι ενα μικρο κομματι αλλα για να δουλεψει στο τελικη του μορφη θελει ολοκληρο το solution.

    η λυση του μαρκου ως datatable με υπερ καληπτει και εχω ως εναλακτικη τα ID pou dinei h LINQ sto Object.

    και παλι ευχαριστω.

    καλη χρονια.


    This Business Is Binary. You are a 1 or a 0. Alive or Dead.-
  •  30-12-2008, 11:25 47295 σε απάντηση της 47270

    Απ: Linq Objects saved and load from ClipBoard

    Markos:

    Και μιας και το θίξαμε, και η DataTable class κάνει implement και το ISerializable και το IXmlSerializable. Οπότε μπορούμε απλά να γράγουμε κατά το copy:

    Clipboard.SetData("DataTable", table);

    και κατά το paste:

    DataTable newTable = (DataTable) Clipboard.GetData("DataTable");

    Απείρως πιο απλός τρόπος...


    Δεν θα συνιστούσα αυτή τη λύση για μεταφορά αντικειμένων. Καταρχήν είναι πολύ πιο περίπλοκη από την απλή μεταφορά ενός ID. Μετά, αναγκάζει το UI να μετατρέψει ένα αντικείμενο σε πίνακα, παρακάμπτωντας το διαχωρισμό data layer από UI. Αυτό οδηγεί σε κακή σχεδίαση της εφαρμογής. Επιβαρύνει την εφαρμογή με τη δημιουργία τόσο του DataTable όσο και το κόστος του Serialization. Μεταφέρει πολλά περιττά δεδομένα καθώς η εφαρμογή ήδη έχει το αντικείμενο στη μνήμη.
    Τελευταίο και κυριότερο, δεν μεταφέρει ολόκληρο το αντικείμενο. Δεν μεταφέρει properties τα οποία δεν είναι απλοί τύποι, δεν μεταφέρει private πεδία, δεν μεταφέρει relations και collections, δεν μεταφέρει με λίγα λόγια αυτά ακριβώς τα πράγματα που ενδιαφέρουν σε ένα αντικείμενο.

    Θα πρέπει να γίνει κατανοητό ότι άλλο αντικείμενο άλλο πίνακας. Το Linq to SQL κάνει ευκολότερη τη δημιουργία των αντικειμένων, δεν σου δίνει ένα νέο τρόπο να δουλεύεις με πίνακες. Η χρήση του ως ADO.NET δημιουργεί προβλήματα αλλά και έχει ως αποτέλεσμα να χάσει κανείς τα σημαντικότερα οφέλη του.
    Όταν μιλάμε για μία εφαρμογή, είναι πανεύκολο να βρει κανείς ένα αντικείμενο γνωρίζοντας το ID του. Καταρχήν, το DataContext κρατάει όλα τα αντικείμενα που έχει δημιουργήσει στη μνήμη και έτσι μπορεί να επιστρέψει άμεσα ένα αντικείμενο χωρίς να το ξαναδημιουργήσει. Ακόμα όμως και αν η κάθε φόρμα χρησιμοποιεί διαφορετικό datacontext, μπορούν να χρησιμοποιήσουν ένα κοινό Dictionary ως cache για να βρίσκουν τα κοινά αντικείμενα. Ακόμα κι αυτό όμως είναι περιττό, καθώς υπάρχει μία ακόμα απλούστερη λύση.

    Πολύ απλά, η φόρμα από την οποία ξεκινάει το copy βάζει σε μία δική της private μεταβλητή το αντικείμενο. Η φόρμα στην οποία θα καταλήξη το copy θα ζητήσει από την αρχική φόρμα να της δώσει το αντικείμενο. Το μόνο που χρειάζεται να μεταφερθεί μέσω clipboard (και αν!) είναι το όνομα της αρχικής φόρμας.
    Το "και άν" αναφέρεται στο γεγονός ότι το clipboard τελικά δεν χρειάζεται καν να παρεμβληθεί στη διαδικασία. Η αρχική φόρμα μπορεί όταν ξεκινήσει το copy να βάλει σε μία κοινά προσβάσιμη μεταβλητή το αντικείμενο και η τελική φόρμα να το πάρει από εκεί.
    Τέλος, μπορεί για όλη τη δουλειά να αρκούν τα DragDrop events των διαφόρων controls. Σε αυτή την περίπτωση μπορεί άνετα το control προορισμού να δει από που ξεκίνησε το copy απλά κοιτάζοντας την παράμετρο sender.


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  30-12-2008, 11:34 47296 σε απάντηση της 47295

    Απ: Linq Objects saved and load from ClipBoard

    Θα μπορούσες να δώσεις λίγο κώδικα;

    Προσθήκη:

    Συγνώμη για το απανωτό editing, αλλά επειδή η αρχική ερώτηση αφορά στον clipboard, τι θα γίνει αν κλείσει η φόρμα από την οποία προέρχονται τα δεδομένα ή ακόμα και η ίδια η εφαρμογή; Ίσως να θέλουμε τα στοιχεία να μπορούν να ανακτηθούν πολύ αργότερα, εφόσον βέβαια συνεχίζουν να βρίσκονται στον clipboard. Αλλά ακόμα κι αν δεν υπάρχουν τέτοιες απαιτήσεις, λίγος κώδικας θα ξεκαθάριζε τα πράγματα.


    Ακόμα κι ένας άνθρωπος μπορεί ν' αλλάξει τον κόσμο. Μη θέλεις να κυβερνήσεις. Απλά δείξε το μονοπάτι κι ο κόσμος θ' ακολουθήσει!!
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems