08. februar 2006 - 15:51Der er
41 kommentarer og 1 løsning
Problemer med valg af row i gridview når jeg bruger paging
Jeg har et gridview og et detailsview ved siden af hinanden i Visual Studio 2005 (ASP.NET 2.0). Jeg opretter nye records i detailsview. Når jeg opretter en ny record i detailsview bruger jeg ItemInserted eventen til binde til data igen så gridview'et bliver opdateret og sikre mig at den nyindatte record bliver valgt i grid'et:
foreach (GridViewRow r in GridView1.Rows) { if (r.Cells[1].Text.TrimEnd(null) == userAddedUserID) { GridView1.SelectedIndex = r.RowIndex; break; } }
lblMessage.Text = "You have successfully added " + userAddedName + " to the list of users!"; }
Det virker fint lige indtil jeg slår paging til. I mit grid har jeg valgt kun at vise 20 records af gangen. Mit problem er, at hvis jeg vælger en af de første 20 records og ser den i detailsview og her klikker på "Add new user" og den nye "user" ikke bliver placeret blandt de 20 første i gridview'et pga. sortering, så bliver den nyindsatte "user" ikke valgt. Hvordan løser jeg dette problem?
Det virker desværre ikke. Det er stadigvæk den record som jeg starter med at vælge blandt de 20 første records der er valgt efter jeg har tilføjet en ny. Indsætter jeg en ny record som bliver vist blandt de 20 første virker det fint.
Passer ikke helt hvad jeg sagde. Efter de 20 første records springer den ud af it sætningen. I første omgang kon jeg til at indsætte en record som var blandt de 20 første og der virkede det fint.
Det er den ligeglad med. Jeg hæftede mig også ved det før da jeg debuggede da bookAddedID og Cells[1].Text var lig med hinaden. Her var GridView1.SelectedIndex 7 r.rowindex 2 GridView1.PageCount 2 og GridView1.PageIndex 0
Her er den. Det er for denne eventhanler jeg roder med det og ikke den vi har kigget på indtil videre, men det burde ikke gøre deb store foreskel.
public void BookDetail_ItemUpdating(object sender, DetailsViewUpdateEventArgs e) { if (e != null && e.NewValues != null && e.NewValues["Title"] == null) { e.Cancel = true;
lblValidation.Text = "Please fill in a book title."; } }
//The BookDetail_ItemInserted event handler is used to handle the DetailsView ItemInserted //event. The ItemInserted event occurs when the "Add new book" button is clicked, but after the insert operation. public void BookDetail_ItemInserted(object sender, DetailsViewInsertedEventArgs e) { String bookAddedID = e.Values["BookID"].ToString();
Ja, den kalder jeg faktisk i alle mine forskellige event handlers, bl.a. i BookDetail_ItemInserting som jeg bruger til at validere for ikke udfyldte textboxes.
opfører den sig helt som som man vil forvente. Den viser side 2 og den vælger den 3. record i grid'et.
Skal jeg ikke på en eller anden måde have sat pageindex før jeg går igennem min foreach statement? Den springer jo ud af foreach statement'en efter de første 20 records.
som ms skriver : The downside of using a SqlDataSource as a pageable GridView's data source control is that the GridView uses the default paging model. That is, on each page request the SqlDataSource returns all of the records that are to be paged through to the GridView. The GridView then picks out the correct subset of records based on the number of records to show per page and the page index. In order to implement the custom paging model you'll need to use an ObjectDataSource.
Har du ms referencen (link) til ovenstående og er der yderligere eksempler på hvordan man så bruger ObjectDataSource i forhold til ovenstående beskrivelse?
Jeg var lidt hurtig før da jeg sagde at jeg fik den exception - det var noget andet kode der genererede den fejl. Det virker fint når jeg sætter GridView1.PageIndex = 2; før foreach statement'en.
Du kan gøre det på en anden måde. Ved at lave en select på sqldatasource og løbe det resulterende dataview igennem og beregne det pageindex som posten ligger på. Det skal gøre før din foreach sætning.
Jeg er "lost". Jeg famler i blinde. Jeg har prøvet mange forskellige ting, men det vil bare ikke som jeg vil. Kan du prøve at give et løsningsforslag som bygger på dit forslag oven over - bare så jeg kan komme i gang derfra.
foreach (GridViewRow r in GridView1.Rows) { if (r.Cells[1].Text == bookAddedID) { //GridView1.PageIndex = (r.RowIndex / GridView1.PageSize); GridView1.SelectedIndex = r.RowIndex;
break; } }
lblMessage.Text = "You have successfully added " + bookAddedTitle + " to the list of books!"; }
private int GetRowIndex(string bookID) { SqlDataSource sql = SqlDataSource1; DataView list = sql.Select(new DataSourceSelectArguments()) as DataView; DataRowCollection rows = list.Table.Rows; int i = 0;
foreach (DataRow row in rows) { if (string.Compare(row["BookID"].ToString(), bookID) == 0) return i; i++; }
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.