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

 

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

Current Row σε Sorted DataGrid

Îåêßíçóå áðü ôï ìÝëïò PhilipKalogero. Τελευταία δημοσίευση από το μέλος micfarmakis στις 03-11-2004, 10:56. Υπάρχουν 1 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  16-10-2004, 00:42 290

    Current Row σε Sorted DataGrid

    Κλασσική περίπτωση : DataGrid με ένα dataTable bound πάνω του. Command button για Edit. Στο Click event του Edit Command Button νέα φόρμα σηκώνεται και πρέπει να κάνουμε Edit του row που είναι Selected στο DataGrid. Δεν θα υπήρχε κανένα πρόβλημα αν ο χρήστης δεν έκανε sort στο DataGrid. Τότε θα περνούσαμε σαν παράμετρο για edit το Rows(position) του CurrencyManager και τέλος. Δύο προβλήματα : 1ον παίζει μόνο σε DataGrids χωρίς sort, 2ον: DataRow δεν μπορεί να γίνει Bind σε φορμα. Το ΜΟΝΑΔΙΚΟ property στο οποίο μπορούμε να βασιστούμε αν γίνεται Sort είναι το Current property του CurrencyManager της φόρμας στο οποίο ανήκει το DataGrid. Δεν βασιζόμαστε στο Position property γιατί δείχνει τη θέση του Row στο DataView και όχι στο DataTable.

     

    Αφού έχουμε ένα DataSet (ας το πούμε ds) και γεμίζουμε το table μας ( ας πούμε το tableCategories” από την Northwind και το DataSet ds) το κάνουμε bind στο DataGird (DataGird1).

     

    Vb.Net

    DataGrid1.SetDataBinding(ds, "Category")

     

    C#

    DataGrid1.SetDataBinding(ds, "Category");

     

    Τώρα ο χρήστης μας κάνει browse μέσα στο DataGird, Sorting κλπ....και ξαφνικά πατάει το Edit Command Button. Πως θα μπορούσαμε να περάσουμε σαν παράμετρο το dataRow στο οποίο βρισκόμαστε στη δεύτερη φόρμα;

    Πρώτα απ’ όλα χρειαζόμαστε τον CurrencyManager που έχει δημιουργήσει η φόρμα για το DataBinding μας. Ας πούμε ότι τον ορίζουμε κάπως έτσι

     

    Vb.Net

    Dim cm  as CurrencyManager = CType(Me.BindingContext(ds,”Categories”),CurrencyManager)

     

    C#

    CurrencyManager cm = (CurrencyManager)this.BindingContext[ds,”Categories”];

     

    Θα ήθελα όμως και στην δεύτερη φόρμα μου να χρησιμοποιήσω DataBinding για τα DataColumns του DataTable σε textboxes κλπ. Κανένα πρόβλημα ...Το Current Property του CurrencyManager όταν διαχειρίζεται DataTable είναι τύπου DataRowView το οποίο (thanx God!) είναι Bindable (Implements IcustomTypeDescriptor – Ένα Interface αυτο-περιγράφει τα members του ) αντίθετα με το DataRow του DataTable που δεν μπορεί να γίνει Bind.

     

     

    Vb.Net

    Dim drvCategory As DataRowView = CType(cm.Current,DataRowView)

    Dim frm as frmCategory = new frmCategory(drvCategory)

     

    C#

    DataRowView drvCategory = (DataRowView)cm.Current;

    frmCategory frm = new frmCategory(drvCategory);

     

    Στο παράδειγμα το έχω βάλει να περνάει στον Constructor της φόρμας αλλά συνήθως κάνω bind στο Load event. Ο constructor απλά κάνει set μια form level μεταβλητή τύπου DataRowView για  να την βρει το load όταν γίνει raise. Ο καθένας μας βέβαια κάνει ό,τι τον βολεύει καλύτερα. Αυτό είναι απλά ένα παράδειγμα.

     

     

    Κώδικας Δεύτερης  Φόρμας

     

    Vb.Net

    Private _dr as DataRowView = Nothing

     

    Public Sub New(DataRowView dr)

          InitializeComponent()

          _dr = dr

    End Sub

     

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

         

          txtCategory.DataBindings.Add(“Text”,_dr,”CategoryName”)

    End Sub

     

    C#

    DataRowView _dr = null;

     

     

    public frmCategory(DataRowView dr)

    {

    InitializeComponent();

          _dr = dr;

    }

     

    Private void frmCategory_Load(object sender, System.EventArgs e)

    {

          txtCategory.DataBindings.Add(“Text”,_dr,”CategoryName”);

     

    }

     

     

    Επίσης μπορούμε περνόντας μόνο το DataRowView dr σαν παράμετρο στη φόρμα μας να έχουμε πρόσβαση στα πάντα...πχ.

     

    Vb.Net

    Το DataRow του Table = dr.Row

    To ίδιο το DataTable (τώρα μιλάμε σε DataView)= dr.Row.Table

    To DataSet που ανήκει το DataTable  = dr.Row.Table.DataSet

     

    (C# : απλά βάλτε ; στο τέλος)

     

    Επειδή αυτή τη στιγμή που γράφω δεν έχω Visual Studio και συντάσω το κείμενο στο Word, συγχωρέστε με αν υπάρχουν λάθη στον κώδικα, αλλά ελπίζω να βοήθησα όσους έχουν κολλήσει σε αυτό το «πρόβλημα». Αυτά σε πρώτη φάση. Ελπίζω να βοήθησα έστω και έναν.


    Philippos Kalogeropoulos
    M.C.P.
  •  03-11-2004, 10:56 399 σε απάντηση της 290

    Re: Current Row σε Sorted DataGrid

       Dim dt As DataTable = Me.DataGrid1.DataSource 

     Dim bm As BindingManagerBase = Me.DataGrid1.BindingContext(Me.DataGrid1.DataSource, Me.DataGrid1.DataMember) 

         Dim dr As DataRow = CType(bm.Current, DataRowView).Row


    http://www.syncfusion.com/FAQ/WinForms/
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems