来自WebService的LINQ查询填充列表框

时间:2015-11-18 14:48:42

标签: c# linq web-services listbox win-universal-app

我编写了一个简单的Web服务,允许我插入我的SQL DB(工作正常)并从我的SQL DB中检索信息(当前不工作)。我试图将信息放入一个列表,然后将该信息显示在通用Windows应用程序的列表框中。这是我的登录信息:

WEB服务

  [OperationContract]
  List<TBL_My_Info> FindInfo(string uid);

  public List<TBL_My_Info> FindInfo(string uid)
    {
        DataClasses1DataContext context = new DataClasses1DataContext();
        var res = from r in context.TBL_My_Info where r.User_Name == uid select r;
        return res.ToList();
    }

通用网络应用

     private void btnView_Click(object sender, RoutedEventArgs e)
    {
        string s = txtNameFind.Text;
        this.Content = new Page1(s);
    }       

     public Page1(string s)
    {
        this.InitializeComponent();
        LoadData(s);          
    }

    private async void LoadData(string s)
    {
        var client = new ServiceReference1.Service1Client();
        var res = await client.FindMyInfoAsync(s);
        articleMyInfoListBox.ItemsSource = res;
    }

XAML

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <ListBox x:Name="articleMyInfoListBox"></ListBox>
</Grid>

我知道我需要myListBox.ItemSource = res;之类的内容,但在ItemSource之后res不会显示为选项。我使用using myapp.ServiceReference1;引用了我的Web服务。

简而言之,我想要做的就是在列表框中填入返回的信息列表,知道这些信息来自网络服务....

如果我这样做的方式不对,有更好的方法,请告诉我。我对LINQ没有任何经验,但对SQL有一定的经验。所以当然,SQL会更好..

修改

我目前正在我的列表框中返回

using InsertAppTest.ServiceReference1.TBL_My_Info;

1 个答案:

答案 0 :(得分:0)

为服务客户端生成的方法是异步的,并返回Task的实例,因此您需要await它们才能正确获取&#34; res&#34 ;回报价值。尝试这样的事情:

private void btnView_Click(object sender, RoutedEventArgs e)
 {
     string s = txtNameFind.Text;
     this.Content = new Page1(s);
 }

public Page1(string s)
{
    this.InitializeComponent();
    LoadData(s);
}  

private async void LoadData(string s)
{
    var client = new ServiceReference1.Service1Client();
    var res = await client.FindInfoAsync(s);
    listBox.ItemsSource = res;
}

这应该可行,但可能有更好的方法来构建异步调用 - 我对你正在尝试完成的事情了解不够。

修改

您的XAML必须设置DisplayMemberPath属性,以便它知道要显示的TBL_My_Info上的属性。现在它可能只是在每个实例上做ToString()

如果TBL_My_Info看起来像这样:

public class TBL_My_Info
{
    public int Id { get; set; }
    public string Name { get; set; }
}

然后你的XAML应该是这样的:

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <ListBox x:Name="articleMyInfoListBox" DisplayMemberPath="Name"></ListBox>
</Grid>