Zoeken…


Dataverbinding

Er zijn twee manieren om een GridView te binden. U kunt dit handmatig doen door de eigenschap DataSource in te stellen en DataBind() roepen, of u kunt een DataSourceControl gebruiken, zoals een SqlDataSource .

Handmatig binden

Maak uw GridView:

<asp:GridView ID="gvColors" runat="server"></asp:GridView> 

Maak of haal eerst de brongegevens voor de GridView op. Wijs vervolgens de gegevens toe aan de DataSource eigenschap van de GridView. DataBind() slot DataBind() .

List<string> colors = new List<string>();
colors.Add("Red");
colors.Add("Green");
colors.Add("Blue");

gvColors.DataSource = colors;
gvColors.DataBind();

DataSourceControl

Maak uw DataSourceControl:

<asp:SqlDataSource ID="sdsColors"
    runat="server"
    ConnectionString="<%$ MyConnectionString %>"
    SelectCommand="SELECT Color_Name FROM Colors">
</asp:SqlDataSource>

Maak uw GridView en stel de eigenschap DataSourceID in:

<asp:GridView ID="gvColors"
    runat="server"
    DataSourceID="sdsColors">
</asp:GridView> 

columns

Er zijn zeven verschillende kolomtypen die binnen een GridView kunnen worden gebruikt.

<asp:GridView ID="GridView1" runat="server">
    <Columns>
        ...
    </Columns>
</asp:GridView> 

BoundField:

<asp:BoundField DataField="EmployeeID" HeaderText="Employee ID" />

ButtonField:

<asp:ButtonField ButtonType="Button" HeaderText="Select Employee" Text="Select"/>

CheckBoxField:

<asp:CheckBoxField DataField="IsActive" HeaderText="Is Active" />

CommandField:

<asp:CommandField ShowDeleteButton="true" 
    ShowEditButton="true" 
    ShowInsertButton="true" 
    ShowSelectButton="true" />

HyperLinkField:

<asp:HyperLinkField HeaderText="Employee Profile"
    DataNavigateUrlFields="EmployeeID"
    DataNavigateUrlFormatString="EmployeeProfile.aspx?EmployeeID={0}" />

ImageField:

<asp:ImageField HeaderText="Photo"
    DataImageUrlField="EmployeeID"
    DataImageUrlFormatString="/images/{0}" />

TemplateField:

<asp:TemplateField>
    <HeaderTemplate>
        Name
    </HeaderTemplate>
    <ItemTemplate>
        <asp:Label ID="lblEmployeeName"
            runat="server"
            Text='<&# Eval("EmployeeName") %>'></asp:Label>
    </ItemTemplate>
</asp:TemplateField>

Sterk getypeerde GridView

Beginnen met Asp.net 4.5 webcontroles kunnen profiteren van sterk getypeerde binding om IntelliSense-ondersteuning en compiletime-fouten te krijgen.

Maak een klasse aan die uw model bevat:

public class Album
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Artist { get; set; }
}

Definieer het GridView-besturingselement op uw pagina:

<asp:GridView ID="Grid" runat="server" AutoGenerateColumns="false" ItemType="YourNamespace.Album">
    <Columns>
        <asp:TemplateField HeaderText="Id">
            <ItemTemplate>
                <asp:Label ID="lblName" runat="server" Text="<%# Item.Id %>"></asp:Label>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Name">
            <ItemTemplate>
                <asp:Label ID="lblName" runat="server" Text="<%# Item.Name %>"></asp:Label>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Artist">
            <ItemTemplate>
                <asp:Label ID="lblCity" runat="server" Text="<%# Item.Artist %>"></asp:Label>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

Laad de gegevens en bind deze:

var albumList = new List<Album>
{
    new Album {Id = 1, Artist = "Icing (a Cake cover band)", Name = "Toppings Vol. 1"},
    new Album {Id = 2, Artist = "Fleetwood PC", Name = "Best of Windows"},
    new Album {Id = 3, Artist = "this.Bandnames", Name = "TH_ (Pronounced \"Thunderscore\")"},
};

Grid.DataSource = albumList;
Grid.DataBind();

Opdrachtafhandeling afhandelen

Met GridViews kunnen opdrachten worden verzonden vanuit een GridView-rij. Dit is handig om rijspecifieke informatie als opdrachtargumenten door te geven aan een gebeurtenishandler.

Abonneren op een opdrachtgebeurtenis:

<asp:GridView ID="GridView1" ... OnRowCommand="GridView1_RowCommand">

Knoppen zijn de meest gebruikelijke manier om opdrachten te activeren. Ze ondersteunen ook een manier om opdrachtargumenten op te geven. In dit voorbeeld is het argument een ID van het item dat de rij vertegenwoordigt.

<TemplateField>
    <ItemTemplate>
        <asp:LinkButton ID="LinkButton1" runat="server"
                        CommandName="SampleCmd"
                        CommandArgument='<%# Eval("ID") %>'>
        </asp:LinkButton>
    </ItemTemplate>
</TemplateField>

Als alternatief kan men een CommandField gebruiken die de meest voorkomende opdrachtbesturingselementen biedt.

Behandeling van het evenement in code achter:

protected void GridView1_RowCommand(object source, GridViewCommandEventArgs e)
{
    if (e.CommandName == "SampleCmd")
    {
        var id = e.CommandArgument;
    }
}

Merk op dat de in dit voorbeeld gebruikte CommandName willekeurig is en een keuze van de ontwikkelaar is. Er is echter een set vooraf gedefinieerde namen die de GridView zelf herkent. Overeenkomstige gebeurtenissen worden geactiveerd wanneer deze opdrachten worden geactiveerd.

Opdrachtnaam Evenementen verhoogd
annuleren RowCancelingEdit
Delete RowDeleting, RowDeleted
Bewerk RowEditing
Bladzijde PageIndexChanging, PageIndexChanged
kiezen SelectedIndexChanging, SelectedIndexChanged
Soort Sorteren, gesorteerd
Bijwerken RowUpdating, RowUpdated

paging

ObjectDataSource

Als u een ObjectDataSource gebruikt, wordt bijna alles al voor u afgehandeld, vertel de GridView gewoon aan AllowPaging en geef het een PageSize .

<asp:GridView ID="gvColors"
    runat="server"
    DataSourceID="sdsColors"
    AllowPaging="True"
    PageSize="5">
</asp:GridView>

<asp:SqlDataSource ID="sdsColors"
    runat="server"
    ConnectionString="<%$ MyConnectionString %>"
    SelectCommand="SELECT Color_ID, Color_Name FROM Colors">
</asp:SqlDataSource>

Paging1 Paging2 Paging3

Handmatig binden

Als u handmatig bindt, moet u de gebeurtenis PageIndexChanging . Stel eenvoudig de DataSource en PageIndex en bind de GridView opnieuw.

<asp:GridView ID="gvColors"
    runat="server"
    AllowPaging="True"
    PageSize="5"
    OnPageIndexChanging="gvColors_PageIndexChanging">
</asp:GridView>

C #

protected void gvColors_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
    gvColors.DataSource = // Method to retrieve DataSource
    gvColors.PageIndex = e.NewPageIndex;
    gvColors.DataBind();
}

VB.NET

Protected Sub gvColors_PageIndexChanging(sender As Object, e As GridViewPageEventArgs)
{
    gvColors.DataSource = // Method to retrieve DataSource
    gvColors.PageIndex = e.NewPageIndex
    gvColors.DataBind()
}

Werk Gridview bij rij-klik bij

Rasterweergaven zijn nuttiger als we de weergave volgens onze behoefte kunnen bijwerken. Overweeg een weergave met een vergrendelings- / ontgrendelingsfunctie in elke rij. Het kan gedaan worden als:

Voeg een updatepaneel toe:

<asp:UpdatePanel ID="UpdatePanel2" runat="server" UpdateMode="Conditional"> </asp:UpdatePanel>

Voeg een ContentTemplate en Trigger toe aan uw UpdatePanel:

<asp:UpdatePanel ID="UpdatePanel2" runat="server" UpdateMode="Conditional"> 
    <ContentTemplate>
    </ContentTemplate>

    <Triggers>
    </Triggers>
</asp:UpdatePanel>

Voeg uw GridView toe aan ContentTemplate:

<ContentTemplate>
<asp:GridView ID="GridView1" runat="server">
          <Columns>
                <asp:TemplateField>
                    <ItemTemplate>
                        <asp:ImageButton ID="imgDownload" runat="server" OnClientClick="return confirm('Are you sure want to Lock/Unlock ?');"
                            CommandName="togglelock"
                            CommandArgument='<%#Container.DataItemIndex%>'/>
                        
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>

</ContentTemplate>

Hier geven we onze GridView1 één constante kolom, voor vergrendelknop. Let wel, databind heeft tot nu toe niet plaatsgevonden.

Time for DataBind: (op PageLoad)

using (SqlConnection con= new SqlConnection(connectionString)) 
{
            SqlCommand sqlCommand = new SqlCommand(" ... ", con);
            SqlDataReader reader = sqlCommand.ExecuteReader();
            GridView1.DataSource = reader;
            GridView1.DataBind();
}

Afbeelding vergrendelen / ontgrendelen verschilt volgens de waarde van een bepaalde kolom in uw GridView. Overweeg een geval waarin uw tabel een attribuut / kolom met de titel "Status vergrendeling" bevat. Nu wilt u (1) die kolom verbergen net na DataBind en net vóór het renderen van de pagina en (2) Wijs verschillende afbeeldingen toe aan elke rij op basis van die verborgen kolomwaarde, dwz als Lock Status voor een rij 0 is, wijst u dit toe "lock". jpg ", als status 1 is, wijs het" unlock.jpg "toe. Om dit te doen, zullen we de OnRowDataBound optie van GridView gebruiken, die zich vermengt met uw GridView, net voordat elke rij naar de HTML-pagina wordt weergegeven.

<ContentTemplate>
<asp:GridView ID="GridView1" runat="server" OnRowDataBound="GridView1_RowDataBound"> ...

In cs-bestand

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {

        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            e.Row.Cells[8].Visible = false; //hiding the desired column which is column number 8 in this case
            GridView1.HeaderRow.Cells[8].Visible = false; //hiding its header
            ImageButton imgDownload = (ImageButton)e.Row.FindControl("imgDownload");
            string lstate = ((CheckBox)e.Row.Cells[8].Controls[0]).Checked.ToString();
            if (lstate == "True")
            { imgDownload.ImageUrl = "images/lock.png"; }
            else
            {
                imgDownload.ImageUrl = "images/unlock.png";
            }
        }
    }

Nu zal de GridView worden weergegeven zoals we willen, laten we nu knopklikgebeurtenissen implementeren op die knop Afbeelding vergrendelen / ontgrendelen. Begrijp dat om een specifieke bewerking op een specifieke rij uit te voeren, een opdracht aan die rij moet worden gegeven en GridView biedt ons dezelfde functionaliteit met de naam OnRowCommand .

<ContentTemplate>
<asp:GridView ID="GridView1" runat="server" OnRowDataBound="GridView1_RowDataBound" OnRowCommand="GridView1_RowCommand">
...
</ContentTemplate>

Het zal een functie in cs bestand dat een meekrijgt object sender en GridViewCommandEventArgs e Met e.CommandArgument kunnen we de index van de rij die het commando Point hier te worden opgemerkt is dat, kan een rij meerdere knoppen en de cs hebben gegeven krijgen code moet weten welke knop uit die rij de opdracht heeft gegeven. Dus we zullen CommandName

<asp:ImageButton ID="imgDownload" runat="server" OnClientClick="return confirm('Are you sure want to Lock/Unlock ?');"
                            CommandName="togglelock"
                            CommandArgument='<%#Container.DataItemIndex%>'/>

Nu kun je in de backend opdrachten onderscheiden van verschillende rijen en verschillende knoppen.

protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        if (e.CommandName == "togglelock")
        {
            using (SqlConnection con= new SqlConnection(connectionString)) 
            {
               int index = Convert.ToInt32(e.CommandArgument);
               SqlCommand sqlCommand = new SqlCommand(" ... ", con);
               SqlDataReader reader = sqlCommand.ExecuteReader();
               GridView1.DataSource = reader;
               GridView1.DataBind();
            }
        }
    }

Voeg <asp:PostBackTrigger ControlID="GridView1"/> aan de Trigger en deze zal de GridView bijwerken zodra de DataBind klaar is.

Gebruik HorizontalAlign="Center" om de GridView in het midden van de pagina te plaatsen.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow