Отфильтровать результаты API - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть список информации, поступающей из API.
Я хочу отфильтровать определенные элементы для ListBox.Я сделал public string для этого и добавил нужную информацию в список.
Теперь, как я его настроил, он отображает информацию, которая мне нужна, но оставляет пустые места в ListBox.
Iхочу избавиться от этого пробела в ListBox.Я пытался вернуть null и string.Empty

get 
{
    if( Status == 1)
    {
        string queues = $"{SSDocument.SSDocumentID} | {LastActionUser} | {LastAccessed} | {Queue.Name}";
        return queues;
    }
    else 
    {
        return null;
    }
}

Информация с использованием GET:

public void DocumentList(int sender)
{
    if (sender == 1)
    {
        StatusList f = new StatusList();
        f.Show();

        st = rClient.makeRequest(S9());
        f.listBox1.DataSource = st;
        f.listBox1.DisplayMember = "QueueList";
    }
}

Запрос rClient.makeRequest(s9()):

public List<stats> makeRequest(string endPoint)
{
    signOn so = new signOn();
    string strResponseVlaue = string.Empty;
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(endPoint);
    request.Method = httpMethod.ToString();
    request.Method = "GET";
    string userName = so.grabUser();
    string passWord = so.grabPass();
    string domain = System.Configuration.ConfigurationManager.AppSettings["Domain"];
    request.Headers["Authorization"] = "Basic " + Convert.ToBase64String(Encoding.Default.GetBytes($"{domain}{userName}:{passWord}"));

    using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
    {
        if (response.StatusCode != HttpStatusCode.OK)
        {
            throw new ApplicationException("Error Code: " + response.StatusCode.ToString());
        }

        //Process the response stream
        using (Stream responseStream = response.GetResponseStream())
        {
            if (responseStream != null)
            {
                using (StreamReader reader = new StreamReader(responseStream))
                {
                    strResponseVlaue = reader.ReadToEnd();
                }
            }
        } //End of Response Stream
    }// End Of Using Reponse
    var obj = JsonConvert.DeserializeObject<List<stats>>(strResponseVlaue);
    return obj;
}

1 Ответ

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

Получатель свойства класса, используемого в качестве DisplayMember элемента управления ListBox, пытается отфильтровать элементы, которые не удовлетворяют условию.
Условие проверено в получателе свойства, заставляя возвращать null или string.Empty, когда текущий элемент не удовлетворяет условию.

Это поведение создает пустые элементы в ListBox.

Предложенное решение, конечно, состоит в предварительной фильтрации элементов, которые определяют источник данных ListBox, перед тем как свойство, используемое как DisplayMember, может отформатировать отображаемые элементы:

[ListBox].DataSource = st.Where(cls => [Condition]).ToList();

Вероятно, лучшим решением является создание класса, который может выполнять фильтрацию самостоятельно.
Пример:

int Sender = 1;

TestClass test = new TestClass();
test.AddRange(new []
{
    new TestClass() { Status = 0, QueueName = "Queue1", SSDocumentID = 1 },
    new TestClass() { Status = 1, QueueName = "Queue1", SSDocumentID = 1 },
    new TestClass() { Status = 1, QueueName = "Queue2", SSDocumentID = 2 },
    new TestClass() { Status = 0, QueueName = "Queue3", SSDocumentID = 3 },
    new TestClass() { Status = 1, QueueName = "Queue4", SSDocumentID = 4 },
});

listBox1.DisplayMember = "DisplayMember";
listBox1.DataSource = test.Filter(Sender).ToList();


public class TestClass
{
    public TestClass() => this.Members = new List<TestClass>();
    public int Status { get; set; }
    public int SSDocumentID { get; set; }
    public string QueueName { get; set; }
    public string DisplayMember => 
        $"{this.SSDocumentID} | {this.QueueName}";

    public List<TestClass> Members { get; }
    public void Add(TestClass element) => this.Members.Add(element);
    public void AddRange(IEnumerable<TestClass> elements) => this.Members.AddRange(elements.ToArray());
    public IEnumerable<TestClass> Filter(int status)
    {
        if (this.Members.Count == 0) return null;
        return this.Members.Where(st => st.Status == status);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...