【问题标题】:Return List Items from .DLL and show them in ListBox从 .DLL 返回列表项并在 ListBox 中显示它们
【发布时间】:2016-05-09 19:26:28
【问题描述】:

我需要创建一个DLL 类库,它从HTTP 站点获取JSON 格式化属性并将它们显示在List 中。当我制作了一个Test 应用程序(可执行,而不是DLL)时,它可以工作并且可以执行我想要的操作,但是在制作.DLL 并尝试从可执行应用程序中调用它时遇到问题(这些项目应该显示在WPF 列表框)。在我的DLL 我有以下课程:

public class Definitions
{
    public double id { get; set; }
    public double uid { get; set; }
    public string user { get; set; }
    public string start { get; set; }
    public string end { get; set; }
    public double dur { get; set; }
    public string project { get; set; }

    public override string ToString()
    {
        dur = dur / 100000;
        return string.Format(
            "TimeID: {0}, UserID: {1}, Name: {2}, Project: {3}, Start: {4}, End: {5}, Duration: {6} min", 
            this.id,
            this.uid,
            this.user,
            this.project,
            Convert.ToDateTime(this.start),
            Convert.ToDateTime(this.end),
            this.dur);
    }
}

public class MainList
{
    public List<Definitions> data { get; set; }      
}

我想我写的方法不对:

public static ??returntype?? GetData()
{ 
    //...
    var f = Newtonsoft.Json.JsonConvert.SerializeObject(obj, Newtonsoft.Json.Formatting.Indented);

    var allDefinitions = JsonConvert.DeserializeObject<MainList>(f);

    if (allDefinitions.data.Count == 0)
    {
        break;
    }

    return allDefinitions.data;//??
}

我不知道返回类型应该是什么。当我创建Test 应用程序时,我将我的代码放入一个循环中并且它可以工作:

for (var i = 0; i < allDefinitions.data.Count; i++)
{
    Console.WriteLine(allDefinitions.data[i]);
}

但在这种情况下,它是一个EXE 应用程序,并且代码在Main 方法中。现在它应该是DLL 并且应该在WPF ListBox 中显示所有这些ListItems。感谢您的帮助。

编辑: 我认为我的方法本身和Main 方法中的对象实例有问题。该方法必须遍历 WEB 页面,因为 API 每个请求只允许 50 个项目,如果超过 50 个,则我必须转到第二页,依此类推。我遇到了 2 个问题,第一个是我收到一个错误,not all paths return a value 是无法访问的 page++,第二个是如果我在我的 Main 方法中说 List&lt;Definitions&gt; myList = GetData(); 然后我得到 Cannot implicitly convert type void into System.Collections.GenericList&lt;Definitions&gt; 我' m 发布整个方法:

public static List<Definitions> GetData()
    { 
        string result = "";


        for (int page = 1; result != null; page++)
        {
            string fpage = "&page=" + page;                            
            string ApiToken = "something";
            string url = " https://someWebSite" + fpage;                          
            string userpass = ApiToken + ":api_token";
            string userpassB64 = Convert.ToBase64String(Encoding.Default.GetBytes(userpass.Trim()));
            string authHeader = "Basic " + userpassB64;

            HttpWebRequest authRequest = (HttpWebRequest)WebRequest.Create(url);
            authRequest.Headers.Add("Authorization", authHeader);
            authRequest.Method = "GET";
            authRequest.ContentType = "application/json";
            var response = (HttpWebResponse)authRequest.GetResponse();

            Stream stream = response.GetResponseStream();

                StreamReader sr = new StreamReader(stream);
                result = sr.ReadToEnd();

                var obj = Newtonsoft.Json.JsonConvert.DeserializeObject(result);
                var f = Newtonsoft.Json.JsonConvert.SerializeObject(obj, Newtonsoft.Json.Formatting.Indented);

               var allDefinitions = JsonConvert.DeserializeObject<MainList>(f);

                if (allDefinitions.data.Count == 0)
                {

                    break;
                }


                return allDefinitions.data;

            }

【问题讨论】:

  • 你有没有把__declspecs 和类似的?
  • 看起来GetData 应该返回一个List&lt;Definitions&gt;allDefinitions.data 是什么)
  • @crashmstr 是的,我试过了,然后return allDefinitions.data; 但后来我收到错误not all code paths return a value
  • @user3613744 - 该错误与返回类型无关。它告诉您代码中存在不会返回任何内容的潜在路径。
  • @user3613744 那么您没有显示所有代码。如果出现问题,您只需要确保返回一些东西(nullnew List&lt;Definitions&gt;())。

标签: c# wpf list dll


【解决方案1】:

您可以返回 'allDefinitions.data;'如您所料,然后在 WPF 应用程序上对您收到的数据执行相同的循环,并将它们添加到绑定到列表视图的“itemsource”的 ObservableCollection。

即从 DLL 接收数据后,在 WPF App 上

 for (var i = 0; i < allDefinitions.data.Count; i++)
            {

                myListItems.Add(allDefinitions.data[i]);

            }

请注意,myListItems 是一个 ObservableCollection,它在其设置器上实现了对 INotifyPropertyChanged 的​​提升。

【讨论】:

    【解决方案2】:

    从函数GetData()返回alldefinitions.data,返回类型应该是List&lt;Definitions&gt;

    public static List<Definitions> GetData()
    { 
        var f = Newtonsoft.Json.JsonConvert.SerializeObject(obj, Newtonsoft.Json.Formatting.Indented);
        var allDefinitions = JsonConvert.DeserializeObject<MainList>(f);
    
        return allDefinitions.data;
    }
    

    然后在您的 WPF 应用程序中,您只需迭代您的列表并将项目添加到列表框

     List<Definitions> myList = GetData();
     for (var i = 0; i < myList.Count; i++)
     {
          ListBoxItem newItem = new ListBoxItem();
          newItem.Content = myList[i];
          YourListBox.Items.Add(newItem);
     }
    

    编辑 从您的评论看来,您正在尝试为 5 页获取 50 个定义。

    public static List<Definitions> GetData()
    { 
        string result = "";
        List<Definitions> allDefinitions =  new List<Definitions>();
        for (int page = 1; page <= 5; page++)
        {
          for( int i = 0;i < 50;i++)
          {
            string fpage = "&page=" + page;                            
            string ApiToken = "something";
            string url = " https://someWebSite" + fpage;                          
            string userpass = ApiToken + ":api_token";
            string userpassB64 = Convert.ToBase64String(Encoding.Default.GetBytes(userpass.Trim()));
            string authHeader = "Basic " + userpassB64;
    
            HttpWebRequest authRequest = (HttpWebRequest)WebRequest.Create(url);
            authRequest.Headers.Add("Authorization", authHeader);
            authRequest.Method = "GET";
            authRequest.ContentType = "application/json";
            var response = (HttpWebResponse)authRequest.GetResponse();
    
            Stream stream = response.GetResponseStream();
    
            StreamReader sr = new StreamReader(stream);
            result = sr.ReadToEnd();
    
            var obj = Newtonsoft.Json.JsonConvert.DeserializeObject(result);
            var f = Newtonsoft.Json.JsonConvert.SerializeObject(obj, Newtonsoft.Json.Formatting.Indented);
    
            var definition = JsonConvert.DeserializeObject<Definitions>(f);
            allDefinitions.Add(definition);
          }
        }
        return allDefinitions;
     }
    

    【讨论】:

    • 是的,我试过了,但问题是我无法从我的应用程序中调用该方法(不知道为什么)
    • 您是否在应用程序中引用了 dll?
    • 是的,我是。我可以得到 GetData();作为静态函数,但我无法将其连接到列表。最后我得到 NullException
    • 如果我在我的 Main 方法中说 List myList = GetData();然后我得到无法将类型 void 隐式转换为 System.Collections.GenericList。我发布了整个方法,也许我在其他地方犯了错误
    • 您的 for 循环结果不正确!= null 不是有效条件,使用页面值说 page
    猜你喜欢
    • 2017-01-30
    • 2016-03-29
    • 2012-05-29
    • 1970-01-01
    • 2021-07-02
    • 1970-01-01
    • 2019-08-21
    • 2014-06-17
    • 1970-01-01
    相关资源
    最近更新 更多