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

 

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

Πρόσβαση στα περιεχόμενα ενός listview

Îåêßíçóå áðü ôï ìÝëïò tarasiadis. Τελευταία δημοσίευση από το μέλος tarasiadis στις 01-10-2009, 15:47. Υπάρχουν 9 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  08-05-2009, 13:11 50552

    Πρόσβαση στα περιεχόμενα ενός listview

    Καλησπέρα σε όλους,
    έχω ένα Listview με το οποίο προβάλλω τα δεδομένα μιας βάσης με binding.

    Πως μπορώ να έχω πρόσβαση στα περιεχόμενα το listView;
    Προσπάθησα να κάνω κάτι όπως παρακάτω:

    var m2 = ListViewOfTasks.SelectedItem.ToString();

    και στην εμφάνιση της m2 παίρνω το εξής:
    {ProjectID = 67, Name = test, status = 0}

    Από ότι καταλαβαίνω το m2 είναι μία λίστα. Πώς μπορώ να έχω πρόσβαση στο 2ο πχ πεδίο ώστε να κάνω έναν έλεγχο που θέλω;

    Προσπάθησα m2[1] αλλά δεν...

    Μια μικρή βοήθεια...

    Ευχαριστώ.
  •  08-05-2009, 13:32 50554 σε απάντηση της 50552

    Απ: Πρόσβαση στα περιεχόμενα ενός listview

    Το ListView όταν είναι binded σε κάποιο datasource δείχνει objects από το collection του datasource. Άρα, το SelectedItem είναι ένα object τύπου Χ, ό,τι τέλος πάντων έχεις βάλει μέσα στο collection. Έτσι, αν γυρίσεις με casting το SelectedItem σε object τύπου Χ, θα έχεις πρόσβαση στα properties του object. Με αυτό που έχεις κάνει, ουσιαστικά μετατρέπεις το SelectedItem σε string και τυγχάνει να μετατρέπεται σε αυτό που βλέπεις.


    Vir prudens non contra ventum mingit
  •  08-05-2009, 13:46 50556 σε απάντηση της 50554

    Απ: Πρόσβαση στα περιεχόμενα ενός listview

    Έχω χρησιμοποιήσει τον παρακάτω κώδικα:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    private Task_GadgetDataContext db = new Task_GadgetDataContext(); 
    
    string[] priorityDescription = { "Χαμηλή", "Κανονική", "Υψηλή" };
    var OpenTaskList = (from t in db.Tasks
                                    where t.status == 0
                                    orderby t.priority descending
                                    from p in db.Projects
                                    where t.projectID == p.projectID
                                    select new
                                    {
                                        ProjectID = p.projectID,
                                        Name = p.name,
                                        PriorityDesc = priorityDescription[t.priority],
                                        t.taskID,
                                        t.name,
                                        t.projectID,
                                        t.category,
                                        t.status,
                                        t.imerominia_kataxorisis,
                                        t.priority
                                    });
    
    CollectionViewSource TaskViewSource = (CollectionViewSource)this.FindResource("TaskView");
    TaskViewSource.Source = OpenTaskList;

    και κάνω το ListView
    <ListView x:Name="ListViewOfTasks" IsSynchronizedWithCurrentItem="True" ItemsSource="{Binding Source={StaticResource TaskView}}"/>

    Μπορείς να με βοηθήσεις τι τύπου είναι ορισμένο στο collection; Πως θα κάνω casting και πως θα έχω μετά προσβαση στα στοιχεία;

    Ευχαριστώ.
  •  08-05-2009, 16:19 50565 σε απάντηση της 50556

    Απ: Πρόσβαση στα περιεχόμενα ενός listview

    To πρόβλημα είναι ότι με το Linq query φτιάχνεις ένα collection από anonymous type objects. Αυτό το "select new" που κάνεις και επιλέγεις κάποια πεδία από τον τύπο Task και κάποια από τον τύπο Project δημιουργεί τo anonymous type object collection που σημαίνει ότι ο τύπος από τα objects του collection σου είναι πρακτικά άγνωστος, δηλαδή δεν μπορείς παρακάτω να πεις "πάρε το SelectedItem και κάνε το object τύπου Χ". Λέω "πρακτικά" γιατί υπάρχουν διάφορα κόλπα για να πετύχεις κάτι τέτοιο ωστόσο δεν θα σου πρότεινα να τα χρησιμοποιήσεις. Από μόνο του, το πρόβλημά σου σού φωνάζει ότι πλέον θα πρέπει να ορίσεις μια νέα κλάση (πχ OpenTask) με πεδία σαν κι αυτά που επιλέγεις με το query και να βάλεις το query να επιτρέφει obejcts τέτοιου τύπου. Αυτό γίνεται πολύ απλά αν πεις "select new OpenTask". Κατόπιν θα μπορέσεις πολύ εύκολα να κάνεις το cast.
    Vir prudens non contra ventum mingit
  •  08-05-2009, 20:37 50578 σε απάντηση της 50565

    Απ: Πρόσβαση στα περιεχόμενα ενός listview

    Έκανα μια κλάση όπως παρακάτω:
    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
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace easytechGadget
    {
        class OpenTask
        {
            public string ProjectName;
            public int PriorityDesc;
            public string TaskName;
            public DateTime Imerominia;
    
            public OpenTask() 
            { }
    
            public OpenTask(string ProjectName1, int PriorityDesc1, string TaskName1, DateTime Imerominia1)
            {
                ProjectName = ProjectName1;
                PriorityDesc = PriorityDesc1;
                TaskName = TaskName1;
                Imerominia = Imerominia1;
            }
        }
    }
    και μετέτρεψα το select όπως παρακάτω:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    var OpenTaskList = (from t in db.Tasks
                                    where t.status == 0
                                    orderby t.priority descending
                                    from p in db.Projects
                                    where t.projectID == p.projectID
                                    select new OpenTask (p.name, t.priority, t.name, Convert.ToDateTime(t.imerominia_kataxorisis))
                                    {
                                        //ProjectID = p.projectID,
                                        ProjectName = p.name,
                                        PriorityDesc = t.priority,
                                        //TaskID = t.taskID,
                                        TaskName = t.name,
                                        //TaskProjectID = t.projectID,
                                        //Category = t.category,
                                        //Status = t.status,
                                        Imerominia = Convert.ToDateTime(t.imerominia_kataxorisis),
                                        //Priority = t.priority
                                    });
    
    
                CollectionViewSource TaskViewSource = (CollectionViewSource)this.FindResource("TaskView");
                TaskViewSource.Source = OpenTaskList;
    ¨οταν όμως εκτελώ το πρόγραμμα παρουσιάζεται κενή λίστα.
    Μου φαίνεται ότι κάνω κάτι λάθος στην κλάση ή στην κλήση της. Αυτό γιατί αν βάλω select new σκέτο φαίνεται το List κανονικά.
  •  09-05-2009, 12:24 50589 σε απάντηση της 50578

    Απ: Πρόσβαση στα περιεχόμενα ενός listview

    Δεν μπορώ να καταλάβω που κάνεις λάθος. Σε τέτοιες περιπτώσεις, καλό είναι να απομονώνεις τον κώδικα σε ένα νέο project και να δοκιμάζεις αν το functionality που προσπαθείς να πετύχεις παίζει. Μόλις το πετύχεις, αλλάζεις το βασικό project γνωρίζοντας πλέον πως θα πρέπει να συμπεριφέρεται. Δοκίμασε τα παρακάτω:

    Κλάση αντί για anonymous types:

        class ProdCat
        {
            public string CatName { get; set; }
            public string ProdName { get; set; }
        }

    XAML:

    <Window x:Class="WpfLinq.Window1"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="Window1"
            Height="300"
            Width="300">
        <Window.Resources>
            <CollectionViewSource x:Key="cvs" />
        </Window.Resources>
        <Grid>
            <ListBox x:Name="listBox1"
                     ItemsSource="{Binding Source={StaticResource cvs}}">
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <StackPanel>
                            <TextBlock  FontWeight="Bold"
                                        Text="{Binding CatName}" />
                            <TextBlock Text="{Binding ProdName}" />
                        </StackPanel>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>
        </Grid>
    </Window>

    Code behind:

        public partial class Window1 : Window
        {
            public Window1()
            {
                InitializeComponent();
                DoStuff();
            }
    
            public void DoStuff()
            {
                NorthwindDataContext cntx = new NorthwindDataContext();
    
                var ProdCatList = (from p in cntx.Products
                                   from c in cntx.Categories
                                   where p.CategoryID == c.CategoryID
                                   select new ProdCat { CatName= c.CategoryName, ProdName = p.ProductName });
    
                CollectionViewSource cvs = (CollectionViewSource)this.FindResource("cvs");
                cvs.Source = ProdCatList;
            }
        }

    To μόνο που χρειάζεσαι πλέον είναι ένα datacontext στη Northwind με τους πίνακες Products και Categories. Σ' εμένα το παραπάνω παίζει μια χαρά...

     

     

     

     

     


    Vir prudens non contra ventum mingit
  •  11-05-2009, 13:50 50617 σε απάντηση της 50589

    Απ: Πρόσβαση στα περιεχόμενα ενός listview

    ΟΚ παίζει άψογα!!!
    Απλά τώρα δεν ξέρω πως θα αναφερθώ στο slected item της list και συγκεκριμένα σε κάποιο πεδίο. Κάποια βοήθεια και εδώ.

    Thanks για τις απαντήσεις.
  •  20-05-2009, 19:39 50841 σε απάντηση της 50617

    Απ: Πρόσβαση στα περιεχόμενα ενός listview

    Από όσο προσπαθώ να καταλάβω, μέσα στο select δημιουργείται κάθε φορά ένα αντικείμενο της κλάσης OpenTask, σωστά;
    Άρα έχω πολλά αντικείμενα μέσα στο ListView μου, ένα σε κάθε γραμμή, σωστά;

    Πως μπορώ τώρα να επιλέγω κάποιο Item του ListView και να αλλάζω την τιμή κάποιου πεδίου του;
  •  01-10-2009, 10:02 54168 σε απάντηση της 50841

    Απ: Πρόσβαση στα περιεχόμενα ενός listview

    Καλημέρα σε όλους,
    προσπαθώ να βρω γενικά τρόπο να μπορώ να έχω πρόσβαση στα στοιχεία ενός listview. πχ έχω το παρακάτω listview:
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <ListView x:Name="TasksOfProject"  AlternationCount="2"                IsSynchronizedWithCurrentItem="True"
                          ItemsSource="{Binding Source={StaticResource TasksOfProjectView}}" >
                            <ListView.View>
                                <GridView x:Name="TasksOfProjectGrid">
                                    <GridViewColumn Header="id" DisplayMemberBinding="{Binding Path=taskID}" Width="10" />
                                    <GridViewColumn Header="Περιγραφή" DisplayMemberBinding="{Binding Path=name}" Width="240" />
                                </GridView>
                            </ListView.View>
                        </ListView>
    το οποίο γεμίζω με data μέσω databinding με το datacontext που φαίνεται παρακάτω:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    private project_managementDataContext ProjectFormDB = new project_managementDataContext();
    
            private CollectionViewSource TasksOfProjectViewSource;
            private BindingListCollectionView TasksOfProjectView;
    
            public ProjectForm()
            {
                InitializeComponent();
            }
    
            private void ProjectForm_Loaded(object sender, RoutedEventArgs e)
            {
                this.TasksOfProjectViewSource = (CollectionViewSource)this.FindResource("TasksOfProjectView");
    TasksOfProjectView.Source = ProjectFormDB.Tasks;
                this.TasksOfProjectView = (BindingListCollectionView)this.TasksOfProjectViewSource.View;
             }
    Το θέμα είναι πως κάνοντας κλικ πάνω σε ένα item του listview θα μπορώ να κρατάω τα στοιχεία πχ της στήλης id ώστε να κάνω κάποια ενέργεια για το item αυτό.
    Ευχαριστώ.
  •  01-10-2009, 15:47 54186 σε απάντηση της 54168

    Απ: Πρόσβαση στα περιεχόμενα ενός listview

    Μου δώσανε απάντηση στο MSDN Forum
    TasksOfProject.SelectionChanged += (s, e) =>
                    {
                        var id = ((YourTaskClass)e.AddedItems[0]).taskID;
                    };
    Δουλεύει κανονικά.
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems