Listviewの更新コマンドを機能させることができないようです。これが私のデータグリッドです:
<asp:ListView ID="lvECOItems" runat="server"
EnableViewState="False" DataKeyNames="ID,ECOID"
onitemupdating="lvECOItems_ItemUpdating"
EnableModelValidation="True"
onitemcommand="lvECOItems_ItemCommand"
onitemcanceling="lvECOItems_ItemCanceling"
onitemdeleting="lvECOItems_ItemDeleting"
onitemediting="lvECOItems_ItemEditing">
<AlternatingItemTemplate>
<div class="listViewRow" style="border-bottom: solid 1px #C0C0C0; background-color: #fff; padding-top: 5px; padding-bottom: 5px;">
<table style="width: 100%;" class="data-table">
<tr>
<td style="width: 3%;"><asp:LinkButton ID="LinkButton2" runat="server" CausesValidation="False" CommandName="Edit" Text="Edit"></asp:LinkButton></td>
<td style="width: 8%;"><asp:Label ID="DocumentNumber" runat="server" Text='<%# Eval("DocumentNumber") %>'></asp:Label></td>
<td style="width: 10%;"><asp:Label ID="title" runat="server" Text='<%# Eval("Title") %>'></asp:Label></td>
<td style="width: 2%; text-align:center;"><asp:Label ID="RevisionFrom" runat="server" Text='<%# Eval("RevisionFrom") %>'></asp:Label></td>
<td style="width: 2%; text-align:center;"><asp:Label ID="To" runat="server" Text='<%# Eval("To") %>'></asp:Label></td>
<td style="width: 1%; text-align:right;"><asp:ImageButton ID="btnDelete" ToolTip="Delete this record" ImageUrl="~/images/delete.jpg" runat="server" OnClientClick="return confirm('Are you sure you want to delete this record?')" CausesValidation="False" CommandName="Delete" Text="Delete"></asp:ImageButton></td>
</tr>
</table>
<asp:Label ID="IDLabel" Visible="false" runat="server" Text='<%# Eval("ID") %>' ></asp:Label>
<asp:Label ID="ECOIDLabel" Visible="false" runat="server" Text='<%# Eval("ECOID") %>' ></asp:Label>
</div>
</AlternatingItemTemplate>
<LayoutTemplate>
<div class="listViewHeader">
<table style="width: 100%; border-bottom: solid 1px #808080; border-top: solid 1px #808080;" class="data-table">
<tr>
<td class="rowheader" style="width: 3%;"></td>
<td class="rowheader" style="width: 8%;"></td>
<td class="rowheader" style="width: 10%;"></td>
<td class="rowheader" style="width: 4%; text-align:center; border-bottom: solid 1px #fff; font-style: italic;" colspan="2">Revision</td>
</tr>
<tr>
<td class="rowheader" style="width: 3%;"></td>
<td class="rowheader" style="width: 8%;">Document #</td>
<td class="rowheader" style="width: 10%;">Title</td>
<td class="rowheader" style="width: 2%; text-align:center;">From</td>
<td class="rowheader" style="width: 2%; text-align:center;">To</td>
<td class="rowheader" style="width: 1%;"></td>
</tr>
</table>
</div>
<asp:PlaceHolder runat="server" ID="itemPlaceholder"></asp:PlaceHolder>
</LayoutTemplate>
<EmptyItemTemplate><div></div></EmptyItemTemplate>
<InsertItemTemplate></InsertItemTemplate>
<SelectedItemTemplate></SelectedItemTemplate>
<EmptyDataTemplate>
<div class="listViewEmptyDataTemplate" style="width: 650px;">
<span>
This list does not contain any items.
</span>
</div>
</EmptyDataTemplate>
<EditItemTemplate>
<div class="listViewEditRow" style="background-color: #fff; border-top: solid 1px #000; border-bottom: solid 1px #000; padding-top: 10px; padding-left: 10px">
<asp:Label ID="IDLabel" Visible="false" runat="server" Text='<%# Bind("ID") %>' ></asp:Label>
<asp:Label ID="ECOIDLabel" Visible="false" runat="server" Text='<%# Bind("ECOID") %>' ></asp:Label>
<div style="float: left;">
<table class="data-table">
<tr>
<td style="width: 175px;">Document Number:</td>
<td colspan="3"><asp:Textbox ID="txtDocumentNumber" Width="300px" runat="server" Text='<%# Bind("DocumentNumber") %>'></asp:Textbox></td>
</tr>
<tr>
<td style="width: 175px;">Title:</td>
<td colspan="3"><asp:Textbox ID="txttitle" Width="300px" runat="server" Text='<%# Bind("Title") %>'></asp:Textbox></td>
</tr>
<tr>
<td style="width: 175px;">Revision From:</td>
<td><asp:Textbox ID="txtRevisionFrom" Width="50px" runat="server" Text='<%# Bind("RevisionFrom") %>'></asp:Textbox></td>
<td>To:</td>
<td><asp:Textbox ID="txtTo" runat="server" Width="50px" Text='<%# Bind("To") %>'></asp:Textbox></td>
</tr>
</table>
</div>
<div class="clear" style="margin-top: 5px;"> </div>
<div style="padding-bottom: 5px;">
<asp:Button ID="LinkButton4" runat="server" Width="75px" style="margin-right: 10px;" CausesValidation="False" ValidationGroup="vgUpdate" CommandName="Update" Text="Update"></asp:Button>
<asp:Button ID="LinkButton3" runat="server" Width="75px" ForeColor="#B22222" CausesValidation="False" CommandName="Cancel" Text="Cancel"></asp:Button>
</div>
<asp:RequiredFieldValidator ID="vDocumentNumber" runat="server"
ControlToValidate="txtDocumentNumber" ValidationGroup="vgUpdate" Display="None"
ErrorMessage="Document # is required"></asp:RequiredFieldValidator>
<asp:ValidationSummary ID="ValidationSummary2" ValidationGroup="vgUpdate" runat="server" ShowMessageBox="True" ShowSummary="False" HeaderText="The record cannot be updated due to the following:" />
</div>
</EditItemTemplate>
<ItemTemplate>
<div class="listViewRow" style="border-bottom: solid 1px #C0C0C0; background-color: #fff; padding-top: 5px; padding-bottom: 5px;">
<table style="width: 100%;" class="data-table">
<tr>
<td style="width: 3%;"><asp:LinkButton ID="LinkButton2" runat="server" CausesValidation="False" CommandName="Edit" Text="Edit"></asp:LinkButton></td>
<td style="width: 8%;"><asp:Label ID="DocumentNumber" runat="server" Text='<%# Eval("DocumentNumber") %>'></asp:Label></td>
<td style="width: 10%;"><asp:Label ID="title" runat="server" Text='<%# Eval("Title") %>'></asp:Label></td>
<td style="width: 2%; text-align:center;"><asp:Label ID="RevisionFrom" runat="server" Text='<%# Eval("RevisionFrom") %>'></asp:Label></td>
<td style="width: 2%; text-align:center;"><asp:Label ID="To" runat="server" Text='<%# Eval("To") %>'></asp:Label></td>
<td style="width: 1%; text-align:right;"><asp:ImageButton ID="btnDelete" ToolTip="Delete this record" ImageUrl="~/images/delete.jpg" runat="server" OnClientClick="return confirm('Are you sure you want to delete this record?')" CausesValidation="False" CommandName="Delete" Text="Delete"></asp:ImageButton></td>
</tr>
</table>
<asp:Label ID="IDLabel" Visible="false" runat="server" Text='<%# Eval("ID") %>' ></asp:Label>
<asp:Label ID="ECOIDLabel" Visible="false" runat="server" Text='<%# Eval("ECOID") %>' ></asp:Label>
</div>
</ItemTemplate>
</asp:ListView>
と私のItemCommand
イベント:
protected void lvECOItems_ItemCommand(object sender, ListViewCommandEventArgs e)
{
Label ecoItemIDLabel = (Label)e.Item.FindControl("IDLabel");
string id = ecoItemIDLabel.Text;
// get the list item id from the ListView
if (!String.IsNullOrEmpty(this.ecoID) && !String.IsNullOrEmpty(id))
{
if (e.CommandName == "Delete")
{
ECOItemsRepository ecoItemsRepository = new ECOItemsRepository();
ECOItems ecoItems = new ECOItems();
ecoItems.ECOID = this.ecoID;
ecoItems.ID = Int32.Parse(id);
ecoItemsRepository.Delete(ecoItems);
}
else if (e.CommandName == "Update")
{
ECOItemsRepository ecoItemsRepository = new ECOItemsRepository();
ECOItems ecoItems = new ECOItems();
Label IDLabel = (Label)e.Item.FindControl("IDLabel");
TextBox txtDocumentNumber = (TextBox)e.Item.FindControl("txtDocumentNumber");
TextBox txttitle = (TextBox)e.Item.FindControl("txttitle");
TextBox txtRevisionFrom = (TextBox)e.Item.FindControl("txtRevisionFrom");
TextBox txtTo = (TextBox)e.Item.FindControl("txtTo");
ecoItems.ECOID = this.ecoID;
ecoItems.ID = Int32.Parse(IDLabel.Text);
ecoItems.DocumentNumber = txtDocumentNumber.Text;
ecoItems.title = txttitle.Text;
ecoItems.RevisionFrom = txtRevisionFrom.Text;
ecoItems.To = txtTo.Text;
ecoItemsRepository.Edit(ecoItems);
}
BindListView();
}
}
そして私もItemUpdating
イベントを試しています:
protected void lvECOItems_ItemUpdating(object sender, ListViewUpdateEventArgs e)
{
ECOItemsRepository ecoItemsRepository = new ECOItemsRepository();
ECOItems ecoItems = new ECOItems();
Label IDLabel = (Label)lvECOItems.EditItem.FindControl("IDLabel");
TextBox txtDocumentNumber = (TextBox)lvECOItems.EditItem.FindControl("txtDocumentNumber");
TextBox txttitle = (TextBox)lvECOItems.EditItem.FindControl("txttitle");
TextBox txtRevisionFrom = (TextBox)lvECOItems.EditItem.FindControl("txtRevisionFrom");
TextBox txtTo = (TextBox)lvECOItems.EditItem.FindControl("txtTo");
ecoItems.ECOID = this.ecoID;
ecoItems.ID = Int32.Parse(IDLabel.Text);
ecoItems.DocumentNumber = txtDocumentNumber.Text;
ecoItems.title = txttitle.Text;
ecoItems.RevisionFrom = txtRevisionFrom.Text;
ecoItems.To = txtTo.Text;
ecoItemsRepository.Edit(ecoItems);
this.lvECOItems.EditIndex = -1;
BindListView();
そして最後に、私のバインディング方法:
protected void BindListView()
{
if (!String.IsNullOrEmpty(this.ecoID))
{
ECOItemsRepository ecoItemsRepository = new ECOItemsRepository();
this.lvECOItems.DataSource = ecoItemsRepository.GetECOItems(ecoID);
this.lvECOItems.DataBind();
this.lvECOItems.Enabled = true;
}
else
{
this.lvECOItems.Enabled = false;
}
}
編集リンクをクリックすると、ListViewは本来のように編集モードになります。
の更新ボタンをクリックしても、イベントEditItemTemplate
はトリガーされません。ItemCommand
両方の作業を削除してキャンセルします。
ItemUpdating
イベントはまったく発生しません。
注:このListViewはSharePoint Webパーツ内のユーザーコントロールにあるため、ユーザーコントロールは動的に作成されます。私はそれがポストバックでグリッドをバインドすることに関係しているというこっそりの疑いを持っています。しかし、そうしないと、ページの最初のロードを除いて、リストビューが表示されません。