Arslan jappa Ответов: 2

Как показать данные в gridview асинхронно в ASP.NET-что?


My code is properly work in desktop application show data asynchronously in data gridview but when I use same code in web form it throws exception GridView1 was null. at GridView1.DataSource = table;.While debugging data is completely working just want to put that data into webform gridview.What changes should i made to acheive my task.


Что я уже пробовал:

public partial class _Default : System.Web.UI.Page
{
    public _Default()
    {

        InitTable();
    }

    public class NameAndScore
    {
        public string Name { get; set; }
        public string Score { get; set; }
    }
   
    DataTable table;
    HtmlWeb web = new HtmlWeb();


    private async Task<List<NameAndScore>> GameRankingsFromPage(int pagenum)
    {
        string url = "https://www.ebay.com/sch/i.html?_nkw=xbox+one&_in_kw=1&_ex_kw=&_sacat=0&LH_Complete=1&_udlo=&_udhi=&_ftrt=901&_ftrv=1&_sabdlo=&_sabdhi=&_samilow=&_samihi=&_sadis=15&_stpos=&_sargn=-1%26saslc%3D1&_salic=1&_sop=12&_dmd=1&_ipg=50&_fosrp=1";
        //    string url = "https://www.gamerankings.com/browse.html";

        if (pagenum != 0)
            url = "https://www.ebay.com/sch/i.html?_sacat=0&LH_Complete=1&_udlo=&_udhi=&_ftrt=901&_ftrv=1&_sabdlo=&_sabdhi=&_samilow=&_samihi=&_sadis=15&_stpos=&_sop=12&_dmd=1&_fosrp=1&_nkw=xbox+one&_pgn=" + pagenum.ToString() + "&_skc=50&rt=nc";

        var doc = await Task.Factory.StartNew(() => web.Load(url));

        var namenodes = doc.DocumentNode.SelectNodes("//*[contains(@id,'item')]/h3/a");
        var scorenodes = doc.DocumentNode.SelectNodes("//*[contains(@id,'item')]/ul[1]/li[1]/span");
        var names = namenodes.Select(node => node.InnerText.Trim('\r', '\n', '\t'));
        var scores = scorenodes.Select(node => node.InnerText.Trim('\r', '\n', '\t'));


        if (namenodes == null || scorenodes == null)
            return new List<NameAndScore>();
       


        return names.Zip(scores, (name, score) => new NameAndScore() { Name = name.ToString(), Score = score.ToString() }).ToList();
    }
    protected async void Page_Load(object sender, EventArgs e)
    {
        int pageNume = 0;
        int id = 0;
        var rankings = await GameRankingsFromPage(0);
        while (rankings.Count > 0)
        {
            foreach (var ranking in rankings)
                
          table.Rows.Add(id++, ranking.Name, ranking.Score);
            pageNume++;
            rankings = await GameRankingsFromPage(pageNume);
        }
        
    }

    private void InitTable()
    {
        table = new DataTable("Xbox Prices");
        table.Columns.Add("ID", typeof(string));
        table.Columns.Add("Name", typeof(string));
        table.Columns.Add("Score", typeof(string));

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

    }

F-ES Sitecore

Если вы думаете, что это будет постепенно заполнять таблицу в браузере, то этого не произойдет. В asp.net сервер ждет, пока весь ваш код не будет запущен и весь ваш html-код не будет сгенерирован, прежде чем отправить html-код в браузер за один раз.

2 Ответов

Рейтинг:
1

AnkushK1

Это происходит потому, что конструктор страницы вызывается до события page_load. Вы не можете получить доступ ни к одному ASP.NET управление в конструкторе, потому что они загружаются после вызова конструктора. Проще говоря, если вы хотите использовать какой-либо элемент управления в ASP.NET, он должен быть в Page_Load или любом другом методе жизненного цикла Страницы, а не в конструкторе. Возможно, вы захотите пройти через события жизненного цикла страницы, используя следующий url-адрес

ASP.NET обзор жизненного цикла Страницы | Microsoft Docs[^]


Arslan jappa

Итак, куда я должен поместить свой контроль, чтобы получить результат в этом сценарии?

AnkushK1

Вы можете либо использовать событие Page_Init, которое первым вызывается при инициализации элементов управления, однако Page_Load также должен работать для вас, так как он вызывается после Page_Init. Таким образом, Вы сможете получить свой GridView в обоих этих событиях.

Arslan jappa

Я поставил inittable в pageLoads все еще не работает.

AnkushK1

Вы имеете в виду, что все еще получаете нулевое исключение? Можете ли вы поделиться кодом, который вы добавили?

Arslan jappa

братан, я просто поставил функцию InitTable() в pageload и удалил из конструктора.на самом деле этот код ломает данные с сайта, такие как получить цену и название мобильного телефона и т.д., и работает отлично.Но я хочу реализовать его в веб-форме.Я думаю, что gridview загружается сразу же после запуска программы, прежде чем получать данные с веб-сайта, что является причиной того, что программа выбрасывает нулевое исключение.Я не знаю, какие изменения я могу сделать, чтобы запустить в веб-форме, это моя цель.

Рейтинг:
0

AnkushK1

Я воспроизвел ваш сценарий в своей системе. Я должен сделать несколько изменений, таких как привязка gridview после того, как данные были сопоставлены в таблицу. Кроме того, в то время как блок, кажется, создает бесконечный цикл, поэтому я должен прокомментировать это (возможно, вам придется еще раз проверить эту логику). Вот окончательный код, и он сработал для меня, и я могу видеть данные на веб-странице

protected async void Page_Load(object sender, EventArgs e)
	{
		InitTable();
		int pageNume = 0;
		int id = 0;
		var rankings = await GameRankingsFromPage(0);
		//while (rankings.Count > 0)
		//{
			foreach (var ranking in rankings)

				table.Rows.Add(id++, ranking.Name, ranking.Score);
			pageNume++;
			rankings = await GameRankingsFromPage(pageNume);
		//}

		GridView1.DataSource = table;
		GridView1.DataBind();
	}

	private void InitTable()
	{
		table = new DataTable("Xbox Prices");
		table.Columns.Add("ID", typeof(string));
		table.Columns.Add("Name", typeof(string));
		table.Columns.Add("Score", typeof(string));

		//GridView1.DataSource = table;
		//GridView1.DataBind();

	}


Arslan jappa

Я действительно ценю всю тяжелую работу, которую вы проделали, чтобы помочь мне.но теперь приложение получает данные, содержащие только первые 50 продуктов с первой страницы сайта, а не с других страниц. В настольном приложении gridview асинхронно заполняется среднее значение сначала добавить 50 продуктов, а затем через несколько секунд снова добавить 50 продуктов.Но в веб-форме, когда я комментирую, пока страница условий не перестает загружаться bxz, проблема в том, что gridview не настраивается асинхронно.у вас есть какие-нибудь идеи, чтобы сделать это асинхронным?

AnkushK1

Я никогда не работал практически, но с помощью ajax это, безусловно, выполнимо. Вы можете обратиться к ссылке ниже:
https://www.aspsnippets.com/Articles/Bind-Load-GridView-after-Page-load-is-completed-using-AJAX-UpdatePanel-in-ASPNet.aspx