<p>今天使用ListView控件连接了数据库,在数据库配置中,使用了乐观并发控制。</p>

在页面上,可以进行添加、修改,但是在删除行时,却出现如下错误:

 

You have specified that your delete command compares all values on SqlDataSource 'SqlDataSource_Holiday', but the dictionary passed in for values is empty.  Pass in a valid dictionary for delete or change your mode to OverwriteChanges.

 

在网上找了很久也没有找到相应的解决办法,后来,仔细看ListView的代码,部分如下:

<asp:ListView ID="ListView_Holiday" runat="server" DataKeyNames="idHoliday" 
                DataSourceID="SqlDataSource_Holiday" InsertItemPosition="LastItem">
                <ItemTemplate>
                    <tr style="background-color:#DCDCDC;color: #000000;">
                        <td>
                            <asp:Label ID="idHolidayLabel" runat="server" Text='<%# Eval("idHoliday") %>' />
                        </td>
                        <td>
                            <asp:Label ID="holidayDateLabel" runat="server" 
                                Text='<%# Eval("holidayDate") %>' />
                        </td>
                        <td>
                            <asp:Label ID="nameLabel" runat="server" Text='<%# Eval("name") %>' />
                        </td>
                        <td>
                            <asp:Button ID="DeleteButton" runat="server" CommandName="Delete" 
                                Text="删除" />
                            <asp:Button ID="EditButton" runat="server" CommandName="Edit" Text="修改" />
                        </td>
                    </tr>
                </ItemTemplate>
                <AlternatingItemTemplate>
                    <tr style="background-color:#FFF8DC;">
                        <td>
                            <asp:Label ID="idHolidayLabel" runat="server" Text='<%# Eval("idHoliday") %>' />
                        </td>
                        <td>
                            <asp:Label ID="holidayDateLabel" runat="server" 
                                Text='<%# Eval("holidayDate") %>' />
                        </td>
                        <td>
                            <asp:Label ID="nameLabel" runat="server" Text='<%# Eval("name") %>' />
                        </td>
                        <td>
                            <asp:Button ID="DeleteButton" runat="server" CommandName="Delete" 
                                Text="删除" />
                            <asp:Button ID="EditButton" runat="server" CommandName="Edit" Text="修改" />
                        </td>
                    </tr>
                </AlternatingItemTemplate>
……

可以见到在<asp:Label />中的数据绑定全是使用的Eval()方式,网上说Eval()是单向的数据绑定方式。于是猜是不是这个问题,便将Eval全替换成了Bind,结果真就可以删除了!

原来以为<asp:Label />只能使用Eval()绑定,而<asp:TextBox />才能使用Bind()绑定呢。