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

本文关键字:数据 基础教程 按钮 搜索 代码 silverlight 显示 | 更新日期: 2023-09-27 17:54:15

我是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"里面他们写了"电视",然后点击"搜索"按钮,它显示了一些结果。但是我的代码不能显示这些结果,我已经调试了我的代码,它显示了我的watermark button"topic"变量内输入的字符串在我的代码行"string topic = watermark1.Text;"这意味着按钮点击甚至是正确生成的,它正在接收我在"search"点击上的水印按钮输入的内容。

我猜问题可能在这两行:

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

谁能帮我在"search"上显示结果点击按钮在"watermarkbutton"对应的输入字符串?非常感谢你的帮助。编辑:还有一件事我想提一下,我得到这种对话框上运行代码VS. http://prntscr.com/34ka0u,当我点击"是",然后我得到这种窗口http://prntscr.com/34kabo显示一些错误。

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

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

你可以像这样简单地复制并粘贴你的程序将要使用的URL到浏览器中,然后看看返回的是什么来检查API调用。当我将http://services.digg.com/stories/topic/television?count=20&appkey=http%3A%2F%2Fscottgu.com放入浏览器时(注意,我将{0}替换为您的测试查询),我只是被重定向回digg主页。这不是一个好兆头。在那之后,我找到了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());
        }
    }

如果调用失败,应该弹出错误消息