2017-01-18 22 views
0

Ich arbeite an einer UWP-App auf VS2015 Community und ich habe eine Klasse Kandidat und eine andere Klasse CandidateManager gemacht. In der CandidateManager-Klasse habe ich eine Methode getCandidateByCategory erstellt, um Kandidaten anhand ihrer Kategorienummer und Seriennummer zu sortieren. Ich habe die Methode auf der Seite ScienceAndITClub.Xaml.cs aufgerufen, aber jetzt habe ich Probleme beim Abrufen der Namenseigenschaft des gefilterten Elements (um es als Inhalt von RBcand1 Radiobutton zu setzen), da ist die rote Linie unter '.' Das zeigt den Fehler "Operator". kann nicht auf Operanden vom Typ 'void' angewendet werden. " Außerdem gibt es immer nur einen Kandidaten mit einem bestimmten Satz von Kategorienummer und Seriennummer.Wie kann eine Eigenschaft einer Klasse durch Filtern einer beobachtbaren Sammlung mithilfe anderer Eigenschaften abgerufen werden?

Hier ist die Wissenschaft & ITClub.Xaml.cs:

public sealed partial class ScienceAndITClub : Page 
{ 
    private ObservableCollection<Candidate> Candidates; 

    public ScienceAndITClub() 
    { 
     this.InitializeComponent(); 
     CandidateManager.GetAllCandidates(Candidates); 


     var v = new Candidate(); 
     v = (CandidateManager.GetCandidatesByCategory(Candidates, CandidateCategoryNo.I, CandidateSNo.I).ToList<Candidate>); 
     string cand1name = v.Name; 
     RBcand1.Content = cand1name; 
    } 

    private void NextButton_Click(object sender, RoutedEventArgs e) 
    { 

    } 
} 

Hier ist der Code der Kandidaten Klasse ist, das heißt Candidate.cs:

public class Candidate 
{ 
    public int VoteCount { get; set; } 
    public string Name { get; set; } 
    public string Category { get; set; } 
    public CandidateSNo S_no { get; set; } 
    public CandidateCategoryNo Category_no { get; set; } 

} 

public enum CandidateCategoryNo 
{ 
    I, 
    II, 
    III, 
    IV, 
    V, 
    VI 
} 

public enum CandidateSNo 
{ 
    I, 
    II, 
    III 
} 

Hier ist der Code von CandidateManager Klasse ist, das heißt, CandidateManager CS-:

class CandidateManager 
{ 
    public static void GetAllCandidates(ObservableCollection<Candidate> candidates) 
    { 
     var allCandidates = getCandidate(); 
     candidates.Clear(); 
     allCandidates.ForEach(p => candidates.Add(p)); 
    } 
    public static void GetCandidatesByCategory(ObservableCollection<Candidate> candidates, CandidateCategoryNo candidateCategory, CandidateSNo Sno) 
    { 
     var allCandidates = getCandidate(); 
     var filteredCandidates = allCandidates.Where(p => p.Category_no == candidateCategory).ToList(); 
     filteredCandidates = allCandidates.Where(p => p.S_no == Sno).ToList(); 
     candidates.Clear(); 
     filteredCandidates.ForEach(p => candidates.Add(p)); 
    } 
    private static List<Candidate> getCandidate() 
    { 
     var _candidate = new List<Candidate>(); 
     _candidate.Add(new Candidate() { S_no = CandidateSNo.I, Category_no = CandidateCategoryNo.I, VoteCount = 0, Category = "Science and IT Club", Name = "A" }); 
     _candidate.Add(new Candidate() { S_no = CandidateSNo.II, Category_no = CandidateCategoryNo.I, VoteCount = 0, Category = "Science and IT Club", Name = "B" }); 
     _candidate.Add(new Candidate() { S_no = CandidateSNo.III, Category_no = CandidateCategoryNo.I, VoteCount = 0, Category = "Science and IT Club", Name = "C" }); 
     _candidate.Add(new Candidate() { S_no = CandidateSNo.I, Category_no = CandidateCategoryNo.II, VoteCount = 0, Category = "Dance Club", Name = "D" }); 
     _candidate.Add(new Candidate() { S_no = CandidateSNo.II, Category_no = CandidateCategoryNo.II, VoteCount = 0, Category = "Dance Club", Name = "E" }); 
     _candidate.Add(new Candidate() { S_no = CandidateSNo.III, Category_no = CandidateCategoryNo.II, VoteCount = 0, Category = "Dance Club", Name = "F" }); 
     _candidate.Add(new Candidate() { S_no = CandidateSNo.I, Category_no = CandidateCategoryNo.III, VoteCount = 0, Category = "Music Club", Name = "G" }); 
     _candidate.Add(new Candidate() { S_no = CandidateSNo.II, Category_no = CandidateCategoryNo.III, VoteCount = 0, Category = "Music Club", Name = "H" }); 
     _candidate.Add(new Candidate() { S_no = CandidateSNo.III, Category_no = CandidateCategoryNo.III, VoteCount = 0, Category = "Music Club", Name = "I" }); 
     _candidate.Add(new Candidate() { S_no = CandidateSNo.I, Category_no = CandidateCategoryNo.IV, VoteCount = 0, Category = "Social Service Club", Name = "J" }); 
     _candidate.Add(new Candidate() { S_no = CandidateSNo.II, Category_no = CandidateCategoryNo.IV, VoteCount = 0, Category = "Social Service Club", Name = "K" }); 
     _candidate.Add(new Candidate() { S_no = CandidateSNo.III, Category_no = CandidateCategoryNo.IV, VoteCount = 0, Category = "Social Service Club", Name = "L" }); 
     _candidate.Add(new Candidate() { S_no = CandidateSNo.I, Category_no = CandidateCategoryNo.V, VoteCount = 0, Category = "Sports Club", Name = "M" }); 
     _candidate.Add(new Candidate() { S_no = CandidateSNo.II, Category_no = CandidateCategoryNo.V, VoteCount = 0, Category = "Sports Club", Name = "N" }); 
     _candidate.Add(new Candidate() { S_no = CandidateSNo.III, Category_no = CandidateCategoryNo.V, VoteCount = 0, Category = "Sports Club", Name = "O" }); 
     _candidate.Add(new Candidate() { S_no = CandidateSNo.I, Category_no = CandidateCategoryNo.VI, VoteCount = 0, Category = "School Captain", Name = "P" }); 
     _candidate.Add(new Candidate() { S_no = CandidateSNo.II, Category_no = CandidateCategoryNo.VI, VoteCount = 0, Category = "School Captain", Name = "Q" }); 
     _candidate.Add(new Candidate() { S_no = CandidateSNo.III, Category_no = CandidateCategoryNo.VI, VoteCount = 0, Category = "School Captain", Name = "R" }); 
     return _candidate; 
    } 
} 

Auch in diesem Programm werde ich die Namen der Kandidaten als Eingabe vom Benutzer nehmen (ich habe diese Funktion noch nicht entworfen, also lege ich alle Namen als nur Alphabete), also können Sie mir bitte auch das sagen wie man eine Eingabe von der Textbox in die Namenseigenschaft eines Kandidaten umwandelt.

Hoffe, du wirst helfen ... Danke, einen schönen Tag! :)

Antwort

0

Sie übergeben das Sammlungsobjekt und ändern es in der "Filterung". In Ihrem Fall können Sie also die Methode aufrufen, die die Sammlung der ScienceAndITClub-Seite ändert - also lesen Sie davon. Wenn Sie .FirstOrDefault() verwenden, erhalten Sie den ersten Eintrag (Sie erwarten nur einen) oder null, wenn sich in der Auflistung nichts befindet.

Das sollte Ihre Fehler betreffen. Es gibt jedoch weitere Probleme, die Sie sehen werden, sobald Sie die Daten zurückbekommen.

public sealed partial class MainPage : Page 
{ 
    private ObservableCollection<Candidate> Candidates = new ObservableCollection<Candidate>(); 
    public MainPage() 
    { 
     this.InitializeComponent(); 


     CandidateManager.GetAllCandidates(Candidates); 

     //this line alters the Candidates collection 
     CandidateManager.GetCandidatesByCategory(Candidates, CandidateCategoryNo.I, CandidateSNo.I); 
     //now that the method is done, you can use the Candidates collection to get the results 
     var v = Candidates.FirstOrDefault(); //will get first candidate, or null if collection is empty 
     string cand1name = v.Name; 
     RBcand1.Content = cand1name; 
    } 
} 

UPDATE:

Ich hatte ein wenig Zeit auf dem Mittagessen, so dass ich zusammen etwas, dass Sie darüber nachdenken, wie Sie Ihr Projekt entwickeln. Lassen Sie den CandidateManager die Kandidaten verwalten und die Quelle der Daten sein. In einer Real-World-App würde ich auf die MVVM-Route gehen und Repository- und Service-Layer erstellen ... aber das sollte Ihnen den Einstieg erleichtern. Wechseln Sie zu ObservableCollection, wenn Ihre Anwendung dies erfordert.

public class CandidateManager 
{ 
    //first time CandidateManager is used, it will populate backing store 
    static CandidateManager() 
    { 
     //initialize data collection 
     Candidates = new List<Candidate>(); 
     GetCandidateData().ForEach(p => Candidates.Add(p)); 
    } 
    /// <summary> 
    /// Backing Store 
    /// </summary> 
    private static List<Candidate> Candidates { get; set; } 

    /// <summary> 
    /// Returns all candidates 
    /// </summary> 
    /// <returns></returns> 
    public static List<Candidate> GetAllCandidates() 
    { 
     return Candidates;  
    } 

    /// <summary> 
    /// Returns all candidates for a specified category 
    /// </summary> 
    /// <param name="candidateCategory"></param> 
    /// <returns></returns> 
    public static List<Candidate> GetCandidatesByCategory(CandidateCategoryNo candidateCategory) 
    { 
     return Candidates.Where(c => c.Category_no == candidateCategory).ToList(); 
    } 

    /// <summary> 
    /// Returns specific candidate based on unique category/sno combination. 
    /// Returns null if no match 
    /// </summary> 
    /// <param name="candidateCategory"></param> 
    /// <param name="Sno"></param> 
    /// <returns></returns> 
    public static Candidate GetCandidateByCategoryAndSno(CandidateCategoryNo candidateCategory, CandidateSNo Sno) 
    { 
     return Candidates.Where(c => c.S_no == Sno && c.Category_no == candidateCategory).FirstOrDefault(); 
    } 

    /// <summary> 
    /// data creation 
    /// </summary> 
    /// <returns></returns> 
    private static List<Candidate> GetCandidateData() 
    { 
     var _candidate = new List<Candidate>(); 
     _candidate.Add(new Candidate() { S_no = CandidateSNo.I, Category_no = CandidateCategoryNo.I, VoteCount = 0, Category = "Science and IT Club", Name = "A" }); 
     _candidate.Add(new Candidate() { S_no = CandidateSNo.II, Category_no = CandidateCategoryNo.I, VoteCount = 0, Category = "Science and IT Club", Name = "B" }); 
     _candidate.Add(new Candidate() { S_no = CandidateSNo.III, Category_no = CandidateCategoryNo.I, VoteCount = 0, Category = "Science and IT Club", Name = "C" }); 
     _candidate.Add(new Candidate() { S_no = CandidateSNo.I, Category_no = CandidateCategoryNo.II, VoteCount = 0, Category = "Dance Club", Name = "D" }); 
     _candidate.Add(new Candidate() { S_no = CandidateSNo.II, Category_no = CandidateCategoryNo.II, VoteCount = 0, Category = "Dance Club", Name = "E" }); 
     _candidate.Add(new Candidate() { S_no = CandidateSNo.III, Category_no = CandidateCategoryNo.II, VoteCount = 0, Category = "Dance Club", Name = "F" }); 
     _candidate.Add(new Candidate() { S_no = CandidateSNo.I, Category_no = CandidateCategoryNo.III, VoteCount = 0, Category = "Music Club", Name = "G" }); 
     _candidate.Add(new Candidate() { S_no = CandidateSNo.II, Category_no = CandidateCategoryNo.III, VoteCount = 0, Category = "Music Club", Name = "H" }); 
     _candidate.Add(new Candidate() { S_no = CandidateSNo.III, Category_no = CandidateCategoryNo.III, VoteCount = 0, Category = "Music Club", Name = "I" }); 
     _candidate.Add(new Candidate() { S_no = CandidateSNo.I, Category_no = CandidateCategoryNo.IV, VoteCount = 0, Category = "Social Service Club", Name = "J" }); 
     _candidate.Add(new Candidate() { S_no = CandidateSNo.II, Category_no = CandidateCategoryNo.IV, VoteCount = 0, Category = "Social Service Club", Name = "K" }); 
     _candidate.Add(new Candidate() { S_no = CandidateSNo.III, Category_no = CandidateCategoryNo.IV, VoteCount = 0, Category = "Social Service Club", Name = "L" }); 
     _candidate.Add(new Candidate() { S_no = CandidateSNo.I, Category_no = CandidateCategoryNo.V, VoteCount = 0, Category = "Sports Club", Name = "M" }); 
     _candidate.Add(new Candidate() { S_no = CandidateSNo.II, Category_no = CandidateCategoryNo.V, VoteCount = 0, Category = "Sports Club", Name = "N" }); 
     _candidate.Add(new Candidate() { S_no = CandidateSNo.III, Category_no = CandidateCategoryNo.V, VoteCount = 0, Category = "Sports Club", Name = "O" }); 
     _candidate.Add(new Candidate() { S_no = CandidateSNo.I, Category_no = CandidateCategoryNo.VI, VoteCount = 0, Category = "School Captain", Name = "P" }); 
     _candidate.Add(new Candidate() { S_no = CandidateSNo.II, Category_no = CandidateCategoryNo.VI, VoteCount = 0, Category = "School Captain", Name = "Q" }); 
     _candidate.Add(new Candidate() { S_no = CandidateSNo.III, Category_no = CandidateCategoryNo.VI, VoteCount = 0, Category = "School Captain", Name = "R" }); 
     return _candidate; 
    } 
} 

Dann verwenden Sie in Ihrem UI-Code einfach den Manager, um die Daten abzurufen.

public MainPage() 
{ 
    this.InitializeComponent(); 

    var c = CandidateManager.GetCandidateByCategoryAndSno(CandidateCategoryNo.II, CandidateSNo.II); 
    RBcand1.Content = c?.Name; 
} 
+0

Danke Markieren Sie aber jetzt in der Zeile "candidates.Clear();" von CandidateManager.cs, zeigt es einen Fehler beim Debuggen: "Eine Ausnahme vom Typ 'System.NullReferenceException' in SchoolElection.exe aufgetreten ist, wurde jedoch nicht in Benutzercode " –

+0

behandelt, das ist, weil es nie zugewiesen wurde ... Ich überwand Dies ist mit der "= new ObservableCollection (); Zeile in meinem Beispiel oben. –

+0

Vielen Dank Mark, ich weiß, ich habe genug Zeit verschwendet, aber würden Sie mir bitte sagen, was ist der Code in der GetCandidateData-Methode. –

Verwandte Themen