我有一个带有listview的asp.net页面,这个主列表视图里面有几个子(嵌套)列表视图。
页面的想法是主列表视图一次只显示1条记录,但每个子列表视图可能包含0条或更多条记录。无论是插入或编辑主列表视图,用户都应该能够在子列表视图中插入,编辑和删除行
我发现当我在主列表视图中输入记录并在任何子列表视图中的任何行上编辑(按更新按钮)时,我收到此错误消息:
项目已添加。键入词典:'JobID'键是 补充说:' JobID'
当我在任何嵌套列表视图中按下更新按钮时。
我知道这个错误消息通常意味着我正在尝试插入一个项目,其中的键与已经存在的其他内容匹配但是“JobID”在子列表视图中它不是主键但它是关键主列表视图但我不是(明知)对主列表视图做任何事情。
我正在编辑主列表视图时没有收到任何错误消息,或者主列表视图正在插入并且我在子列表视图中插入行
如果它有任何区别,则所有列表视图都具有单个对象的属性作为其数据源。
我怀疑发生的事情是,当我按下子列表视图中的更新按钮时,有些东西正在调用主列表视图。由于主列表视图处于“插入模式”,因此主列表视图正在尝试将主要详细信息插入到导致“第二”插入记录的内容中。
如果我的怀疑是正确的,那么我是否有任何想法如何阻止主列表视图触发其插入例程?我错过了什么或者这是listviews的“功能”吗?
以下代码
提前致谢
主列表视图
<asp:ListView ID="lvJob" runat="server" DataSourceID="dsJob"
DataKeyNames="JobID" oniteminserting="lvJob_ItemInserting"
onitemupdating="lvJob_ItemUpdating"
onitemupdated="lvJob_ItemUpdated"
oniteminserted="lvJob_ItemInserted" EditIndex="0"
onprerender="lvJob_PreRender" ondatabound="lvJob_DataBound" >
子列表视图
<asp:ListView ID="lvQuotes" runat="server" DataKeyNames="QuoteID"
DataSourceID="dsQuotes" InsertItemPosition="LastItem"
oniteminserting="lvQuotes_ItemInserting"
oniteminserted="lvQuotes_ItemInserted"
onitemupdated="lvQuotes_ItemUpdated"
OnItemUpdating="lvQuotes_ItemUpdating" >
<EditItemTemplate>
<tr style="">
<td>
<asp:Button ID="UpdateButton" runat="server" CommandName="Update"
Text="Update" CssClass="ListButton" />
<asp:Button ID="CancelButton" runat="server" CommandName="Cancel"
Text="Cancel" CssClass="ListButton" />
根据要求 - 后面的代码只是为了注意错误发生时这些事件没有被触发但是在其他场景中它们会触发
更新其中一个子列表视图
的事件 protected void lvQuotes_ItemUpdating(object sender, ListViewUpdateEventArgs e)
{
//meaningless code to attach a breakpoint to
JobId = JobId;
}
在主列表视图中插入事件
protected void lvJob_ItemInserting(object sender, ListViewInsertEventArgs e)
{
try
{
e.Values["DateRecieved"] = TestDate(e.Values["DateRecieved"]);
e.Values["DateDue"] = TestDate(e.Values["DateDue"]);
}
catch (Exception ex)
{
e.Cancel = true;
ShowErrorMsg(ex);
}