Silverlight中的c#代码不显示搜索按钮上的数据(基础教程)

时间:2014-03-27 13:27:21

标签: c# asp.net xml silverlight silverlight-5.0

我是c#silverlight初学者。我正在练习一些我在此链接http://weblogs.asp.net/scottgu/pages/silverlight-tutorial-part-3-using-networking-to-retrieve-data-and-populate-a-datagrid.aspx

上找到的样本

我已在此链接中准确编写了代码。这个链接提供了一个GUI来搜索"主题"来自给定的链接(请参阅代码以了解详细信息)。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Xml;
using System.Xml.Linq;
using System.Windows.Messaging;

namespace shekhar_basic
{
    public partial class MainPage : UserControl
    {
        public MainPage()
        {
            InitializeComponent();
        }
        void SearchBtn_Click(object sender, RoutedEventArgs e)
        {
            string topic = watermark1.Text; //this topic receives the data correctly written on watermark, this watermark1 is the name of that button using xml.
            string diggUrl = String.Format("http://services.digg.com/stories/topic/{0}?count=20&appkey=http%3A%2F%2Fscottgu.com", topic); //I think the problem creating part is here.

            WebClient diggServices = new WebClient();
            diggServices.DownloadStringCompleted += new DownloadStringCompletedEventHandler(DiggService_DownloadStoriesCompleted);
            diggServices.DownloadStringAsync(new Uri(diggUrl));
        }

        void DiggService_DownloadStoriesCompleted(object sender, DownloadStringCompletedEventArgs e)
        {
            if (e.Error == null)
            {
                string result = e.Result;                
            }
        }

        void DisplayStories(string xmlContent)
        {
            XDocument xmlStories = XDocument.Parse(xmlContent);
            var stories = from story in xmlStories.Descendants("story")
                          where story.Element("thumbnail") != null && !story.Element("thumbnail").Attribute("src").Value.EndsWith(".gif")
                          select new digStory
                          {
                              Id = (int)story.Attribute("id"),
                              Title = ((string)story.Element("title")).Trim(),
                              Description = ((string)story.Element("description")).Trim(),
                              ThumbNail = (string)story.Element("thumbnail").Attribute("src").Value,
                              HrefLink = new Uri((string)story.Attribute("link")),
                              NumDiggs = (int)story.Attribute("diggs"),
                              UserName = (string)story.Element("user").Attribute("name").Value,
                          };
            dGStoreList1.SelectedIndex = -1;
            dGStoreList1.ItemsSource = stories;

        }

    }
}

我的xml代码是:

<UserControl x:Class="shekhar_basic.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:local="clr-namespace:Microsoft.Windows.Controls;assembly=Microsoft.Windows.Controls.WatermarkedTextBox"
    mc:Ignorable="d" xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk"> 


    <Grid Background="AntiqueWhite">

        <Grid.RowDefinitions >
            <RowDefinition Height="40" />
            <RowDefinition Height="*" />     
        </Grid.RowDefinitions>

        <Grid Grid.Row="0" Margin="7" ShowGridLines="True" >
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*"/>
                <ColumnDefinition Width="120"/>
                <ColumnDefinition Width="50"/>
            </Grid.ColumnDefinitions>
            <Border Grid.Column="0" CornerRadius="10" Background="Turquoise" >
                <TextBlock Text=" Dig search" Foreground="Blue"  />                 
            </Border>

            <local:WatermarkedTextBox Name ="watermark1"  Grid.Column="1" Watermark="Enter the search" Margin="0,0,-7,0" />
            <Button Grid.Column="2" Content="search" Click="SearchBtn_Click" />
        </Grid>
        <TextBlock Grid.Row="1" Margin="10" Foreground="Black">
            Todo : Stories will display here
        </TextBlock>
        <sdk:DataGrid Grid.Row="1"  Margin="5" Name="dGStoreList1">
            </sdk:DataGrid>
    </Grid>

</UserControl>

与此代码对应的GUI为:http://prntscr.com/34k0d3。它应该显示的内容是这样的:http://prntscr.com/34k0lx,你可以看到他们在"watermark button"里写过&#34;电视&#34;然后单击&#34;搜索&#34;按钮它显示一些结果。但是我的代码无法显示我已经调试过我的代码的结果,它显示了我的watermark button "topic"里面的"string topic = watermark1.Text;变量中输入的字符串,代码在行"search"&#34;这意味着按钮点击甚至已正确生成,并且它正在接收我在diggServices.DownloadStringCompleted += new DownloadStringCompletedEventHandler(DiggService_DownloadStoriesCompleted); diggServices.DownloadStringAsync(new Uri(diggUrl)); 点击时在水印按钮中输入的内容。

我认为问题可能在于以下两行:

"search"

有人可以帮助我在相应输入的字符串inn "watermarkbutton"上的{{1}}点击按钮上显示结果吗?这个帮助比你多得多了。 编辑:我还想提一件事,我在VS中运行代码时得到这种对话框。 http://prntscr.com/34ka0u当我点击&#34;是&#34;然后我得到了这种窗口http://prntscr.com/34kabo,显示出一些错误。

1 个答案:

答案 0 :(得分:2)

这里有几件事情要发生。首先也是最重要的是,digg API显然已被关闭。

您通常可以通过简单地将程序将要使用的URL复制并粘贴到浏览器中来查看这样的API调用,并查看返回的内容。当我将http://services.digg.com/stories/topic/television?count=20&appkey=http%3A%2F%2Fscottgu.com放入浏览器时(注意我用测试查询替换了{0}),我只是被重定向回digg主页。不是一个好兆头。在此之后狩猎导致我the FAQ,其中提到API现在处于脱机状态。

您还应该查看该API字符串并稍微关注一下:它中有appkey=http://scottgu.com - 通常当您看到类似的内容时,它是一个提示您应该获得自己的API密钥。

除此之外,您的代码也不会显示结果,因为您在教程中没有那么远。你在哪里

string result = e.Result;

在本教程中,他继续使用DisplayStories方法调用替换它,这是实际解析结果的方法。

为什么你无法跟踪此问题,很大一部分原因可能是代码故意忽略错误,请参阅:

void DiggService_DownloadStoriesCompleted(object sender, DownloadStringCompletedEventArgs e)
    {
        if (e.Error == null)
        {
            string result = e.Result;                
        }
    }

如果e.Error不为null - 如果从服务本身返回了问题 - 您将忽略它,并且无法知道。请考虑一下:

void DiggService_DownloadStoriesCompleted(object sender, DownloadStringCompletedEventArgs e)
    {
        if (e.Error == null)
        {
            string result = e.Result;                
        }
        else 
        {
            MessageBox.Show(e.Error.ToString());
        }
    }

如果你的通话失败,那应该弹出一条关于错误的消息。