2017-01-18 1 views
0

Я работаю над UWP-приложением в сообществе VS2015, и я создал класс Candidate и еще один класс CandidateManager. В классе CandidateManager я создал метод getCandidateByCategory для сортировки кандидата по их номеру категории и порядковому номеру. Я вызвал метод на странице ScienceAndITClub.Xaml.cs, но теперь у меня возникла проблема с получением свойства имени отфильтрованного элемента (чтобы установить его как содержимое RBband1 radiobutton), есть красная строка под символом «.». который показывает ошибку «Оператор». не может применяться к операнду типа «void». Кроме того, всегда есть только один кандидат с определенным набором номеров категорий и серийного номера.Как получить свойство класса путем фильтрации наблюдаемой коллекции с использованием других свойств?

Вот Научном & 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) 
    { 

    } 
} 

Вот код кандидата класса, т.е. 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 
} 

Вот код класса CandidateManager, т.е. 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; 
    } 
} 

Кроме того, в этой программе я буду брать имена кандидатов в качестве ввода от пользователя (я еще не разработал эту функцию, поэтому я поместил все имена в виде только алфавитов), так что вы можете также сказать мне, что как преобразовать входные данные из текстового поля в свойство имени кандидата.

Надеюсь, вы поможете ... Спасибо, хорошо провели день! :)

ответ

0

Вы проходите в объекте коллекции и изменяете его в разделе «Фильтрация». Таким образом, в вашем случае вы можете вызвать метод, который изменит сборку коллекции ScienceAndITClub, поэтому прочитайте ее. Если вы используете .FirstOrDefault(), он даст вам первую запись (вы ожидаете только одну) или null, если в коллекции ничего нет.

Это должно касаться вашей ошибки. Однако есть больше проблем, которые вы увидите после того, как вы начнете получать данные обратно.

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:

У меня было немного времени на обед, так что я собрал то, что вы можете думать о том, как вы развиваете свой проект. Пусть КандидатManager управляет кандидатами и будет источником данных. В приложении реального мира я бы пошел по маршруту MVVM и создал репозиторий и сервисные уровни ... но это должно вас начать. Измените ObservableCollection, если это требует ваше приложение.

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; 
    } 
} 

Затем в вашем коде пользовательского интерфейса просто используйте диспетчер для извлечения данных.

public MainPage() 
{ 
    this.InitializeComponent(); 

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

Благодарю Марка, но теперь на линии «кандидаты.Clear();» из CandidateManager.cs, он показывает ошибку при отладке: «Исключение типа« System.NullReferenceException »произошло в SchoolElection.exe, но не было обработано в коде пользователя « –

+0

, потому что оно никогда не назначается ... Я преодолел это с помощью строки «= new ObservableCollection () в моем примере выше. –

+0

Большое спасибо. Я знаю, что потратил достаточно времени на ваше время, но не могли бы вы рассказать мне, что такое код в методе GetCandidateData. –

Смежные вопросы