2009-08-31 76 views
7

我有一個包含GridView的頁面。該GridView一次分配10個項目。通常,我希望用戶從GridView中選擇項目並填充FormView。這很好。ASP.Net中的GridView - 選擇正確的行

我也想支持的查詢參數?ID = n,其中的頁面將加載指定的項目。

如何判斷數據網格或數據來源,項目設置爲數據上下文?

我想在DataGrid去正確的頁面並選擇該項目,顯示FormView控件指定的項目。

我無法弄清楚如何比限制數據源的具體項目,這是混淆用戶做其他。

有什麼想法?關於你的問題的方面ASP.NET觸摸

+0

您是否使用一個DetailsView或FormView控件來顯示所選項目的細節? – staterium 2009-09-03 16:51:31

+0

請注意,在問題的第一段中,我提到我正在使用FormView作爲細節。 – 2009-09-03 17:45:07

回答

9

如果將GridView的DataKey字段設置爲包含主鍵,則存在this CodeProject有關如何使用擴展方法基於記錄的鍵值設置gridview的選定索引的文章:

-1

數據訪問的教程。它一直是我一段時間,但我認爲,這個特殊的教程也許是最接近你所需要的最後一部分:

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

只要打開分頁的GridView和一切都應該只是工作。

+0

不,他們在教程底部做的是我已經擁有的。我想要做的是有一個查詢參數進入頁面,並以編程方式選擇適當的項目。 – 2009-08-31 01:57:04

2

這個正確的解決辦法是要取決於你是如何真正從數據庫中提取的數據會略有不同。但是這個過程幾乎是一樣的。

  1. 從數據庫中獲取數據以綁定到網格。
  2. 查找應顯示的項目。找出它在哪個行
  3. 現在,確定應該選擇哪個頁面,並選擇該頁面上的哪一行。
  4. 設置CurrentPageIndex並綁定網格。現在您可以設置所選項目

現在,這裏的踢球者是第1步和第2步。如果您要在SQL級別分頁數據,則需要獲取另一個存儲過程/數據庫調用以確定「所選項目的「行ID」。否則,如果要加載到對象集合或數據集,則可以循環並找到該項目。如果你真的必須保持行列。

不優雅,但老實說,沒有一個「優雅」的做法。

0

@布賴恩如果我正確理解你的問題,你的意思是你所擁有的一切有線了用戶點擊了它在一排時,頁面顯示。如果有人直接在瀏覽器中鍵入網址的網址,並附加?id = x,則應該引導他到相關頁面,根據選定的記錄選擇相關的行並填充FormView。

那麼如果是這種情況,我做了一些事情,但讓我提前警告它不是很優雅,它的2:30 AM在這裏,所以請不要笑。

假設: -在提出的解決方案的的DataKeyNames字段被設置爲源表的主鍵。獲取的行按此鍵排序。我正在使用SubSonic 3與SQL Server 2005 Express DB交談(恰巧這是我的第一個SS3項目,在辦公室非常忙碌)。

表定義如下:

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

的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> 

C#代碼(握住你的笑):

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: - 它是失敗的,如果你把最後一個記錄的ID。

編輯: - 這裏是鏈接Project