Problem z instancją kolekcji

0

Pojawia mi się błąd "Object reference not set to an instance of an object." i nie bardzo wiem, gdzie leży problem.

Tworzę sobie kolekcję:
List<Dowcipy> listaDowcipow = DowcipyBL.Szukaj(new Dowcipy { Active = true }, "CreatedAt", "DESC", null);

Następnie wywołuję obiekt klasy Paging i przesyłam w nim tą kolekcję:
Paging paging = new Paging(listaDowcipow, 10, 0, 1, null);

Konstruktor wygląda tak:

public Paging(List<Dowcipy> listaDowcipow, int pageSize, int? curpage, int firstPage, int? page)
{
    this.ListaDowcipow = new List<Dowcipy>();
    this.ListaDowcipow = listaDowcipow;
    this.PageSize = pageSize;
    this.Curpage = curpage;
    this.FirstPage = firstPage;
    this.Page = page;
    GetDataPaging();
}

Błąd pojawia się przy wywołaniu metody GetDataPaging();

public void GetDataPaging()
{
    <span style="color: red">Pageds.DataSource = ListaDowcipow;</span>
    Pageds.AllowPaging = true;
    Pageds.PageSize = PageSize;
    ....
}

Co jest nie tak?

0

jesteś pewien że

List<Dowcipy> listaDowcipow = DowcipyBL.Szukaj(new Dowcipy { Active = true }, "CreatedAt", "DESC", null);

Ci cokolwiek zwraca? Wygląda na to że listaDowcipow jest w tym przypadku "nullem".

0

Tak, zwraca. Zresztą do tego czasu zanim zacząłem pracować nad stronnicowaniem, kolekcję przekazywałem od razu do DataSource. Wszystko ładnie zwracało, teraz dla testów sprawdziłem i jest tak samo. Czyli kiedy od razu kolekcję przekazuje do DataSource jest ok.

0

Wywal te linię:
this.ListaDowcipow = new List<Dowcipy>();
chociaż to i tak nic nie powinno zmienic.
Jesteś pewien że metoda powodująca bład jest w tej samej klasie?

0

Jasne. Wkleję może fragment klasy i odwołanie do niej:

public partial class Pages_Dowcipy : System.Web.UI.Page
{
private void BindData()
{
List<Dowcipy> listaWszystkichDowcipow = DowcipyBL.Szukaj(new Dowcipy { Active = true }, "CreatedAt", "DESC", null);
List<Dowcipy> listaDowcipow = new List<Dowcipy>();
Komentarze komentarze = new Komentarze();
foreach (Dowcipy dowcip2 in listaWszystkichDowcipow)
{
if (dowcip2.Kategoria.Title != "Artykuły")
{
komentarze.Dowcip.Id = dowcip2.Id;
dowcip2.IloscKomentarzy = KomentarzeBL.Szukaj(komentarze, "CreatedAt", null).Count();
listaDowcipow.Add(dowcip2);
}
}

    Paging paging = new Paging(listaWszystkichDowcipow, 10, 0, 1, null);
    paging.GetDataPaging();
    lblCurrpage.Text = paging.GeneratePaging();
}

}

public class Paging
{
DataSet dataSet;

public PagedDataSource Pageds { get; set; }
public string PagerFinal { get; set; }
public int PageSize { get; set; }
public int? Curpage { get; set; }
public int FirstPage { get; set; }
public int? Page { get; set; }
public List<Dowcipy> ListaDowcipow { get; set; }
public int LastPage { get; set; }
public int? PrevPage { get; set; }
public int? NextPage { get; set; }

public Paging(List<Dowcipy> listaDowcipow, int pageSize, int? curpage, int firstPage, int? page)
{
    this.ListaDowcipow = listaDowcipow;
    this.PageSize = pageSize;
    this.Curpage = curpage;
    this.FirstPage = firstPage;
    this.Page = page;
}

public void GetDataPaging()
{
    <span style="color: red">Pageds.DataSource = ListaDowcipow;</span>
    Pageds.AllowPaging = true;
    Pageds.PageSize = PageSize;

    LastPage = Pageds.PageCount;

    if (Page != null)
    {
        Curpage = Page;
    }
    else
    {
        Curpage = 1;
    }

    PrevPage = Curpage > 1 ? Curpage - 1 : Curpage;
    NextPage = Curpage < Pageds.PageCount ? Curpage + 1 : Curpage;

    Pageds.CurrentPageIndex = Convert.ToInt32(Curpage - 1);
}

}

1
  1. Powód błędu jest dość oczywisty (nie odkryję tu :/ Ameryki) -> Któryś obiekt został zadeklarowany, lecz nie został zainicjalizowany za pomocą operatora new. Na twoim miejscu sprawdziłbym za pomocą breakpointa czy konstruktor na pewno jest wywoływany (właśnie za pomocą new).
  2. Co to za Pageds.DataSource? W całym pokazanym kodzie pojawia się ona tylko raz. Może to z nią jest coś nie tak?
    Chyba nie jestem w stanie ci pomóc :/

@somekind -> poprawione ;) To była po prostu literówka

0

Nic nie rozumiem z tego kodu:

 Komentarze komentarze = new Komentarze();
        foreach (Dowcipy dowcip2 in listaWszystkichDowcipow)
        {
            if (dowcip2.Kategoria.Title != "Artykuły")
            {
                komentarze.Dowcip.Id = dowcip2.Id;
                dowcip2.IloscKomentarzy = KomentarzeBL.Szukaj(komentarze, "CreatedAt", null).Count();
                listaDowcipow.Add(dowcip2);
            }
        }

        Paging paging = new Paging(listaWszystkichDowcipow, 10, 0, 1, null);

Po pierwsze, dlaczego tworzysz jakiś obiekt Komentarze który ma już w sobie obiekt Dowcip (troche nielogiczne imo)
Potem: nie rozumiem po co robisz te całą szopkę z listaDowcipow, jesli do obiektu Paging i tak przekazujesz listaWszystkichDowcipow xd. Btw, wpisz sobie po:

Paging paging = new Paging(listaWszystkichDowcipow, 10, 0, 1, null);

coś takiego:

MessageBox.Show(paging.ListaDowcipow.Count());

bo coś mi sie nie wydaje że w ogóle ją przypisujesz, tak samo zrób po wszystkich metodach Szukaj();

0
MSM napisał(a)

lecz nie został zainicjowany za pomocą operatora new

Inicjować można nowego członka w zakonie. Obiekty się inicjalizuje.

0

Dzięki za podpowiedzi. Faktycznie obiekt Pageds nie był zainicjalizowany i to tu był główny błąd.

Dzięki,

0

Widzisz, obraziłeś się na obsługę błędów w programie i efekty tego zaczynają wychodzić.

Druga sprawa, aż kole w oczy:

dowcip2.IloscKomentarzy = KomentarzeBL.Szukaj(komentarze, "CreatedAt", null).Count();

Jeśli dobrze zgaduję, to metoda "Szukaj" pobiera dane z bazy. Pobieranie całych rekordów, tylko po to, żeby je policzyć jest poważnym błędem. Język SQL dysponuje funkcjami agregacji i do takich celów trzeba z nich korzystać. Im więcej zrobisz po stronie SQL, tym lepiej. A tak, tylko tracisz niepotrzebnie na wydajności aplikacji.

1 użytkowników online, w tym zalogowanych: 0, gości: 1