2009-08-31 22 views
7

Ho una pagina che include un GridView in esso. Quel GridView è impaginato con 10 elementi alla volta. Normalmente, voglio che l'utente selezioni l'elemento da GridView e compili il FormView. Funziona beneGridView in ASP.Net - Selezione della riga corretta

Desidero anche supportare un parametro di query? ID = n in cui la pagina caricherà l'elemento specificato.

Come comunicare a DataGrid o all'origine dati quale elemento impostare come contesto dati?

Desidero che DataGrid vada alla pagina corretta e selezioni l'elemento, mostrando l'elemento specificato in FormView.

Non riesco a capire come fare questo oltre a limitare l'origine dati all'elemento specifico, che è fonte di confusione per l'utente.

Qualche idea?

+0

Si sta utilizzando un DetailsView o un controllo FormView per visualizzare i dettagli della voce selezionata? – staterium

+0

Si noti che nel primo paragrafo della domanda, dico che sto usando un FormView per i dettagli. –

risposta

9

Se si imposta il campo DataKey del GridView per contenere la chiave primaria, v'è this articolo CodeProject su come impostare l'indice selezionato di una GridView, sulla base del valore della chiave del record, utilizzando un metodo di estensione:

-1

Le esercitazioni di accesso ai dati su ASP.NET riguardano aspetti della domanda. E 'stato un po' per me, ma penso che l'ultima parte di questa particolare lezione forse più vicino a quello che vi serve:

http://www.asp.net/learn/data-access/tutorial-10-vb.aspx

Basta accendere paging per il GridView e tutto dovrebbe funzionare.

+0

No, quello che stanno facendo in fondo al tutorial è quello che ho già. Quello che voglio fare è avere un parametro di interrogazione entrare nella pagina e selezionare in modo programmatico l'elemento appropriato. –

2

La soluzione corretta per questo sta andando a variare un po 'a seconda di come si stanno effettivamente tirando i dati dal database. Ma il processo è praticamente lo stesso.

  1. Ottieni i dati dal database per collegarli alla rete.
  2. Cercare l'elemento che deve essere visualizzato. Scopri quale riga è in
  3. Ora, determina quale pagina deve essere selezionata e quale riga su quella pagina deve essere selezionata.
  4. Impostare CurrentPageIndex e associare la griglia. ora è possibile impostare la voce selezionata

Ora, il kicker qui è il passaggio 1 e 2. se si esegue il paging dei dati a livello SQL, sarà necessario ottenere un'altra chiamata memorizzata procedura/database per determinare il " ID riga "dell'elemento selezionato. In caso contrario, se si sta caricando su una raccolta di oggetti o su un set di dati, è possibile scorrere e trovare l'elemento. Mantenere un contatore di fila se proprio devi.

Non elegante, ma onestamente non c'è un modo "elegante" per farlo.

0

@Brian se sto capendo correttamente la tua domanda vuoi dire che hai tutto cablato i clic dell'utente su una riga quando la pagina viene mostrata. Se qualcuno ha di digitare l'URL della pagina direttamente nel browser e aggiunge ? Id = x, dovresti indirizzarlo alla pagina pertinente, selezionare la riga pertinente e compilare FormView in base al record selezionato.

Beh, se questo è il caso, ho fatto qualcosa, ma lasciatemi avvertire prima mano non è molto elegante e le sue 2:30 AM qui quindi per favore non ridere.

Assunzione: - Nella soluzione presentata la DataKeyNames campo è impostato chiave primaria della tabella di origine. Le righe recuperate sono ordinate per questa chiave. Sto usando SubSonic 3 per parlare con SQL Server 2005 Express DB (coincidentemente questo è il mio primo progetto SS3, molto impegnato in ufficio per provarlo).

La definizione della tabella è la seguente:

Create Table StudentsTable 
(EnrolmentNumber int not null identity primary key, 
    StudentName nvarchar(50) not null) 

L'aspx:

<asp:GridView ID="gvStudents" runat="server" AllowPaging="True" PageSize="3" 
OnSelectedIndexChanged="GridRowChanged" OnPageIndexChanging="GridPageChanging" 
    DataKeyNames="EnrolmentNumber"> 
    <RowStyle BackColor="LightBlue" /> 
    <AlternatingRowStyle BackColor="LightCoral" /> 
    <Columns> 
     <asp:TemplateField ShowHeader="False"> 
      <ItemTemplate> 
       <asp:LinkButton ID="LinkButton1" runat="server" 
        CommandName="Select" Text="Select"></asp:LinkButton> 
      </ItemTemplate> 
     </asp:TemplateField> 
    </Columns> 
    <SelectedRowStyle BackColor="Red" BorderColor="Yellow" /> 
</asp:GridView> 

<asp:FormView ID="fvSubjects" runat="server" AllowPaging="false" 
    Caption="Student" CaptionAlign="Left"> 
    <ItemTemplate> 
     <table> 
      <tr> 
       <td>Enrolment Number</td> 
       <td><asp:Label ID="lblEN" runat="server" 
        Text=<%# Eval("EnrolmentNumber") %> /></td> 
      </tr> 
      <tr> 
       <td>Student Name</td> 
       <td><asp:Label ID="lblName" runat="server" 
        Text=<%# Eval("StudentName") %> /></td> 
      </tr> 
     </table> 
    </ItemTemplate> 
</asp:FormView> 

codice C# (Tenere le ride):

private IList<StudentsTable> students; 

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!IsPostBack) 
    { 
     LoadData(); 
      CheckQueryString(students); 
    } 
} 

private void LoadData() 
{ 
    students = StudentsTable.All().ToList(); 
    gvStudents.DataSource = students; 
    gvStudents.DataBind(); 
} 

private void CheckQueryString(IList<StudentsTable> students) 
{ 
    if (!Request.QueryString.HasKeys() || 
     string.IsNullOrEmpty(Request.QueryString["erno"])) 
    { 
     return; 
    } 

    var erno = Request.QueryString["erno"]; 
    int key; 
    if (!int.TryParse(erno, out key)) 
     return; 

    for (var i = 0; i < students.Count; i++) 
    { 
     if (students[i].EnrolmentNumber == key) 
     { 
      SetPageSize(students, i); 

      break; 
     } 
    } 
} 

private void SetPageSize(IList<StudentsTable> students, int i) 
{ 
    var ps = gvStudents.PageSize; 
    var cp = i/ps; 
    var ridx = i - ps - 1; 

    var pageEvent = new GridViewPageEventArgs(cp); 
    GridPageChanging(null, pageEvent); 
    gvStudents.SelectedIndex = ridx; 
    GridRowChanged(null, EventArgs.Empty); 
} 

protected void GridRowChanged(object sender, EventArgs e) 
{ 
    var rIdx = gvStudents.SelectedIndex; 
    if (rIdx < 0) return; 

    var key = gvStudents.DataKeys[rIdx]; 
    var lst= StudentsTable.Find(x => x.EnrolmentNumber == (int)key.Value); 
    SetFormView(lst); 
} 

private void SetFormView(IList<StudentsTable> student) 
{ 
    fvSubjects.DataSource = student; 
    fvSubjects.DataBind(); 
} 

protected void GridPageChanging(object sender, GridViewPageEventArgs e) 
{ 
    var p = e.NewPageIndex; 
    if (p > gvStudents.PageCount) 
     p = gvStudents.PageCount - 1; 
    gvStudents.PageIndex = p; 

    LoadData(); 
} 

PS: - Si sta fallendo, se hai messo l'id dell'ultimo record.

EDIT: - Ecco link per Project

Problemi correlati