2009-02-24 109 views
2

我想這將是簡單的,但我肯定是有很多的麻煩這樣做:ASP.NET的GridView的所有記錄編輯

這個問題的標題可能有點誤導。我不必使用gridview。事實上,我知道GridView可能不是這樣做的。我只是不知道該怎麼稱呼它。但是,現在只考慮:

我有一個非常簡單的類叫學生。它有4個屬性: INT ID 串名字 串名字 串電子郵件

我想保持這些泛型集合在內存中(會話狀態): 名單的學生;

好吧,現在的問題: 我希望用戶創建儘可能多的這些學生對象,因爲他們想要的。爲了顯示這些,我只想要一個簡單的表格,每行有3個文本框。我希望每行都有標籤的文本框,以便任何時候都可以編輯任何記錄。

當用戶完成創建他們的學生對象時,他們繼續做其他事情。但是,我只是無法找到一種以這種方式顯示記錄的方法。我使用ListView(3.5),html表格,gridview,中繼器等?

你會怎麼做?

回答

4

我會傾向於親自使用ListView爲此,因爲你可以插入行。你的LayoutTemplate將是一個表格,裏面有一個< tr runat =「server」ID =「itemPlaceHolder」/ >。你的ItemTemplate會有你的文本框(每行有一個可選的保存按鈕,如果你還需要插入的話,你可以有一個InsertItemTemplate)

頁面上任何地方都可以添加一個按鈕來保存所有項目.Item集合和調用ListView.Update(itemIndex,validate)。

<asp:ListView runat="server" ID="lv" InsertItemPosition="LastItem" DataKeyNames="id"> 
<LayoutTemplate> 
    <asp:LinkButton runat="server" OnClick="SaveAll" Text="Save All" /> 
    <table> 
    <tr> 
     <th>First Name</th> 
     <th>Last Name</th> 
     <th>Email</th> 
    </tr> 
    <tr runat="server" id="itemPlaceHolder" /> 
    </table> 
    <asp:LinkButton runat="server" OnClick="SaveAll" Text="Save All" /> 
</LayoutTemplate> 
<ItemTemplate> 
    <tr> 
     <td><asp:TextBox runat="server" ID="firstName" Text='<%#Bind("firstName") %>' /></td> 
     <td><asp:TextBox runat="server" ID="firstName" Text='<%#Bind("lastName") %>' /></td> 
     <td><asp:TextBox runat="server" ID="firstName" Text='<%#Bind("email") %>' /></td> 
     <td><asp:LinkButton runat="server" CommandName="update" Text="Save" /></td> 
    </tr> 
</ItemTemplate> 
<InsertItemTemplate> 
    <tr> 
     <td><asp:TextBox runat="server" ID="firstName" Text='<%#Bind("firstName") %>' /></td> 
     <td><asp:TextBox runat="server" ID="firstName" Text='<%#Bind("lastName") %>' /></td> 
     <td><asp:TextBox runat="server" ID="firstName" Text='<%#Bind("email") %>' /></td> 
     <td><asp:LinkButton runat="server" CommandName="insert" Text="Save" /></td> 
    </tr> 
</InsertItemTemplate> 
</asp:ListView> 

protected void SaveAll(object sender, EventArgs e) 
{ 
    lv.Items.ToList().ForEach(li => lv.UpdateItem(li.DataItemIndex, true)_; 
} 
1

是的,你可以使用網格視圖來做到這一點。 您可以爲列創建自定義模板,以便它們顯示在文本框中而不是標籤。然後您可以通過行捕獲'save'事件循環並更新數據。

1

是的,這是可能的。這只是Victor發佈的代碼示例。

  <asp:GridView ID="gvDetails" runat="server" AutoGenerateColumns="False" DataKeyNames="PartNumber" GridLines="Horizontal" 
       ForeColor="#333333" CellPadding="4" Width="800" PageSize="20" OnDataBound="gvPartDetails_DataBound" OnSelectedIndexChanged="gvPartDetails_SelectedIndexChanged" OnSorting="gvPartDetails_Sorting"> 
       <Columns> 
        <asp:TemplateField HeaderText="#"> 
         <ItemTemplate> 
          <asp:Label ID="lblNumber" runat="server" Text='<%# Bind("Number") %>' ToolTip='<%# Bind("Description") %>'></asp:Label> 
         </ItemTemplate> 
         <HeaderStyle Wrap="False" /> 
        </asp:TemplateField> 
        <asp:TemplateField HeaderText="LOC 1"> 
         <ItemTemplate> 
          <asp:TextBox ID="txt_Qty1" AutoPostBack="false" runat="server" MaxLength="5" Width="50" Text='<%# Bind("Qty1") %>'></asp:TextBox> 
         </ItemTemplate> 
         <HeaderStyle Wrap="False" /> 
        </asp:TemplateField> 
        <asp:TemplateField HeaderText="LOC 2"> 
         <ItemTemplate> 
          <asp:TextBox ID="txt_Qty2" AutoPostBack="false" runat="server" MaxLength="5" Width="50" Text='<%# Bind("Qty2") %>'></asp:TextBox> 
         </ItemTemplate> 
         <HeaderStyle Wrap="False" /> 
        </asp:TemplateField> 
       </Columns> 

       <EmptyDataTemplate> 
        <span id="Empty">No Details For This Such and Such.</span> 
        <a href="javascript:showNewPartMPE();"><img src="Images/icons/table_add.png" style="border:0px" alt="Add New Part" /></a> 
       </EmptyDataTemplate> 

       <FooterStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" /> 
       <RowStyle BackColor="#F7F6F3" ForeColor="#333333" /> 
       <EditRowStyle BackColor="#999999" /> 
       <SelectedRowStyle BackColor="#E2DED6" Font-Bold="True" ForeColor="#333333" /> 
       <PagerStyle BackColor="#284775" ForeColor="White" HorizontalAlign="Center" /> 
       <HeaderStyle BackColor="#284775" Font-Bold="True" ForeColor="White" HorizontalAlign="Left" /> 
       <AlternatingRowStyle BackColor="Gainsboro" ForeColor="#284775" /> 
      </asp:GridView> 

然後後面的代碼...這是非常粗糙......

private void ApplyChanges() 
    { 
     foreach (GridViewRow row in this.gvDetails.Rows) 
     { 
      //do something with cells and data objects 
      //and then save add to list, save, etc. 
     } 
    } 

編輯
以上是在那裏你會得到你的數據進行編輯。您可以使用DataTables,DataViews,DataSets,並且如其他解決方案所示,您可以將網格綁定到對象列表。這應該根據系統中的數據對象模型以及如何生成行來確定。

+0

感謝您發佈示例代碼。我沒有試圖從我的手機上這樣做。 – Victor 2009-02-24 21:39:16

1

Gridview將是實現這個最簡單的方法。你可能使用html表格,但是當用戶想要添加更多的用戶時,你將不得不做更多的事情。與四個屬性(ID,名字,姓氏,電子郵件),然後就從會話對象像綁定它創建爲GridView的模板:

public void BindGrid() 
{ 
    // assume students is the name of your GridView control 
    students.DataSource = (List<Student>)Session["StudentList"]; 
    students.DataBind(); 
}