誰かがグリッドビューでセルを動的に編集する方法を説明してください。つまり、それをクリックして入力し、グリッドビューにフォーカスを失ったときに変更を投稿するだけですか?
セルをテンプレート コントロール (テキスト ボックス) として定義し、それを表示して入力できるようにしましたが、それ以上のことは何もしません。基になるデータセットからそのセルにデフォルト値を取得することさえできません。
ASP 2.0 と VB.NET をお願いします。
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="Id"
ShowFooter="true" AllowPaging="true" PageSize="4" AllowSorting="True" OnRowCommand="GridView1_RowCommand"
OnPageIndexChanging="GridView1_PageIndexChanging" OnRowDeleting="GridView1_RowDeleting"
OnRowEditing="GridView1_RowEditing" OnRowUpdating="GridView1_RowUpdating" OnSorting="GridView1_Sorting"
OnRowCancelingEdit="GridView1_RowCancelingEdit">
<Columns>
<asp:CommandField ShowDeleteButton="True" ShowEditButton="True" />
<asp:TemplateField HeaderText="Id" InsertVisible="False" SortExpression="Id">
<EditItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<%# Eval("Id") %>'></asp:Label>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<%# Bind("Id") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="Id" ShowHeader="True" />
<asp:TemplateField HeaderText="Name" SortExpression="Name">
<EditItemTemplate>
<asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("Name") %>'></asp:TextBox>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label2" runat="server" Text='<%# Bind("Name") %>'></asp:Label>
</ItemTemplate>
<FooterTemplate>
<asp:TextBox ID="QuantityTextBox" runat="server"></asp:TextBox>
</FooterTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Description" SortExpression="Description">
<EditItemTemplate>
<asp:TextBox ID="TextBox2" runat="server" Text='<%# Bind("Description") %>'></asp:TextBox>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label3" runat="server" Text='<%# Bind("Description") %>'></asp:Label>
</ItemTemplate>
<FooterTemplate>
<asp:TextBox ID="DescriptionTextBox" runat="server"></asp:TextBox>
</FooterTemplate>
</asp:TemplateField>
<asp:TemplateField>
<FooterTemplate>
<asp:LinkButton ID="btnNew" runat="server" CommandName="New" Text="New" />
</FooterTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
編集可能なプロパティを設定し、グリッドのイベントを使用します
protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
String StudentId = GridView1.Rows[e.RowIndex].Cells[1].Text;
String Firstname = GridView1.Rows[e.RowIndex].Cells[2].Text;
String Lastname = GridView1.Rows[e.RowIndex].Cells[3].Text;
String Email = GridView1.Rows[e.RowIndex].Cells[4].Text;
int id = Convert.ToInt32(StudentId);
Response.Write(StudentId);
try
{
studentEntities context = new studentEntities();
tbl_Students dbstudent = context.tbl_Students.First(i => i.Studentid == id);
dbstudent.Firstname = Firstname;
dbstudent.Lastname = Lastname;
dbstudent.Email = Email;
context.SaveChanges();
}
catch (Exception e1)
{
Console.WriteLine(e1.InnerException);
}
}
BoundField ではなく TemplateField を使用します。TemplateField に TextBox を配置します。(または、チェック ボックスなど、必要なものは何でも。) 画面のどこかに「更新」ボタンを配置します。例えば:
<asp:GridView ID="mydata" runat="server" DataSourceID="dsMydata" AutoGenerateColumns="false" >
<Columns>
<asp:BoundField DataField="Noneditablefield" HeaderText="Non-editable field" />
<asp:TemplateField HeaderText="Editable Field">
<ItemTemplate>
<asp:TextBox ID="myfield" runat="server" Columns="10" text='<%# eval("myfield") %>' />
</ItemTemplate>
</asp:TemplateField>
</asp:GridView>
次に、更新ボタンのクリックを処理する関数を作成します。この関数では、テーブルの行をループし、FindControl を使用してフィールドを取得し、それに対して必要なことをすべて実行します。
Protected Sub update_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles update.Click
For Each row As GridViewRow In tasks.Rows
Dim MyField = CType(row.FindControl("myfield"), TextBox).Text
' Do whatever you need with the new value
End For
End Sub
複数の行があると仮定すると、更新される行と更新されない行があります。アプリの性質によっては、変更されているかどうかにかかわらず、すべての行を更新するだけです。私は怠惰なときにこれを行いました。レコードが数個しかないことがわかっており、2 人のユーザーが同じデータを見て同時に変更を加えるという大きな問題はありません。ただし、グリッドビューの非表示フィールドなどに古い値を保存し、戻ったときに新しい値を古い値と比較し、変更された場合にのみデータベースを更新したい場合があります。
GridView
ページに新しい を追加するだけで、そのSmart Tag
からEnable Editing
これを行う方法の詳細については、ここから見ることができます
http://msdn.microsoft.com/en-us/library/ms972948.aspx
バインドされたフィールドではなくテンプレート フィールドに独自のコントロールを追加し、gridvew 内でこのイベントをキャプチャして、それに応じて行を更新する必要があります。
次のように開始できます。
Protected Sub GridView1_RowCommand(ByVal sender As Object, ByVal e As GridViewCommandEventArgs)
Dim btn As Button = TryCast(e.CommandSource, Button)
Dim row As GridViewRow = TryCast(btn.NamingContainer, GridViewRow)
If row IsNot Nothing Then
Dim txt As TextBox = TryCast(row.FindControl("TextBox1"), TextBox)
If txt IsNot Nothing Then
' Do something here
End If
End If
End Sub