Načtení dat z databáze   otázka

VB.NET, ASP.NET WebForms

Zdravim, potreboval bych poradit jak nacist data v ASP.NET do html table.

Zkousel jsem projit tutorialy a hledat vsude mozne. Pouzil jsem komponentu gridview,ale u ni nejdou pridavat radky atd. Nevim si rady. Pripojeni k databazi mam pres sqldatasource,snad je to ok,to nevim? No a ted jenom nejak udelat aby se mi to zobrazilo. Ma nekdo napad? Dekuji. Zatim se mi nic nezobrazuje.

Vypis Default.aspx.vb

   Sub Page_Load(ByVal Sender As Object, ByVal E As EventArgs)
        Dim sda As New SqlDataSource
        Dim dtData As New DataTable()
        sda = SqlDataSource1


        'GvResults.DataSource = dtData.DefaultView
        'GvResults.DataBind()
        GvResults.DataSource = sda.DataSourceMode
        GvResults.DataBind()


    End Sub

Vypis Default.aspx

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        &nbsp; &nbsp;&nbsp;<br />
        <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:demoConnectionString %>"
            ProviderName="<%$ ConnectionStrings:demoConnectionString.ProviderName %>"
            SelectCommand="SELECT * FROM [Tridy]">
        </asp:SqlDataSource>
        <br />
        <br />
        <asp:GridView ID="GvResults" runat="server">
        </asp:GridView>
    
    </div>
        &nbsp;
    </form>
</body>
</html>

Vypis casti Web.config

<configuration>
    <appSettings/>
    <connectionStrings>
        <add name="DatabaseConnectionString" connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=&quot;C:\Documents and Settings\czismn01\Dokumenty\Visual Studio 2005\WebSites\44-DataTableSorting-vb\App_Data\Database.mdf&quot;;Integrated Security=True;Connect Timeout=30;User Instance=True"
            providerName="System.Data.SqlClient" />
        <add name="demoConnectionString" connectionString="Data Source=MICHAL-FUJITSU\SQLEXPRESS;Initial Catalog=demo;Integrated Security=True"
            providerName="System.Data.SqlClient" />
    </connectionStrings>
    <system.web>

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Chtělo by to, abyste pořádně popsal, co potřebujete. Jaký řádek chcete přidat? Jsou totiž dvě možnosti:

1. Máte data, například 10 záznamů a potřebujete k nim přidat jedenáctý. V takovém případě nepřidáváte řádek do GridView, ale do databáze, prostě další záznam uložíte do tabulky a GridView ho už zobrazí. GridView je pouze zobrazovátko na data, která od někoho dostane, neumí data sám vytvářet.

2. Pokud má být nový řádek jiného typu, například součet položek v těch řádcích z databáze, pak se k tomu používá FooterTemplate.

Stále ale nevíme, co přesně potřebujete. Přidat řádek do GridView může mít víc významů.

Napojení GridView na data se řeší v seriálu o ASP.NET na tomto serveru: http://www.vbnet.cz/serial--6-zaciname_s...

Doporučuji si ho pečlivě přečíst od začátku dokonce, abyste pochopil, jak ASP.NET funguje. Bez pochopení principu není možné s ASP.NET dělat, kopírování kousků kódu bez jejich pochopení nikam nevede.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diky moc,je to presne jak rikate,nacis data z databaze a pak pridat radky ci sloupce,ale nikoliv databazi upravovat, pouze cist.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zatim hledam,co znamena FooterTemplate,snad mi to presne pomuze jak potrebuju.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Bohuzel jsem nic moc nenasel co se tyce FooterTemplate. Poradite prosim nekdo.Diky za info.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

No, musíte si tenhle případ upravit, ale GridView navážete na databázi třeba takto:

    <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="mujConnectionString" SelectCommand="SELECT 'ahoj' as Jmeno, 13 as Pocet"></asp:SqlDataSource>
    <asp:GridView ID="GridView1" runat="server" DataSourceID="SqlDataSource1" ShowFooter="true" AutoGenerateColumns="false">
        <Columns>
            <asp:BoundField DataField="Jmeno" />
            <asp:BoundField DataField="Pocet" />
        </Columns>
    </asp:GridView>

Pokud změníte connectionString a SQL dotaz tak, aby vám vytáhnul nějaká data z tabulky, mělo by to fungovat. Samozřejmě vytvořte uvnitř elementu Columns požadovaný počet sloupců a do vlastnosti DataField každého z nich nastavte název tohoto sloupce. Pak se vám data natáhnou z databáze do GridView bez jediného řádku kódu v pozadí.

Pokud chcete do posledního řádku se zápatím vložit například součet, musíte to už udělat programově, třeba takto:

    Protected Sub Page_PreRender(ByVal sender As Object, ByVal e As System.EventArgs)
        Dim soucet As Integer = 0
        For i As Integer = 0 To GridView1.Rows.Count - 1        'projít všechny řádky
            If GridView1.Rows(i).RowType = DataControlRowType.DataRow Then  'pouze pokud to je řádek s daty, nechceme záhlaví ani zápatí
                soucet += CInt(GridView1.Rows(i).DataItem("Pocet"))      'přičteme do součtu hodnotu z každého řádku ze druhého sloupce 
            End If
        Next
        
        'nastavíme Footer (Cells jsou jednotlivé buňky)
        GridView1.FooterRow.Cells(0).Text = "Celkový počet:"
        GridView1.FooterRow.Cells(1).Text = soucet
    End Sub

Aby se spodní řádek zápatí (footer) zobrazil, musíte GridViewu nastavit vlastnost ShowFooter na True, jak je uvedeno v příkladu.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diky za info,jeste ted resim nasledujici. Nactu data z databaze do tabulky:

dst = New DataTable

Potom udelam

dst.Rows.Add()
Dim duData As New DataView(dst)

Za dalsi zvolim:

duData.RowFilter = "Jmeno = 'Petr'"
GridView.DataSource = duData

Jenomze pokud jsem do promenne dst pridal radek a pak to priradim do gridview a dam filtrovat,tak uz tam radek neni, pouze zobrazen zaznam,ktery odpovida filtru.

Slo by s tim pripadne neco udelat?

Predem diky.

Pro jistotu posilam cely zdroj

  Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load





        Dim con As SqlConnection


        Dim ada As SqlDataAdapter


        'Dim dst As DataSet
        Dim dst As DataTable

        con = New SqlConnection("Data Source=MICHAL-FUJITSU\SQLEXPRESS;Initial Catalog=demo;Integrated Security=True")


        ada = New SqlDataAdapter("select * from Zaci", con)


        'dst = New DataSet
        dst = New DataTable

        con.Open()


        'ada.Fill(dst, "Zaci")
        ada.Fill(dst)

        con.Close()
        dst.Columns.Add(New DataColumn(("Price"), GetType(Single)))

        dst.Rows.Add()
        Dim duData As New DataView(dst)



        'gvEmployee.DataSource = dst.Tables("Zaci")
        'gvEmployee.DataSource = dst.DefaultView
        duData.RowFilter = "Jmeno = 'Petr'"
        gvEmployee.DataSource = duData


        gvEmployee.DataBind()
    End Sub

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Omlouvam se za zbytecny dotaz. Info pro vsechny,pokud pouzijeme footer template dojde skutecne i pri filtrovani k zobrazeni tohoto radku na konci.

S pozdravem

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak jakmile chci priradit do radku text, vyhodi to chybu.

Cast kodu je jednoducha

gvEmployee.FooterRow.Cells(0).Text = "dva"

Pri spusteni se zobrazi:

Odkaz na objekt není nastaven na instanci objektu.

Popis: Při provádění aktuálního webového požadavku došlo k neošetřené výjimce. Další informace o chybě a o jejím původu v kódu naleznete v trasování zásobníku.

Podrobnosti o výjimce: System.NullReferenceException: Odkaz na objekt není nastaven na instanci objektu.

Prosim jak to vyresit?

Dekuji

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Evidentně do FooterRow přistupujete v události Page_Load, což není správně. Page_Load je určená k tomu, aby se tabulka nastavila nebo se do ní nalila data. Tento řádek tedy musíte dát do události jiné, například Page_LoadComplete anebo Page_PreRender, to už GridView předaná data přečetl a vygeneroval tabulku.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Mockrat dekuju, moc jste mi pomohl,zkusim to.

Kde tyhle vsechny informace muzu najit,ze zrovna v teto udalosti nelze toto prirazeni provest?

Nejaka literatura,nebo neco by se nevyskytovala?

Jak tohle vsechno vite.... :)

Diky za info.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Dalsi problem,nerozjel jsem nic.Zkusel jsem zadat

Protected Sub Page_LoadComplete(ByVal sender As Object, ByVal e As System.EventArgs)

take

Protected Sub Page_LoadComplete(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

a stale nic,bila obrazovka.Jedine nejak zavolat tuto metodu.

Co myslite?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Uz to jede,totiz musi se tento radek

GvEmployee.FooterRow.Cells(0).Text = "Neco"

umistit az za

GvEmployee.DataBind()

S pozdravem M

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak kod vypada nasledovne,bohuzel stale problem s jednou veci.

Vypis default.aspx

<form id="form1" runat="server">
    <div>
        &nbsp; &nbsp;&nbsp;&nbsp;<br />
        &nbsp;<br />
        <asp:GridView ID="GvEmployee" runat="server" ShowFooter="True">
        </asp:GridView>
        <br />
        
        <br />
        <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox><br />
        <br />
        <br />
        <br />
    </div>
    </form>

Vypis default.aspx.vb

    Protected Sub Page_PreRender(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

        Dim con As SqlConnection


        Dim ada As SqlDataAdapter


        'Dim dst As DataSet
        Dim dst As DataTable

        con = New SqlConnection("Data Source=MICHAL-FUJITSU\SQLEXPRESS;Initial Catalog=demo;Integrated Security=True")


        ada = New SqlDataAdapter("select * from Zaci", con)


        'dst = New DataSet
        dst = New DataTable

        con.Open()


        'ada.Fill(dst, "Zaci")
        ada.Fill(dst)

        con.Close()
        dst.Columns.Add(New DataColumn(("Price"), GetType(Single)))

        'dst.Rows.Add()
        Dim duData As New DataView(dst)



        'gvEmployee.DataSource = dst.Tables("Zaci")
        'gvEmployee.DataSource = dst.DefaultView
        duData.RowFilter = "Jmeno = 'Petr'"
        GvEmployee.DataSource = duData
        GvEmployee.DataBind()

        TextBox1.Text = GvEmployee.Rows.Count

        Dim soucet As Integer = 0

        For i As Integer = 0 To GvEmployee.Rows.Count - 1        'projít všechny řádky
            If GvEmployee.Rows(i).RowType = DataControlRowType.DataRow Then  'pouze pokud to je řádek s daty, nechceme záhlaví ani zápatí
                soucet += CInt(GvEmployee.Rows(i).DataItem("IdZak"))      'přičteme do součtu hodnotu z každého řádku ze druhého sloupce 
            End If
        Next

        GvEmployee.FooterRow.Cells(0).Text = "Celkový počet:"
        GvEmployee.FooterRow.Cells(5).Text = soucet
    End Sub
End Class

Pokud spustim tak mam chybu s popisem:

Objektová proměnná nebo proměnná bloku With nebyla nastavena.

Popis: Při provádění aktuálního webového požadavku došlo k neošetřené výjimce. Další informace o chybě a o jejím původu v kódu naleznete v trasování zásobníku.

Podrobnosti o výjimce: System.NullReferenceException: Objektová proměnná nebo proměnná bloku With nebyla nastavena.

Zdrojová chyba:

Řádek 61: For i As Integer = 0 To GvEmployee.Rows.Count - 1 'projít všechny řádky

Řádek 62: If GvEmployee.Rows(i).RowType = DataControlRowType.DataRow Then 'pouze pokud to je řádek s daty, nechceme záhlaví ani zápatí

Řádek 63: soucet += CInt(GvEmployee.Rows(i).DataItem("IdZak")) 'přičteme do součtu hodnotu z každého řádku ze druhého sloupce

Řádek 64: End If

Řádek 65: Next

Nechapu v cem je problem kdyz v databazi mam sloupec s timto nazvem IdTrida, ktery je typu int.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

V databázi máte sloupec IdTrida, ale přes DataItem přistupujete ke sloupci IdZak. Taktéž nechápu, co má za smysl sčítat ID jednotlivých záznamů v databázi, ale to už je jedno.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

A ještě bych poprosil, abyste psal s diakritikou, máme to v pravidlech fóra.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

To jsem se spletl,chtěl jsem jen na zkoušku sečíst ID ve sloupci IdTrida, nebo IdZak,ale pořád se objevuje chyba,kterou jsem již zaslal.Nevíte čím to může být?

Objektová proměnná nebo proměnná bloku With nebyla nastavena.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak porad zkousim a nikam jsem se nedostal. Chtel jsem pouzit kod,o kterem jste se zminil,u mne je stale nefunkcni. Co je spatne?

Dim soucet As Integer = 0

        'For i As Integer = 0 To GvEmployee.Rows.Count - 1        projít všechny řádky
        If GvEmployee.Rows(i).RowType = DataControlRowType.DataRow Then  'pouze pokud to je řádek s daty, nechceme záhlaví ani zápatí
        soucet += CInt(GvEmployee.Rows(i).DataItem("IdTrida"))      'přičteme do součtu hodnotu z každého řádku ze druhého sloupce 
        End If
        Next

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak porad zkousim a nikam jsem se nedostal. Chtel jsem pouzit kod,o kterem jste se zminil,u mne je stale nefunkcni. Co je spatne?

Dim soucet As Integer = 0

        For i As Integer = 0 To GvEmployee.Rows.Count - 1        projít všechny řádky
        If GvEmployee.Rows(i).RowType = DataControlRowType.DataRow Then  'pouze pokud to je řádek s daty, nechceme záhlaví ani zápatí
        soucet += CInt(GvEmployee.Rows(i).DataItem("IdTrida"))      'přičteme do součtu hodnotu z každého řádku ze druhého sloupce 
        End If
        Next

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ještě mě napadá, že je možná špatně ta DataItem. Zkuste místo DataItem("IdTrida") dát Cells(0).Text a nulu nahraďte číslem sloupce, ve kterém jsou hodnoty, které budete sčítat (sloupce se číslují od nuly).

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback