2

これは簡単だと思いましたが、これを行うのに多くの問題があることは確かです:

この質問のタイトルは少し誤解を招くかもしれません。グリッドビューを使用する必要はありません。実際、GridView はおそらくこれを行う方法ではないことを知っています。他にタイトルを付ける方法がわかりませんでした。しかし、今のところ、次のことを考慮してください。

Student という非常に単純なクラスがあります。4 つのプロパティがあります: int ID 文字列 FirstName 文字列 LastName 文字列 Email

これらの一般的なコレクションをメモリに保持したい (セッション状態):

さて、問題は、ユーザーがこれらの Student オブジェクトを好きなだけ作成することです。これらを表示するには、各行に 3 つのテキスト ボックスがある単純なテーブルが必要です。いつでもレコードを編集できるように、すべての行にラベルの代わりにテキストボックスを配置したいと思います。

ユーザーが学生オブジェクトの作成を終了すると、他の作業に進みます。しかし、この方法でレコードを表示する方法を見つけるのに苦労しています。ListView(3.5)、html テーブル、グリッドビュー、リピーターなどを使用しますか?

どのようにしますか?

4

4 に答える 4

4

行を挿入できるので、これには ListView を個人的に使用する傾向があります。LayoutTemplate は、 <tr runat="server" ID="itemPlaceHolder" /> を含むテーブルになります。ItemTemplate には、TextBox (および行ごとにオプションの保存ボタン) があります。次に、挿入が必要な場合は、InsertItemTemplate を使用できます。

ページのどこにでも、ListView.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)_;
}
于 2009-02-24T21:14:16.153 に答える
1

はい、グリッド ビューを使用してこれを行うことができます。ラベルではなくテキストボックスに表示されるように、列のカスタム テンプレートを作成できます。その後、行をループして「保存」イベントをキャプチャし、データを更新できます。

于 2009-02-24T21:01:40.007 に答える
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.
        }
    }

EDIT
上記は、データの編集を取得する場所です。DataTables、DataViews、DataSets を操作でき、他のソリューションが示すように、グリッドをオブジェクトのリストにバインドできます。これは、システムのデータ オブジェクト モデルと行の生成方法に基づいて決定する必要があります。

于 2009-02-24T21:06:10.713 に答える
1

Gridview は、これを実装する最も簡単な方法になります。HTML テーブルを使用することもできますが、ユーザーがさらにユーザーを追加したい場合は、さらに多くのことを行う必要があります。4 つのプロパティ (Id、FirstName、LastName、Email) を使用してグリッドビューのテンプレートを作成し、次のようにセッション オブジェクトからバインドします。

public void BindGrid()
{
  // assume students is the name of your GridView control
  students.DataSource = (List<Student>)Session["StudentList"];
  students.DataBind();
}
于 2009-02-24T21:08:56.433 に答える