Avatar billede torejessen Nybegynder
03. december 2007 - 10:25 Der er 5 kommentarer

Gridview selectrow filter

Hej
Jeg kæmper med en website application i Visual Studio 2005.
Jeg har et gridview som viser nogle rækker, som er bundet til et dataview.
Mit dataview filtrerer et datatable, efter nogle brugerdefinerede filtreringer.
Jeg har fx en kalenderkontrol, og gridviewt skal filtrere efter hvilken dato der er valgt i kalenderen.

Jeg har et problem, at filtreringen sker fint fra kalenderen til gridviewet, men når der så vælges en row i gridviewet så genloades siden, og filtreringen nulstilles.

Meningen er at nogle tekstbokse skal vise valget fra gridviewet.
Hvordan kan jeg beholde mit filter efter postback, efter at en række er valgt i gridviewet? (Eller mere konkret, hvore hvordan kan jeg sørge for at de rigtige felter vises i tekstboksene, og at siden ikke reloades efter at der er klikket på en række?)


List af min kode:
        protected void Page_Load(object sender, EventArgs e)
        {

                MakeTables();

                MakeDataView();
//Lav et rowfilter. Til start vil gerne have vist data fra dd og 7 dage frem.
                Changedv(DateTime.Today, DateTime.Today.AddDays(7));

                BindGridView();
        }
    private void MakeDataView()
    {
        dv = new DataView();
        dv.Table = Tour9DataSet.Tables["dtTours"];
        dv.AllowDelete = false;
        dv.AllowNew = false;
        //dv.Sort = "Date";
    }
    private void Changedv(DateTime fra, DateTime til)
    {
            string filter = "Date >'" + (DateTime)fra + "'" +
                " AND Date <'" + (DateTime)til + "'";
            dv.RowFilter = filter;
    }
    private void BindGridView()
    {
        GridViewTours.DataSource = dv;
        GridViewTours.DataBind();
    }
Avatar billede neoman Novice
03. december 2007 - 10:38 #1
mangler der ikke en If (!IsPostBack) i din page load ? I den blok skal du "loade" din side (som du gør nu), så data gemmes i kontrollernes viewstate, og ikke ændres efter postback, mens  ændringer skal så normalt gennemføres i de klik-handlere dine klik-events forårsager.
Avatar billede torejessen Nybegynder
03. december 2007 - 10:57 #2
Muligvis. Nu har jeg ændret til
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {   
                MakeTables();

                MakeDataView();
                Changedv(DateTime.Today, DateTime.Today.AddDays(7));

                BindGridView();
            }
        }
Men nu får jeg en fel ved "dv.RowFilter = filter;" Fejlen er "Object reference not set to an instance of an object."

Det lyder som en rigtig løsning, men jeg ved ikke meget om viewstate. Har du et eksempel, eller et godt link?

Og hvilke click-events har jeg brug for?
Avatar billede neoman Novice
03. december 2007 - 11:07 #3
Når du klikker og får postback, så starter hele balladen forfra - intet er husket fra forrige gang.

Når du klikker på noget på skærmen laver du en event som du kan kalde handleren for efter postback. Det gør du øjensynligt allerede da du får fejl i Changedv ? Hvor bliver den kaldt fra ?

Efter postback har du ingen DataTable, fordi den kun blev loadet ved !IsPostBack.
Hvis du har en myGridView_SelectedIndexChanged eventhandler
så skal du derinde loade din table igen og lave dit dataview.
Det fremgår ikke af din kode hvor du har data fra - hvis fra en DB, så kunne du opbevare dine data i session, så du kan lirke dem frem igen derfra uden at kalde db'en.
Avatar billede torejessen Nybegynder
03. december 2007 - 12:05 #4
Hej Neoman

Jeg har pastet min kode ind herunder. Der kommer nu en fejl når jeg klikker på kalenderen i linje :
"dv.Table = Tour9DataSet.Tables["dtTours"];"
Object reference not set to an instance of an object.

Underligt..
Jeg må kigge lidt på session, eller hvad? Hvis jeg kan gemme min datatabel og måske mit dataview i en session, kan jeg nok få det til at virke. Er det vejen?


using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using localhost;

public partial class Forside : System.Web.UI.Page
{
    Service1 MyWebService;
    DataSet Tour9DataSet;
    DataView dv;

    DateTime valgtdatoFRA;
    DateTime valgtdatoTIL;


    Tour[] listTour;
    Destination[] listDestination;
    Guides[] listGuides;

    DataTable dtDestination;
    DataTable dtGuides;
    DataTable dtTours;

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {   
                MakeTables();

                MakeDataView();
                Changedv(DateTime.Today, DateTime.Today.AddDays(7));

                BindGridView();
            }
                //Input.Text = dv[4][0].ToString();
        }

   
#region MakeTables
    private void MakeTables()
    {
        MyWebService = new Service1();
        Tour9DataSet = new DataSet("Tour9DataSet");
        MakeTableofDestination();
        MakeTableofGuides();
        MakeTableofTours();
    }
    private void MakeTableofDestination()

    private void MakeTableofGuides()
    private void MakeDataView()
    private void MakeTableofTours()
    {
        dv = new DataView();
        dv.Table = Tour9DataSet.Tables["dtTours"];
        dv.AllowDelete = false;
        dv.AllowNew = false;
        //dv.Sort = "Date";
    }
    private void Changedv(DateTime fra, DateTime til)
    {
            string filter = "Date >'" + (DateTime)fra + "'" +
                " AND Date <'" + (DateTime)til + "'";
            dv.RowFilter = filter;
    }
    private void BindGridView()
    {
        GridViewTours.DataSource = dv;
        GridViewTours.DataBind();
    }
    public TextBox Textbox
    {
        get
        {
            return this.Input;
        }
    }
    protected void Calendar1_SelectionChanged(object sender, EventArgs e)
    {
        //Input.Text = "";
        valgtdatoFRA = Calendar1.SelectedDate;
        valgtdatoTIL = Calendar1.SelectedDate.AddDays(7);
        LabelKalendervalg.Text = Calendar1.SelectedDate.ToShortDateString();
        MakeDataView();
        Changedv(Calendar1.SelectedDate, Calendar1.SelectedDate.AddDays(7));
        BindGridView();
    }
    protected void GridViewTours_SelectedIndexChanged(object sender, EventArgs e)
    {
        //MakeDataView();
        //Changedv(valgtdatoFRA, valgtdatoTIL);

        //BindGridView();
       
       
        // Get the currently selected row using the SelectedRow property.
        GridViewRow row = GridViewTours.SelectedRow;

        //Input.Text = GridViewTours.SelectedIndex.ToString(); //virker, men...
        Input.Text = "ehjh";
    }

    protected void GridViewTours_RowCreated(Object sender, GridViewRowEventArgs e)
    {


            // Copy the items in the Rows collection into an array.
            GridViewRow[] rowArray = new GridViewRow[GridViewTours.Rows.Count];
            GridViewTours.Rows.CopyTo(rowArray, 0);

            // Iterate though the array and display the value in the selected cell.
                int j = -1;

                foreach (GridViewRow row in rowArray)
                {
                    j++;
                    if (j == GridViewTours.SelectedIndex)
                    {
                    Input.Text = row.Cells[1].Text;
                    }
                }
           
    }


}
Avatar billede neoman Novice
05. december 2007 - 19:01 #5
jas det er vejen gem dine ting i session - hvis du ikke ved hvordan så skriv det, så kan jeg elelr en anden hjælpe dig, ellers blqard lige ned igennem spørgsmålene på denne (og næste side) der er andre som bruger session til at gemme ting
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester