Выберите элементы, которые не начинаются с - PullRequest
0 голосов
/ 18 февраля 2019

У меня проблема с WinForm (Visual Studio 2017).

Прежде чем я подумаю, если дать вам некоторые подробности, это может принести пользу всем нам.Я буду публиковать только те детали, которые, по моему мнению, имеют отношение к вопросу, поэтому, если вы считаете, что я что-то упускаю, не стесняйтесь сообщить мне.Спросите меня также, если я не объяснил некоторые части должным образом.Я использовал метод DataTableReader.GetSchemaTable для того, чтобы что-то делать, если это вообще актуально.

Я хотел, чтобы элементы списка отображались в Textbox, который затем копировался в текстовый файл,ECC ECC.Над Textbox я сделал DataGrid, в котором вы можете видеть NameField s, и есть флажок с именем "Able", который определяет, будут ли эти поля показываться (проверяться) в Textbox ниже или нет (не проверено).

Прежде всего я создал класс, в котором я задаю нужные мне свойства в коллекции, такие как Имя и условие «Способный».Я установил это значение по умолчанию (здесь не показано), поэтому для всех NameField s галочка в DataGridView в настоящее время проверена.Это означает, что они будут отображаться в Textbox ниже, готовые к «filetexted».

public class Info {
    public string NameField {get; set;}
    public bool Able {get; set;}
}

Затем в другом классе я создал Observable Collection, которая будет заполнена этими NameField s.выше (используя функцию Fill из SqlDataAdapter, которую я здесь не буду показывать).

public class Do {
    public ObservableCollection<Info> Projects = new ObservableCollection<Info>();
}

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

var change = Projects.OrderByDescending(c => 
    c.NameField.StartsWith("OS")).ToList();
Projects.Clear();
foreach (Info aInfo in change) {
    Projects.Add(aInfo);
}

Теперь мне нужно, чтобы все элементы в той же коллекции, которые НЕ начинаются с этих букв, отключили проверку на Able.Таким образом, это означает, что у DataGrid будет отмечен галочкой пункт «Able», и эти точные NameField s не появятся в TextBox.

У меня есть реальные проблемы с этим иКажется, я не могу найти решение, поэтому я прошу вас, ребята.Заранее спасибо.

1 Ответ

0 голосов
/ 18 февраля 2019

Вот предложение о том, как отсортировать вашу коллекцию так, чтобы элементы, начинающиеся с ваших критериев сортировки / поиска, были перечислены вверху, и чтобы все поля .Able в элементах, которые удовлетворяли критериям сортировки / поиска, были установлены в trueв то время как остальное установлено в ложь.

В листинге кода содержится класс для ваших объектов Info, класс с методом для сортировки и обновления вашей коллекции.И в конце класс с методом, чтобы проверить, что все это работает.Я надеюсь, что приведенный ниже список кода достаточно прокомментирован, чтобы сделать его самообъяснимым.

using System.Linq;
using System.Diagnostics;
using System.Collections.ObjectModel;


namespace TestSpace
{
    public class Info //Your original class for the project info objects.
    {
        public string NameField { get; set; }
        public bool Able { get; set; }
    }

    public class ProjectSorter  //COMMENT: Renamed your "Do" class to "ProjectSorter" since it seems more understandable.
    {
        // COMMENT:
        // In this proposed solution the SortProjects method is changed so that it now takes two parameters.        
        // The parameters are the project collection to be sorted, and the sort/search criteria.The procject  
        // collection to be sorterd is sent by ref so that any changes to it is reflected back to the caller.
        // (See https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/ref for more
        // information on passing objects by ref.)

        public void SortProjects(ref ObservableCollection<Info> projectCollectionToSort, string sortCriteria)
        {
            // As allready solved this will sort the collection based on the sort criteria into a new list.
            var updatedProjectList =
            projectCollectionToSort.OrderByDescending(c => c.NameField.StartsWith(sortCriteria)).ToList();

            // Using the list's .ForeEach method we iterate through the new list and uses a lambda expression
            // to set .Able to true or false based on the sort/search criteria.
            updatedProjectList.ForEach(c => {
                if (c.NameField.StartsWith(sortCriteria)) { c.Able = true; } else { c.Able = false; }
            });

            // We then reset our collection to a new ObservableCollection<Info> and fills it with the new 
            // sorted and updated list.
            projectCollectionToSort = new ObservableCollection<Info>(updatedProjectList);

            // Work done.
        }
    }

    public static class TestTheCode
    {
        // Method to test the ProjectSorter.SortProjects() method.
        public static void RunSortCollectionTest()
        {
            ProjectSorter projectSorter = new ProjectSorter();

            // Just for the purpose of this example an example collection is populated
            // here with some data to work with.
            // As you describe for your list the default value for Able is set to true.
            ObservableCollection<Info> projects = new ObservableCollection<Info>()
            {
                new Info { NameField="PER", Able = true},
                new Info { NameField="ALEX", Able = true},
                new Info { NameField="OSCAR", Able = true},
                new Info { NameField="ANDY", Able = true}
            };

            // We sort the collection "projects" by sending it by ref to the projectSorter.SortProjects()
            // method, together with the sort/search criteria.
            projectSorter.SortProjects(ref projects, "OS");

            // To display that the collection "projects" are now sorted as intended, and that all the
            // .Able fields are satt correctly true or false, we iterate through the projects collection 
            // and print the values for NameField and Able to the Output window (debug).
            foreach (Info aInfo in projects)
            {
                Debug.Print(aInfo.NameField + "  -->  " + aInfo.Able);
            }
        }
    }
}

Чтобы запустить тест, просто вызовите TestTheCode.RunSortCollectionTest() из своего кода.

...