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

 

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

Κάλεσμα propertys μίας άγνωστης φόρμας

Îåêßíçóå áðü ôï ìÝëïò mkoukou. Τελευταία δημοσίευση από το μέλος Demelene στις 09-01-2007, 13:46. Υπάρχουν 7 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  05-01-2007, 13:38 23071

    Κάλεσμα propertys μίας άγνωστης φόρμας

    Γειά σας,

    Έχω 5 φόρμες οι οποίες όλες έχουν το συγκεκριμένο property

    Public WriteOnly Property ContactID() As String

    Set(ByVal value As String)

    m_ContactID = value

    End Set

    End Property

    Αυτές οι φόρμες καλούνται από μία parent μέσω του

    Dim frm As Form = CType(Assembly.GetExecutingAssembly().CreateInstance(My.Application.Info.ProductName & "." & EditFormName, True), Form)

    frm.ShowDialog(Me)

    όπου το EditFormName περιέχει το όνομα μίας από τις 5 φόρμες.

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

    Ευχαριστώ

  •  05-01-2007, 15:33 23080 σε απάντηση της 23071

    Απ: Κάλεσμα propertys μίας άγνωστης φόρμας

    Θα μπορούσες να χρησιμοποιήσεις ένα base class γιά τις φόρμες αυτές, που να ενσωματώνει το property ή (καλύτερα) ένα interface. Και αντίστοιχο type casting με την CType. Αυτό θα επέτρεπε απ' ευθείας χρήση του property.

    Επίσης, μπορείς να χρησιμοποιήσεις την InvokeMember πάνω στον τύπο που φτιάχνεις.
    Aris
  •  05-01-2007, 18:55 23103 σε απάντηση της 23071

    Απ: Κάλεσμα propertys μίας άγνωστης φόρμας

    Βασικά δεν έχω χρησιμοποιήσει την InvokeMember ξανά. Μήπως μπορείς να μου πεις πιο αναλυτικά πως γίνεται διότι δεν βρήκα τον τρόπο.

    Ευχαριστώ
  •  05-01-2007, 22:43 23112 σε απάντηση της 23103

    Απ: Κάλεσμα propertys μίας άγνωστης φόρμας

    Νομίζω οτι το να υλοποιήσεις ένα κοινό interface απο τις φόρμες σου είναι πιο "καθαρή" ιδέα Άρη. Εάν θεωρήσεις οτι οι φόρμες αυτές λειτουργούν πάνω κάτω σαν plugin modules, είναι πολύ σωστό να υλοποιούν και ένα κάποιο βασικό interface όλες.

    Το reflection θα πρέπει να το δείς ως λύση last resort. Παρόλα αυτά, αν θές δες εδώ ένα παράδειγμα απο ένα παλιό post το οποίο κάνει ακριβώς αυτό που θες - set property value με reflection.

    Angel
    O:]
  •  06-01-2007, 19:54 23129 σε απάντηση της 23112

    Απ: Κάλεσμα propertys μίας άγνωστης φόρμας

    Γιά την InvokeMember, δες http://msdn2.microsoft.com/en-us/library/66btctbe.aspx.

    Πάντως, η καλύτερη μέθοδος είναι να ορίσεις (και να υλοποιήσεις στις φόρμες) ένα απλό interface, για το property.


    Aris
  •  06-01-2007, 20:23 23130 σε απάντηση της 23129

    Απ: Κάλεσμα propertys μίας άγνωστης φόρμας

    Χίλιες φορές καλύτερα να φτιάξεις ένα Interface. H VB.NET πάντως επιτρέπει να καλέσεις άγνωστες μεθόδους σε ένα αντικείμενο, αν πρώτα το κάνεις cast σε Object.


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  06-01-2007, 20:30 23131 σε απάντηση της 23129

    Απ: Κάλεσμα propertys μίας άγνωστης φόρμας

    Ο anjelinio έχει δίκιο. Με την InvokeMember μπορεί να κάνεις τη δουλειά, αλλά δεν είναι ο ενδεικνυόμενος τρόπος.

    Βάλε κάπου στο project σου το παρακάτω

    Public Interface IMyInterface

    WriteOnly Property ContactID as String

    End Interface

    Στην φόρμα σου, αμέσως μετά το Public Form myForm, γράψε την επόμενη γραμή

    Implements IMyInterface

    Άλλαξε την γραμμή Public WriteOnly Property ContactID() As String

    με την γραμμή Public WriteOnly Property ContactID() As String Implements IMyInterface.ContactID

    πριν το frm.ShowDialog(Me) γράψε το εξής:

    Dim frm1 as IMyInterface = CType(frm, IMyInterface)

    frm1.ContactID = "1234"
    Dimitris Papadimitriou
    Software Development Professional
    dotNETZone.gr News

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Διαβάστε επίσης τους όρους χρήσης.
  •  09-01-2007, 13:46 23266 σε απάντηση της 23131

    Απ: Κάλεσμα propertys μίας άγνωστης φόρμας

    Ο κώδικάς μου από μια βιβλιοθήκη που έχω φτοιάξει.



    using System;
    using System.Reflection;

    namespace GiveYourNamespace

    {
     public class Property
     {
      public Property()
      {
      }
      protected static void SetValue(object TargetObject,PropertyInfo Property,object Value)
      {
       Property.SetValue(TargetObject,Value,null);
      }
      
      protected static object GetValue(object TargetObject,PropertyInfo Property)
      {
       return Property.GetValue(TargetObject,null);
      }
      public static void SetValue(object TargetObject,string PropertyName,object Value)
      {
       if(PropertyName=="")
        return;
       PropertyInfo xInfo=GetProperty(TargetObject.GetType().GetProperties(),PropertyName);
       if(xInfo==null)
        return;
       SetValue(TargetObject,xInfo,Value);
      }
      
      public static object GetValue(object TargetObject,string PropertyName)
      {
       if(PropertyName=="")
        return null;
       PropertyInfo xInfo=GetProperty(TargetObject.GetType().GetProperties(),PropertyName);
       if(xInfo==null)
        return null;
       return GetValue(TargetObject,xInfo);
      }

      protected static PropertyInfo GetProperty(PropertyInfo[] Properties,string PropertyName)
      {
       for(int i=0;i<Properties.Length;i++)
       {
        if(PropertiesIdea.Name==PropertyName)
         return PropertiesIdea;
       }
       return null;
      }
     }
    }

    Η χρήση πχ GiveYourNamespace.Property.SetValue(oForm,"Visible",true);

     

    Στο λαμπτήρα είναι σε άγκιστρα το i του for-loop αλλά έχει bug η εμφάνιση.

     

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