过滤出API结果

时间:2019-02-21 15:27:49

标签: c# winforms api

我有一个来自API的信息列表。
我想过滤掉ListBox的某些内容。为此,我做了一个public string,并在列表中添加了我想要的信息。
现在,它的设置方式可以显示我想要的信息,但在ListBox中留有空白。
我想摆脱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 :(得分:1)

用作ListBox控件的 DisplayMember 的类属性的获取程序,试图滤除不满足条件的元素。
条件是在属性getter中验证的,当当前元素不满足条件时,将强制返回nullstring.Empty

此行为在ListBox中产生空元素。

建议的解决方案当然是在用作DisplayMember的属性之前预先过滤定义ListBox数据源的元素,然后才能格式化要显示的元素:

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