【问题标题】:Cannot get JSON data into gridview无法将 JSON 数据获取到 gridview
【发布时间】:2019-01-24 17:16:15
【问题描述】:

我在下面有这段代码,我试图将数据 position and result 放入我的 searchlist 但是当我尝试将其放入代码中时 GridView1.DataSource = list; 它一直给我一个错误 System.InvalidOperationException: 'Data source is an invalid type. It must be either an IListSource, IEnumerable, or IDataSource.' 我试图完成什么是从Weather and coord 获取数据到我的gridview 中。我不确定为什么这种情况不断发生,任何帮助将不胜感激

    public partial class WebForm1 : System.Web.UI.Page
    {
        public class Result
        {
            public string id { get; set; }
            public string main { get; set; }
            public string description { get; set; }
            public string icon { get; set; }

        }


        public class SearchList
        {
            public Position coord { get; set; }
            public int resultCount { get; set; }
            public Result[] weather { get; set; }
        }
        public class Position
        {
            public double lon { get; set; }
            public double lat { get; set; }
        }


        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            string searchTerm = TextBox1.Text;
            var webRequest = (HttpWebRequest)WebRequest.Create("http://api.openweathermap.org/data/2.5/weather?q="+Server.UrlEncode(searchTerm)+"&units=metric&APPID=*Removed*");
            var webResponse = (HttpWebResponse)webRequest.GetResponse();
            if (webResponse.StatusCode == HttpStatusCode.OK)
            {
                JavaScriptSerializer json = new JavaScriptSerializer();
                StreamReader sr = new StreamReader(webResponse.GetResponseStream());
                string resString = sr.ReadToEnd();

                SearchList list = json.Deserialize<SearchList>(resString);

                GridView1.DataSource = list;
                GridView1.DataBind();
            }
            else
                Label1.Text =
                "Invalid Response" ;
        }
    }
}

【问题讨论】:

  • 你要清楚。网格中的数据应该是什么样子?
  • 你想绑定什么?您需要更新您的问题才能更清楚。
  • 如果我的假设是准确的,很可能您必须将该结果转换为投影以获得所需的结果,但您尚未阐明数据在网格中的样子跨度>
  • @Nkosi 我刚刚更新了我的问题
  • 网格视图用于数据集合,但只有一个坐标。假设在网格中如何使用?

标签: c# json web-services


【解决方案1】:

我想要完成的是从天气和坐标中获取数据到我的网格视图中。

如果您想在网格中包含所有数据,则需要将其投影到包含所有内容的类型。

using System.Linq;

//...

//... code removed for brevity 

var list = json.Deserialize<SearchList>(resString);

var data = list.weather.Select(item => new {
    lon = list.coord.lon,
    lat = list.coord.lat,
    id = item.id,
    main = item.main,
    description = item.description,
    icon = item.icon
});

GridView1.DataSource = data;
GridView1.DataBind();

//... code removed for brevity

这意味着lonlat 将针对weather 属性中的每个项目重复。

如果这些属性打算单独显示,则填充另一个控件。

【讨论】:

    【解决方案2】:

    list 只是SearchList 的一个实例,因此不实现IEnumerable 或异常中提到的其他接口(基本上是任何ListArray 或其他强类型集合)。

    如果你想在网格中显示坐标,那么它们应该是Result 类型中的属性。

     GridView1.DataSource = list.weather;
     GridView1.DataBind();
    

    如果您只打算显示单个坐标,那么您应该重新考虑您选择的控件或添加其他控件,例如 Label

    [coords] {list.Position} - Label
    [id, name, description, icon] {list.weather[0]} - GridViewRow
    [id, name, description, icon] {list.weather[1]} - GridViewRow
    [id, name, description, icon] {list.weather[2]} - GridViewRow
    

    【讨论】:

    • 我试过了,但它只返回 {id,main,description,icon} 的值它不显示坐标值
    • 更新了我的答案。您需要更清楚要绑定的内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-05
    • 2013-07-25
    • 1970-01-01
    • 2013-11-18
    相关资源
    最近更新 更多