<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://forums.asp.net/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Tips &amp; Tricks</title><link>http://forums.asp.net/53.aspx</link><description>Cool code and exciting examples, provided by our members.</description><dc:language>en</dc:language><generator>CommunityServer 2007 SP1 (Build: 20510.895)</generator><item><title>Re: Another Concurrency Issue with Edits</title><link>http://forums.asp.net/thread/2574525.aspx</link><pubDate>Fri, 22 Aug 2008 13:14:11 GMT</pubDate><guid isPermaLink="false">4c671506-2930-414c-a40b-8bf57ded5924:2574525</guid><dc:creator>Caph</dc:creator><author>Caph</author><slash:comments>0</slash:comments><comments>http://forums.asp.net/thread/2574525.aspx</comments><wfw:commentRss>http://forums.asp.net/commentrss.aspx?SectionID=53&amp;PostID=2574525</wfw:commentRss><description>I&amp;#39;ve posted a complete solution on https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=243580</description></item><item><title>Another Concurrency Issue with Edits</title><link>http://forums.asp.net/thread/2391376.aspx</link><pubDate>Fri, 30 May 2008 17:56:07 GMT</pubDate><guid isPermaLink="false">4c671506-2930-414c-a40b-8bf57ded5924:2391376</guid><dc:creator>nngco</dc:creator><author>nngco</author><slash:comments>0</slash:comments><comments>http://forums.asp.net/thread/2391376.aspx</comments><wfw:commentRss>http://forums.asp.net/commentrss.aspx?SectionID=53&amp;PostID=2391376</wfw:commentRss><description>&lt;p&gt;&amp;nbsp;I think I have found another little bug with Scott&amp;#39;s implementation above. &lt;/p&gt;&lt;p&gt;1.&amp;nbsp; User A and user B pull up the same page.&lt;/p&gt;&lt;p&gt;2.&amp;nbsp; User A clicks to Edit a row.&lt;/p&gt;&lt;p&gt;3.&amp;nbsp; User B clicks to Delete the row.&lt;/p&gt;&lt;p&gt;4.&amp;nbsp; User A clicks to update the row.&amp;nbsp;&lt;/p&gt;&lt;p&gt;5.&amp;nbsp; The consequence is that User A will actually update the row right beneath the row he/she was attempting to edit.&amp;nbsp;&lt;/p&gt;&lt;p&gt;This is with the code Scott posted adjusted to also handle edits.&amp;nbsp; &lt;/p&gt;&lt;p&gt;It
seems that the rowcommand event fires after the DataKeys collection is
internally repopluated on the update command.&amp;nbsp; Hence the row below the
one intended for the update is updated.&amp;nbsp;&lt;/p&gt;&lt;p&gt;Can someone verify or
post an easy solution that might get around this while keeping
viewstate off and using an objectdatssource?&amp;nbsp; The only work around I
can think of is to store the datakey on an edit in another persisted
state variable and read it back in on the datasource&amp;#39;s onupdating
command.&amp;nbsp; I guess this is better than storing the whole gridview in
viewstate.&amp;nbsp;&lt;/p&gt;Any ideas would be much appreciated.</description></item><item><title>Re: ObjectDataSource + GridView + Disabled ViewState = Major Concurrency Issues (possible solution)</title><link>http://forums.asp.net/thread/1578075.aspx</link><pubDate>Wed, 14 Feb 2007 11:58:43 GMT</pubDate><guid isPermaLink="false">4c671506-2930-414c-a40b-8bf57ded5924:1578075</guid><dc:creator>RichardD</dc:creator><author>RichardD</author><slash:comments>0</slash:comments><comments>http://forums.asp.net/thread/1578075.aspx</comments><wfw:commentRss>http://forums.asp.net/commentrss.aspx?SectionID=53&amp;PostID=1578075</wfw:commentRss><description>&lt;p&gt;I haven't seen anything to indicate why this bug report has been closed, or whether this problem will be fixed in a future release.&lt;/p&gt;

&lt;p&gt;In my experience, Microsoft seem increasingly reluctant to fix any bugs in the framework for fear of breaking backwards compatibility. I've recently had several bug reports closed as "Won't Fix", quoting &lt;a href="http://blogs.msdn.com/somasegar/archive/2006/05/18/601354.aspx" target="_blank"&gt;S. Somasegar's blog entry&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=252457" target="_blank"&gt;Calendar control adds two title attributes&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href="https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=103133" target="_blank"&gt;Table control should render compliant HTML&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href="https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=152350" target="_blank"&gt;NullReferenceException in Page.DecryptString for invalid WebResource request&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Re: ObjectDataSource + GridView + Disabled ViewState = Major Concurrency Issues (possible solution)</title><link>http://forums.asp.net/thread/1577294.aspx</link><pubDate>Tue, 13 Feb 2007 22:27:49 GMT</pubDate><guid isPermaLink="false">4c671506-2930-414c-a40b-8bf57ded5924:1577294</guid><dc:creator>KarenAnn</dc:creator><author>KarenAnn</author><slash:comments>0</slash:comments><comments>http://forums.asp.net/thread/1577294.aspx</comments><wfw:commentRss>http://forums.asp.net/commentrss.aspx?SectionID=53&amp;PostID=1577294</wfw:commentRss><description>&lt;p&gt;Can someone please confirm that this issue has now been resolved as per &lt;a href="https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=243580"&gt;https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=243580&lt;/a&gt;?&lt;/p&gt;
&lt;p&gt;Or is the above work around the recommended approach?&lt;/p&gt;
&lt;p&gt;Thanks,&lt;/p&gt;
&lt;p&gt;Karen&lt;/p&gt;</description></item><item><title>Re: ObjectDataSource + GridView + Disabled ViewState = Major Concurrency Issues (possible solution)</title><link>http://forums.asp.net/thread/1513776.aspx</link><pubDate>Sun, 31 Dec 2006 13:40:44 GMT</pubDate><guid isPermaLink="false">4c671506-2930-414c-a40b-8bf57ded5924:1513776</guid><dc:creator>valenumr</dc:creator><author>valenumr</author><slash:comments>0</slash:comments><comments>http://forums.asp.net/thread/1513776.aspx</comments><wfw:commentRss>http://forums.asp.net/commentrss.aspx?SectionID=53&amp;PostID=1513776</wfw:commentRss><description>&lt;p&gt;You could just use something a bit simpler, such as the following:&lt;/p&gt;&lt;font size=2&gt;
&lt;p&gt;&lt;/p&gt;&lt;/font&gt;&lt;font color=#0000ff size=2&gt;&amp;lt;&lt;/font&gt;&lt;font color=#800000 size=2&gt;asp&lt;/font&gt;&lt;font color=#0000ff size=2&gt;:&lt;/font&gt;&lt;font color=#800000 size=2&gt;ImageButton&lt;/font&gt;&lt;font size=2&gt; &lt;/font&gt;&lt;font color=#ff0000 size=2&gt;ID&lt;/font&gt;&lt;font color=#0000ff size=2&gt;="bnDelete"&lt;/font&gt;&lt;font size=2&gt; &lt;/font&gt;&lt;font color=#ff0000 size=2&gt;runat&lt;/font&gt;&lt;font color=#0000ff size=2&gt;="server"&lt;/font&gt;&lt;font size=2&gt; &lt;/font&gt;&lt;font color=#ff0000 size=2&gt;ImageUrl&lt;/font&gt;&lt;font color=#0000ff size=2&gt;="~/Images/icon-delete.gif"&lt;/font&gt;&lt;font size=2&gt; &lt;/font&gt;&lt;font color=#ff0000 size=2&gt;CommandName&lt;/font&gt;&lt;font color=#0000ff size=2&gt;="Delete"&lt;/font&gt;&lt;font size=2&gt; &lt;/font&gt;&lt;font color=#ff0000 size=2&gt;CausesValidation&lt;/font&gt;&lt;font color=#0000ff size=2&gt;="false"&lt;/font&gt;
&lt;p&gt;&lt;font color=#ff0000 size=2&gt;CommandArgument&lt;/font&gt;&lt;font color=#0000ff size=2&gt;='&lt;/font&gt;&lt;font size=2&gt;&amp;lt;%# DirectCast(DirectCast(Container,GridViewRow).NamingContainer, GridView).DataKeys(Container.DataItemIndex).Value %&amp;gt;&lt;/font&gt;&lt;font color=#0000ff size=2&gt;'&lt;/font&gt;&lt;font size=2&gt; &lt;/font&gt;&lt;font color=#0000ff size=2&gt;/&amp;gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;This way you will always&amp;nbsp;get the&amp;nbsp;row's primary key&amp;nbsp;whenever&amp;nbsp;the button is clicked. The above is a little ugly, so if you like hand editing, you can use:&lt;/p&gt;
&lt;p&gt;&lt;font color=#0000ff size=2&gt;&amp;lt;&lt;/font&gt;&lt;font color=#800000 size=2&gt;asp&lt;/font&gt;&lt;font color=#0000ff size=2&gt;:&lt;/font&gt;&lt;font color=#800000 size=2&gt;ImageButton&lt;/font&gt;&lt;font size=2&gt; &lt;/font&gt;&lt;font color=#ff0000 size=2&gt;ID&lt;/font&gt;&lt;font color=#0000ff size=2&gt;="bnDelete"&lt;/font&gt;&lt;font size=2&gt; &lt;/font&gt;&lt;font color=#ff0000 size=2&gt;runat&lt;/font&gt;&lt;font color=#0000ff size=2&gt;="server"&lt;/font&gt;&lt;font size=2&gt; &lt;/font&gt;&lt;font color=#ff0000 size=2&gt;ImageUrl&lt;/font&gt;&lt;font color=#0000ff size=2&gt;="~/Images/icon-delete.gif"&lt;/font&gt;&lt;font size=2&gt; &lt;/font&gt;&lt;font color=#ff0000 size=2&gt;CommandName&lt;/font&gt;&lt;font color=#0000ff size=2&gt;="Delete"&lt;/font&gt;&lt;font size=2&gt; &lt;/font&gt;&lt;font color=#ff0000 size=2&gt;CausesValidation&lt;/font&gt;&lt;font color=#0000ff size=2&gt;="false"&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font color=#ff0000 size=2&gt;CommandArgument&lt;/font&gt;&lt;font color=#0000ff size=2&gt;='&lt;/font&gt;&lt;font size=2&gt;&amp;lt;%#&amp;nbsp; Databinder.Eval (Container.DataItem, "myKeyName" %&amp;gt;&lt;/font&gt;&lt;font color=#0000ff size=2&gt;'&lt;/font&gt;&lt;font size=2&gt; &lt;/font&gt;&lt;font color=#0000ff size=2&gt;/&amp;gt;&lt;/font&gt;&lt;/p&gt;&lt;font color=#0000ff size=2&gt;&lt;/font&gt;</description></item><item><title>Re: ObjectDataSource + GridView + Disabled ViewState = Major Concurrency Issues (possible solution)</title><link>http://forums.asp.net/thread/1488573.aspx</link><pubDate>Wed, 06 Dec 2006 19:18:34 GMT</pubDate><guid isPermaLink="false">4c671506-2930-414c-a40b-8bf57ded5924:1488573</guid><dc:creator>Scott Mitchell</dc:creator><author>Scott Mitchell</author><slash:comments>0</slash:comments><comments>http://forums.asp.net/thread/1488573.aspx</comments><wfw:commentRss>http://forums.asp.net/commentrss.aspx?SectionID=53&amp;PostID=1488573</wfw:commentRss><description>&lt;blockquote&gt;&lt;div&gt;&lt;img src="http://forums.asp.net/Themes/default/images/icon-quote.gif" /&gt; &lt;strong&gt;jdcrutchley:&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;Unfortunately I've lost the code, but I experimented once with creating a derived button control that would emit a "doPostBack" script targetted to it's parent when placed in a templated control.&amp;nbsp; So instead of doing __doPostBack('grdData$ctl04$ctl00','') it would do __doPostBack('grdData','Delete$2').&amp;nbsp; That way the event&amp;nbsp;could be&amp;nbsp;raised as if it came from the gridview before instantiating the templated controls.&amp;nbsp; I wish I still had the code so I could show it to you, but essentially I just overrode the Render method.&amp;nbsp; There's probably a better way to do it, but I was just playing around with alternatives at the time.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Check out this blog entry of mine: &lt;a href="http://scottonwriting.net/sowblog/posts/1268.aspx"&gt;http://scottonwriting.net/sowblog/posts/1268.aspx&lt;/a&gt;. Here's the germane part:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;My student, Matt, wrote in to share the following workaround as well (I've not tested it; might not work in all browsers):&lt;/p&gt;
&lt;blockquote dir="ltr" style="margin-right:0px;"&gt;
&lt;p&gt;My colleague Borys has proposed a fix.&amp;nbsp; I don't think I can explain it&lt;br /&gt;very well, but we think it has to do with a conflict between post data&lt;br /&gt;and viewstate.&amp;nbsp; I'll let the code speak for itself.&lt;/p&gt;&lt;code&gt;
&lt;/code&gt;&lt;p&gt;Private Sub DataList1_ItemDataBound(ByVal sender As Object, ByVal e As&lt;br /&gt;System.Web.UI.WebControls.DataListItemEventArgs) Handles&lt;br /&gt;DataList1.ItemDataBound&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim b As Button = DirectCast(e.Item.Controls(1), Button)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim evTarget As String = b.UniqueID.Replace(":", "$")&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim script As String = "__doPostBack('" + evTarget +&lt;br /&gt;"','');return(false)"&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; b.Attributes.Add("onclick", script)&lt;/p&gt;
&lt;p&gt;End Sub&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Hope this helps someone, it was rather fun to examine and unearth the solution.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&amp;nbsp;Which looks like it's updating the __doPostBack call. No idea if this will be of help, but when I saw your post it reminded me of this old blog entry.&lt;/p&gt;&lt;p&gt;HTH&amp;nbsp;&lt;/p&gt;</description></item><item><title>Re: ObjectDataSource + GridView + Disabled ViewState = Major Concurrency Issues (possible solution)</title><link>http://forums.asp.net/thread/1488516.aspx</link><pubDate>Wed, 06 Dec 2006 18:36:25 GMT</pubDate><guid isPermaLink="false">4c671506-2930-414c-a40b-8bf57ded5924:1488516</guid><dc:creator>klabran</dc:creator><author>klabran</author><slash:comments>0</slash:comments><comments>http://forums.asp.net/thread/1488516.aspx</comments><wfw:commentRss>http://forums.asp.net/commentrss.aspx?SectionID=53&amp;PostID=1488516</wfw:commentRss><description>&lt;p&gt;I confirmed Scott's setup with the objectdatasource...&lt;/p&gt;
&lt;p&gt;However, is there a work around for sqldatasources? &lt;br /&gt;&lt;br /&gt;I tried adapting your code (Scott)&amp;nbsp;to them and found that I couldn't capture the value before postback occurs to repop the datakeys. &lt;/p&gt;</description></item><item><title>Re: ObjectDataSource + GridView + Disabled ViewState = Major Concurrency Issues (possible solution)</title><link>http://forums.asp.net/thread/1488236.aspx</link><pubDate>Wed, 06 Dec 2006 15:36:31 GMT</pubDate><guid isPermaLink="false">4c671506-2930-414c-a40b-8bf57ded5924:1488236</guid><dc:creator>RichardD</dc:creator><author>RichardD</author><slash:comments>0</slash:comments><comments>http://forums.asp.net/thread/1488236.aspx</comments><wfw:commentRss>http://forums.asp.net/commentrss.aspx?SectionID=53&amp;PostID=1488236</wfw:commentRss><description>&lt;p&gt;OK, this version of the code should work for the Select, Edit, Update and Delete commands, whether you&amp;#39;re using a CommandField or a TemplateField:&lt;/p&gt;

&lt;pre class="coloredcode"&gt;&lt;b id="1"&gt;1    &lt;/b&gt;&lt;span class="kwd"&gt;using&lt;/span&gt; System;
&lt;b id="2"&gt;2    &lt;/b&gt;&lt;span class="kwd"&gt;using&lt;/span&gt; System.Collections;
&lt;b id="3"&gt;3    &lt;/b&gt;&lt;span class="kwd"&gt;using&lt;/span&gt; System.Collections.Generic;
&lt;b id="4"&gt;4    &lt;/b&gt;&lt;span class="kwd"&gt;using&lt;/span&gt; System.ComponentModel;
&lt;b id="5"&gt;5    &lt;/b&gt;&lt;span class="kwd"&gt;using&lt;/span&gt; System.Globalization;
&lt;b id="6"&gt;6    &lt;/b&gt;&lt;span class="kwd"&gt;using&lt;/span&gt; System.Security.Permissions;
&lt;b id="7"&gt;7    &lt;/b&gt;&lt;span class="kwd"&gt;using&lt;/span&gt; System.Text;
&lt;b id="8"&gt;8    &lt;/b&gt;&lt;span class="kwd"&gt;using&lt;/span&gt; System.Web;
&lt;b id="9"&gt;9    &lt;/b&gt;&lt;span class="kwd"&gt;using&lt;/span&gt; System.Web.UI;
&lt;b id="10"&gt;10   &lt;/b&gt;&lt;span class="kwd"&gt;using&lt;/span&gt; System.Web.UI.WebControls;
&lt;b id="11"&gt;11   &lt;/b&gt;
&lt;b id="12"&gt;12   &lt;/b&gt;[AspNetHostingPermission(SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]
&lt;b id="13"&gt;13   &lt;/b&gt;[AspNetHostingPermission(SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)]
&lt;b id="14"&gt;14   &lt;/b&gt;&lt;span class="kwd"&gt;public class&lt;/span&gt; ExtendedGridView : GridView
&lt;b id="15"&gt;15   &lt;/b&gt;{
&lt;b id="16"&gt;16   &lt;/b&gt;    &lt;span class="kwd"&gt;private&lt;/span&gt; DataKey[] _originalDataKeys;
&lt;b id="17"&gt;17   &lt;/b&gt;    &lt;span class="kwd"&gt;private&lt;/span&gt; DataKey _rowCommandDataKey;
&lt;b id="18"&gt;18   &lt;/b&gt;    &lt;span class="kwd"&gt;private int&lt;/span&gt;? _selectedIndex;
&lt;b id="19"&gt;19   &lt;/b&gt;    &lt;span class="kwd"&gt;private int&lt;/span&gt;? _editIndex;
&lt;b id="20"&gt;20   &lt;/b&gt;    &lt;span class="kwd"&gt;private bool&lt;/span&gt; _suppressDataBind;
&lt;b id="21"&gt;21   &lt;/b&gt;
&lt;b id="22"&gt;22   &lt;/b&gt;    &lt;span class="kwd"&gt;protected override void&lt;/span&gt; LoadControlState(&lt;span class="kwd"&gt;object&lt;/span&gt; savedState)
&lt;b id="23"&gt;23   &lt;/b&gt;    {
&lt;b id="24"&gt;24   &lt;/b&gt;        &lt;span class="kwd"&gt;base&lt;/span&gt;.LoadControlState(savedState);
&lt;b id="25"&gt;25   &lt;/b&gt;
&lt;b id="26"&gt;26   &lt;/b&gt;        &lt;span class="kwd"&gt;if&lt;/span&gt; (!EnableViewState)
&lt;b id="27"&gt;27   &lt;/b&gt;        {
&lt;b id="28"&gt;28   &lt;/b&gt;            DataKeyArray keys = &lt;span class="kwd"&gt;this&lt;/span&gt;.DataKeys;
&lt;b id="29"&gt;29   &lt;/b&gt;            &lt;span class="kwd"&gt;if&lt;/span&gt; (&lt;span class="kwd"&gt;null&lt;/span&gt; != keys &amp;amp;&amp;amp; 0 != keys.Count)
&lt;b id="30"&gt;30   &lt;/b&gt;            {
&lt;b id="31"&gt;31   &lt;/b&gt;                _originalDataKeys = &lt;span class="kwd"&gt;new&lt;/span&gt; DataKey[keys.Count];
&lt;b id="32"&gt;32   &lt;/b&gt;                keys.CopyTo(_originalDataKeys, 0);
&lt;b id="33"&gt;33   &lt;/b&gt;            }
&lt;b id="34"&gt;34   &lt;/b&gt;        }
&lt;b id="35"&gt;35   &lt;/b&gt;    }
&lt;b id="36"&gt;36   &lt;/b&gt;
&lt;b id="37"&gt;37   &lt;/b&gt;    &lt;span class="kwd"&gt;protected override bool&lt;/span&gt; OnBubbleEvent(&lt;span class="kwd"&gt;object&lt;/span&gt; source, EventArgs e)
&lt;b id="38"&gt;38   &lt;/b&gt;    {
&lt;b id="39"&gt;39   &lt;/b&gt;        &lt;span class="kwd"&gt;if&lt;/span&gt; (&lt;span class="kwd"&gt;null&lt;/span&gt; != _originalDataKeys &amp;amp;&amp;amp; &lt;span class="kwd"&gt;null&lt;/span&gt; == _rowCommandDataKey)
&lt;b id="40"&gt;40   &lt;/b&gt;        {
&lt;b id="41"&gt;41   &lt;/b&gt;            GridViewRow row = source &lt;span class="kwd"&gt;as&lt;/span&gt; GridViewRow;
&lt;b id="42"&gt;42   &lt;/b&gt;            GridViewCommandEventArgs args = e &lt;span class="kwd"&gt;as&lt;/span&gt; GridViewCommandEventArgs;
&lt;b id="43"&gt;43   &lt;/b&gt;            &lt;span class="kwd"&gt;if&lt;/span&gt; (&lt;span class="kwd"&gt;null&lt;/span&gt; != row &amp;amp;&amp;amp; &lt;span class="kwd"&gt;null&lt;/span&gt; != args &amp;amp;&amp;amp; 0 &amp;lt;= row.RowIndex &amp;amp;&amp;amp; row.RowIndex &amp;lt; _originalDataKeys.Length)
&lt;b id="44"&gt;44   &lt;/b&gt;            {
&lt;b id="45"&gt;45   &lt;/b&gt;                _rowCommandDataKey = _originalDataKeys[row.RowIndex];
&lt;b id="46"&gt;46   &lt;/b&gt;            }
&lt;b id="47"&gt;47   &lt;/b&gt;        }
&lt;b id="48"&gt;48   &lt;/b&gt;
&lt;b id="49"&gt;49   &lt;/b&gt;        &lt;span class="kwd"&gt;return base&lt;/span&gt;.OnBubbleEvent(source, e);
&lt;b id="50"&gt;50   &lt;/b&gt;    }
&lt;b id="51"&gt;51   &lt;/b&gt;
&lt;b id="52"&gt;52   &lt;/b&gt;    &lt;span class="kwd"&gt;protected override void&lt;/span&gt; OnRowCommand(GridViewCommandEventArgs e)
&lt;b id="53"&gt;53   &lt;/b&gt;    {
&lt;b id="54"&gt;54   &lt;/b&gt;        &lt;span class="kwd"&gt;if&lt;/span&gt; (&lt;span class="kwd"&gt;null&lt;/span&gt; != _originalDataKeys &amp;amp;&amp;amp; &lt;span class="kwd"&gt;null&lt;/span&gt; == _rowCommandDataKey)
&lt;b id="55"&gt;55   &lt;/b&gt;        {
&lt;b id="56"&gt;56   &lt;/b&gt;            &lt;span class="kwd"&gt;string&lt;/span&gt; arg = Convert.ToString(e.CommandArgument, CultureInfo.InvariantCulture);
&lt;b id="57"&gt;57   &lt;/b&gt;            &lt;span class="kwd"&gt;if&lt;/span&gt; (!&lt;span class="kwd"&gt;string&lt;/span&gt;.IsNullOrEmpty(arg))
&lt;b id="58"&gt;58   &lt;/b&gt;            {
&lt;b id="59"&gt;59   &lt;/b&gt;                &lt;span class="kwd"&gt;int&lt;/span&gt; rowIndex;
&lt;b id="60"&gt;60   &lt;/b&gt;                &lt;span class="kwd"&gt;if&lt;/span&gt; (&lt;span class="kwd"&gt;int&lt;/span&gt;.TryParse(arg, NumberStyles.Integer, NumberFormatInfo.InvariantInfo, &lt;span class="kwd"&gt;out&lt;/span&gt; rowIndex))
&lt;b id="61"&gt;61   &lt;/b&gt;                {
&lt;b id="62"&gt;62   &lt;/b&gt;                    &lt;span class="kwd"&gt;if&lt;/span&gt; (0 &amp;lt;= rowIndex &amp;amp;&amp;amp; rowIndex &amp;lt; _originalDataKeys.Length)
&lt;b id="63"&gt;63   &lt;/b&gt;                    {
&lt;b id="64"&gt;64   &lt;/b&gt;                        _rowCommandDataKey = _originalDataKeys[rowIndex];
&lt;b id="65"&gt;65   &lt;/b&gt;                    }
&lt;b id="66"&gt;66   &lt;/b&gt;                }
&lt;b id="67"&gt;67   &lt;/b&gt;            }
&lt;b id="68"&gt;68   &lt;/b&gt;        }
&lt;b id="69"&gt;69   &lt;/b&gt;
&lt;b id="70"&gt;70   &lt;/b&gt;        &lt;span class="kwd"&gt;base&lt;/span&gt;.OnRowCommand(e);
&lt;b id="71"&gt;71   &lt;/b&gt;    }
&lt;b id="72"&gt;72   &lt;/b&gt;
&lt;b id="73"&gt;73   &lt;/b&gt;    &lt;span class="kwd"&gt;protected override void&lt;/span&gt; OnRowDeleting(GridViewDeleteEventArgs e)
&lt;b id="74"&gt;74   &lt;/b&gt;    {
&lt;b id="75"&gt;75   &lt;/b&gt;        &lt;span class="kwd"&gt;if&lt;/span&gt; (&lt;span class="kwd"&gt;null&lt;/span&gt; != _rowCommandDataKey)
&lt;b id="76"&gt;76   &lt;/b&gt;        {
&lt;b id="77"&gt;77   &lt;/b&gt;            &lt;span class="kwd"&gt;foreach&lt;/span&gt; (DictionaryEntry entry &lt;span class="kwd"&gt;in&lt;/span&gt; _rowCommandDataKey.Values)
&lt;b id="78"&gt;78   &lt;/b&gt;            {
&lt;b id="79"&gt;79   &lt;/b&gt;                e.Keys[entry.Key] = entry.Value;
&lt;b id="80"&gt;80   &lt;/b&gt;            }
&lt;b id="81"&gt;81   &lt;/b&gt;
&lt;b id="82"&gt;82   &lt;/b&gt;            _rowCommandDataKey = &lt;span class="kwd"&gt;null&lt;/span&gt;;
&lt;b id="83"&gt;83   &lt;/b&gt;            _originalDataKeys = &lt;span class="kwd"&gt;null&lt;/span&gt;;
&lt;b id="84"&gt;84   &lt;/b&gt;        }
&lt;b id="85"&gt;85   &lt;/b&gt;
&lt;b id="86"&gt;86   &lt;/b&gt;        &lt;span class="kwd"&gt;base&lt;/span&gt;.OnRowDeleting(e);
&lt;b id="87"&gt;87   &lt;/b&gt;    }
&lt;b id="88"&gt;88   &lt;/b&gt;
&lt;b id="89"&gt;89   &lt;/b&gt;    &lt;span class="kwd"&gt;protected override void&lt;/span&gt; OnRowUpdating(GridViewUpdateEventArgs e)
&lt;b id="90"&gt;90   &lt;/b&gt;    {
&lt;b id="91"&gt;91   &lt;/b&gt;        &lt;span class="kwd"&gt;if&lt;/span&gt; (&lt;span class="kwd"&gt;null&lt;/span&gt; != _rowCommandDataKey)
&lt;b id="92"&gt;92   &lt;/b&gt;        {
&lt;b id="93"&gt;93   &lt;/b&gt;            &lt;span class="kwd"&gt;foreach&lt;/span&gt; (DictionaryEntry entry &lt;span class="kwd"&gt;in&lt;/span&gt; _rowCommandDataKey.Values)
&lt;b id="94"&gt;94   &lt;/b&gt;            {
&lt;b id="95"&gt;95   &lt;/b&gt;                e.Keys[entry.Key] = entry.Value;
&lt;b id="96"&gt;96   &lt;/b&gt;            }
&lt;b id="97"&gt;97   &lt;/b&gt;
&lt;b id="98"&gt;98   &lt;/b&gt;            _rowCommandDataKey = &lt;span class="kwd"&gt;null&lt;/span&gt;;
&lt;b id="99"&gt;99   &lt;/b&gt;            _originalDataKeys = &lt;span class="kwd"&gt;null&lt;/span&gt;;
&lt;b id="100"&gt;100  &lt;/b&gt;        }
&lt;b id="101"&gt;101  &lt;/b&gt;
&lt;b id="102"&gt;102  &lt;/b&gt;        &lt;span class="kwd"&gt;base&lt;/span&gt;.OnRowUpdating(e);
&lt;b id="103"&gt;103  &lt;/b&gt;    }
&lt;b id="104"&gt;104  &lt;/b&gt;
&lt;b id="105"&gt;105  &lt;/b&gt;    &lt;span class="kwd"&gt;protected override void&lt;/span&gt; OnDataSourceViewChanged(&lt;span class="kwd"&gt;object&lt;/span&gt; sender, EventArgs e)
&lt;b id="106"&gt;106  &lt;/b&gt;    {
&lt;b id="107"&gt;107  &lt;/b&gt;        _originalDataKeys = &lt;span class="kwd"&gt;null&lt;/span&gt;;
&lt;b id="108"&gt;108  &lt;/b&gt;        _rowCommandDataKey = &lt;span class="kwd"&gt;null&lt;/span&gt;;
&lt;b id="109"&gt;109  &lt;/b&gt;        &lt;span class="kwd"&gt;base&lt;/span&gt;.OnDataSourceViewChanged(sender, e);
&lt;b id="110"&gt;110  &lt;/b&gt;    }
&lt;b id="111"&gt;111  &lt;/b&gt;    
&lt;b id="112"&gt;112  &lt;/b&gt;    &lt;span class="kwd"&gt;protected override void&lt;/span&gt; EnsureDataBound()
&lt;b id="113"&gt;113  &lt;/b&gt;    {
&lt;b id="114"&gt;114  &lt;/b&gt;        &lt;span class="kwd"&gt;if&lt;/span&gt; (!_suppressDataBind)
&lt;b id="115"&gt;115  &lt;/b&gt;        {
&lt;b id="116"&gt;116  &lt;/b&gt;            &lt;span class="kwd"&gt;base&lt;/span&gt;.EnsureDataBound();
&lt;b id="117"&gt;117  &lt;/b&gt;        }
&lt;b id="118"&gt;118  &lt;/b&gt;    }
&lt;b id="119"&gt;119  &lt;/b&gt;
&lt;b id="120"&gt;120  &lt;/b&gt;    &lt;span class="kwd"&gt;protected override int&lt;/span&gt; CreateChildControls(IEnumerable dataSource, &lt;span class="kwd"&gt;bool&lt;/span&gt; dataBinding)
&lt;b id="121"&gt;121  &lt;/b&gt;    {
&lt;b id="122"&gt;122  &lt;/b&gt;        _selectedIndex = &lt;span class="kwd"&gt;null&lt;/span&gt;;
&lt;b id="123"&gt;123  &lt;/b&gt;        _editIndex = &lt;span class="kwd"&gt;null&lt;/span&gt;;
&lt;b id="124"&gt;124  &lt;/b&gt;
&lt;b id="125"&gt;125  &lt;/b&gt;        &lt;span class="kwd"&gt;int&lt;/span&gt; result = &lt;span class="kwd"&gt;base&lt;/span&gt;.CreateChildControls(dataSource, dataBinding);
&lt;b id="126"&gt;126  &lt;/b&gt;
&lt;b id="127"&gt;127  &lt;/b&gt;        &lt;span class="kwd"&gt;if&lt;/span&gt; (&lt;span class="kwd"&gt;base&lt;/span&gt;.RequiresDataBinding)
&lt;b id="128"&gt;128  &lt;/b&gt;        {
&lt;b id="129"&gt;129  &lt;/b&gt;            &lt;span class="kwd"&gt;base&lt;/span&gt;.SelectedIndex = _selectedIndex ?? -1;
&lt;b id="130"&gt;130  &lt;/b&gt;            &lt;span class="kwd"&gt;base&lt;/span&gt;.EditIndex = _editIndex ?? -1;
&lt;b id="131"&gt;131  &lt;/b&gt;        }
&lt;b id="132"&gt;132  &lt;/b&gt;        &lt;span class="kwd"&gt;else&lt;/span&gt;
&lt;b id="133"&gt;133  &lt;/b&gt;        {
&lt;b id="134"&gt;134  &lt;/b&gt;            _suppressDataBind = &lt;span class="kwd"&gt;true&lt;/span&gt;;
&lt;b id="135"&gt;135  &lt;/b&gt;            &lt;span class="kwd"&gt;try&lt;/span&gt;
&lt;b id="136"&gt;136  &lt;/b&gt;            {
&lt;b id="137"&gt;137  &lt;/b&gt;                &lt;span class="kwd"&gt;base&lt;/span&gt;.SelectedIndex = _selectedIndex ?? -1;
&lt;b id="138"&gt;138  &lt;/b&gt;                &lt;span class="kwd"&gt;base&lt;/span&gt;.EditIndex = _editIndex ?? -1;
&lt;b id="139"&gt;139  &lt;/b&gt;                &lt;span class="kwd"&gt;base&lt;/span&gt;.RequiresDataBinding = &lt;span class="kwd"&gt;false&lt;/span&gt;;
&lt;b id="140"&gt;140  &lt;/b&gt;            }
&lt;b id="141"&gt;141  &lt;/b&gt;            &lt;span class="kwd"&gt;finally&lt;/span&gt;
&lt;b id="142"&gt;142  &lt;/b&gt;            {
&lt;b id="143"&gt;143  &lt;/b&gt;                _suppressDataBind = &lt;span class="kwd"&gt;false&lt;/span&gt;;
&lt;b id="144"&gt;144  &lt;/b&gt;            }
&lt;b id="145"&gt;145  &lt;/b&gt;        }
&lt;b id="146"&gt;146  &lt;/b&gt;
&lt;b id="147"&gt;147  &lt;/b&gt;        &lt;span class="kwd"&gt;return&lt;/span&gt; result;
&lt;b id="148"&gt;148  &lt;/b&gt;    }
&lt;b id="149"&gt;149  &lt;/b&gt;
&lt;b id="150"&gt;150  &lt;/b&gt;    &lt;span class="kwd"&gt;protected override&lt;/span&gt; GridViewRow CreateRow(&lt;span class="kwd"&gt;int&lt;/span&gt; rowIndex, &lt;span class="kwd"&gt;int&lt;/span&gt; dataSourceIndex, DataControlRowType rowType, DataControlRowState rowState)
&lt;b id="151"&gt;151  &lt;/b&gt;    {
&lt;b id="152"&gt;152  &lt;/b&gt;        &lt;span class="kwd"&gt;if&lt;/span&gt; (DataControlRowType.DataRow == rowType &amp;amp;&amp;amp; &lt;span class="kwd"&gt;null&lt;/span&gt; != _originalDataKeys)
&lt;b id="153"&gt;153  &lt;/b&gt;        {
&lt;b id="154"&gt;154  &lt;/b&gt;            &lt;span class="kwd"&gt;int&lt;/span&gt; index = &lt;span class="kwd"&gt;base&lt;/span&gt;.SelectedIndex;
&lt;b id="155"&gt;155  &lt;/b&gt;            &lt;span class="kwd"&gt;if&lt;/span&gt; (-1 != index &amp;amp;&amp;amp; index &amp;lt; _originalDataKeys.Length)
&lt;b id="156"&gt;156  &lt;/b&gt;            {
&lt;b id="157"&gt;157  &lt;/b&gt;                &lt;span class="kwd"&gt;if&lt;/span&gt; (DataKeyEqualityComparer.Instance.Equals(_originalDataKeys[index], &lt;span class="kwd"&gt;this&lt;/span&gt;.DataKeys[rowIndex]))
&lt;b id="158"&gt;158  &lt;/b&gt;                {
&lt;b id="159"&gt;159  &lt;/b&gt;                    _selectedIndex = rowIndex;
&lt;b id="160"&gt;160  &lt;/b&gt;                    rowState |= DataControlRowState.Selected;
&lt;b id="161"&gt;161  &lt;/b&gt;                }
&lt;b id="162"&gt;162  &lt;/b&gt;                &lt;span class="kwd"&gt;else&lt;/span&gt;
&lt;b id="163"&gt;163  &lt;/b&gt;                {
&lt;b id="164"&gt;164  &lt;/b&gt;                    rowState &amp;amp;= ~DataControlRowState.Selected;
&lt;b id="165"&gt;165  &lt;/b&gt;                }
&lt;b id="166"&gt;166  &lt;/b&gt;            }
&lt;b id="167"&gt;167  &lt;/b&gt;
&lt;b id="168"&gt;168  &lt;/b&gt;            index = &lt;span class="kwd"&gt;base&lt;/span&gt;.EditIndex;
&lt;b id="169"&gt;169  &lt;/b&gt;            &lt;span class="kwd"&gt;if&lt;/span&gt; (-1 != index &amp;amp;&amp;amp; index &amp;lt; _originalDataKeys.Length)
&lt;b id="170"&gt;170  &lt;/b&gt;            {
&lt;b id="171"&gt;171  &lt;/b&gt;                &lt;span class="kwd"&gt;if&lt;/span&gt; (DataKeyEqualityComparer.Instance.Equals(_originalDataKeys[index], &lt;span class="kwd"&gt;this&lt;/span&gt;.DataKeys[rowIndex]))
&lt;b id="172"&gt;172  &lt;/b&gt;                {
&lt;b id="173"&gt;173  &lt;/b&gt;                    _editIndex = rowIndex;
&lt;b id="174"&gt;174  &lt;/b&gt;                    rowState |= DataControlRowState.Edit;
&lt;b id="175"&gt;175  &lt;/b&gt;                }
&lt;b id="176"&gt;176  &lt;/b&gt;                &lt;span class="kwd"&gt;else if&lt;/span&gt; (DataControlRowState.Edit == (DataControlRowState.Edit &amp;amp; rowState))
&lt;b id="177"&gt;177  &lt;/b&gt;                {
&lt;b id="178"&gt;178  &lt;/b&gt;                    rowState &amp;amp;= ~DataControlRowState.Edit;
&lt;b id="179"&gt;179  &lt;/b&gt;                }
&lt;b id="180"&gt;180  &lt;/b&gt;            }
&lt;b id="181"&gt;181  &lt;/b&gt;        }
&lt;b id="182"&gt;182  &lt;/b&gt;
&lt;b id="183"&gt;183  &lt;/b&gt;        &lt;span class="kwd"&gt;return base&lt;/span&gt;.CreateRow(rowIndex, dataSourceIndex, rowType, rowState);
&lt;b id="184"&gt;184  &lt;/b&gt;    }
&lt;b id="185"&gt;185  &lt;/b&gt;    
&lt;b id="186"&gt;186  &lt;/b&gt;    &lt;span class="kwd"&gt;protected static int&lt;/span&gt; FindKeyIndex(DataKeyArray keys, DataKey &lt;span class="kwd"&gt;value&lt;/span&gt;)
&lt;b id="187"&gt;187  &lt;/b&gt;    {
&lt;b id="188"&gt;188  &lt;/b&gt;        &lt;span class="kwd"&gt;if&lt;/span&gt; (&lt;span class="kwd"&gt;null&lt;/span&gt; == keys || 0 == keys.Count) &lt;span class="kwd"&gt;return&lt;/span&gt; -1;
&lt;b id="189"&gt;189  &lt;/b&gt;        &lt;span class="kwd"&gt;if&lt;/span&gt; (&lt;span class="kwd"&gt;null&lt;/span&gt; == &lt;span class="kwd"&gt;value&lt;/span&gt;) &lt;span class="kwd"&gt;return&lt;/span&gt; -1;
&lt;b id="190"&gt;190  &lt;/b&gt;        
&lt;b id="191"&gt;191  &lt;/b&gt;        IEqualityComparer comparer = DataKeyEqualityComparer.Instance;
&lt;b id="192"&gt;192  &lt;/b&gt;        &lt;span class="kwd"&gt;for&lt;/span&gt; (&lt;span class="kwd"&gt;int&lt;/span&gt; index = 0; index &amp;lt; keys.Count; index++)
&lt;b id="193"&gt;193  &lt;/b&gt;        {
&lt;b id="194"&gt;194  &lt;/b&gt;            &lt;span class="kwd"&gt;if&lt;/span&gt; (comparer.Equals(keys[index], &lt;span class="kwd"&gt;value&lt;/span&gt;))
&lt;b id="195"&gt;195  &lt;/b&gt;                &lt;span class="kwd"&gt;return&lt;/span&gt; index;
&lt;b id="196"&gt;196  &lt;/b&gt;        }
&lt;b id="197"&gt;197  &lt;/b&gt;        
&lt;b id="198"&gt;198  &lt;/b&gt;        &lt;span class="kwd"&gt;return&lt;/span&gt; -1;
&lt;b id="199"&gt;199  &lt;/b&gt;    }    
&lt;b id="200"&gt;200  &lt;/b&gt;}
&lt;b id="201"&gt;201  &lt;/b&gt;
&lt;b id="202"&gt;202  &lt;/b&gt;[AspNetHostingPermission(SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]
&lt;b id="203"&gt;203  &lt;/b&gt;&lt;span class="kwd"&gt;public sealed class&lt;/span&gt; DataKeyEqualityComparer : IEqualityComparer
&lt;b id="204"&gt;204  &lt;/b&gt;{
&lt;b id="205"&gt;205  &lt;/b&gt;    &lt;span class="kwd"&gt;private static readonly&lt;/span&gt; DataKeyEqualityComparer _instance = &lt;span class="kwd"&gt;new&lt;/span&gt; DataKeyEqualityComparer();
&lt;b id="206"&gt;206  &lt;/b&gt;
&lt;b id="207"&gt;207  &lt;/b&gt;    &lt;span class="kwd"&gt;private&lt;/span&gt; DataKeyEqualityComparer()
&lt;b id="208"&gt;208  &lt;/b&gt;    {
&lt;b id="209"&gt;209  &lt;/b&gt;    }
&lt;b id="210"&gt;210  &lt;/b&gt;
&lt;b id="211"&gt;211  &lt;/b&gt;    &lt;span class="kwd"&gt;public static&lt;/span&gt; DataKeyEqualityComparer Instance
&lt;b id="212"&gt;212  &lt;/b&gt;    {
&lt;b id="213"&gt;213  &lt;/b&gt;        &lt;span class="kwd"&gt;get&lt;/span&gt; { &lt;span class="kwd"&gt;return&lt;/span&gt; _instance; }
&lt;b id="214"&gt;214  &lt;/b&gt;    }
&lt;b id="215"&gt;215  &lt;/b&gt;
&lt;b id="216"&gt;216  &lt;/b&gt;    &lt;span class="kwd"&gt;int&lt;/span&gt; IEqualityComparer.GetHashCode(DataKey obj)
&lt;b id="217"&gt;217  &lt;/b&gt;    {
&lt;b id="218"&gt;218  &lt;/b&gt;        &lt;span class="kwd"&gt;if&lt;/span&gt; (&lt;span class="kwd"&gt;null&lt;/span&gt; == obj) &lt;span class="kwd"&gt;return&lt;/span&gt; 0;
&lt;b id="219"&gt;219  &lt;/b&gt;        &lt;span class="kwd"&gt;return&lt;/span&gt; obj.GetHashCode();
&lt;b id="220"&gt;220  &lt;/b&gt;    }
&lt;b id="221"&gt;221  &lt;/b&gt;
&lt;b id="222"&gt;222  &lt;/b&gt;    &lt;span class="kwd"&gt;public bool&lt;/span&gt; Equals(DataKey x, DataKey y)
&lt;b id="223"&gt;223  &lt;/b&gt;    {
&lt;b id="224"&gt;224  &lt;/b&gt;        &lt;span class="kwd"&gt;if&lt;/span&gt; (&lt;span class="kwd"&gt;object&lt;/span&gt;.ReferenceEquals(x, y)) &lt;span class="kwd"&gt;return true&lt;/span&gt;;
&lt;b id="225"&gt;225  &lt;/b&gt;        &lt;span class="kwd"&gt;if&lt;/span&gt; (&lt;span class="kwd"&gt;null&lt;/span&gt; == x || &lt;span class="kwd"&gt;null&lt;/span&gt; == y) &lt;span class="kwd"&gt;return false&lt;/span&gt;;
&lt;b id="226"&gt;226  &lt;/b&gt;        &lt;span class="kwd"&gt;return&lt;/span&gt; Equals(x.Values, y.Values);
&lt;b id="227"&gt;227  &lt;/b&gt;    }
&lt;b id="228"&gt;228  &lt;/b&gt;
&lt;b id="229"&gt;229  &lt;/b&gt;    &lt;span class="kwd"&gt;private static bool&lt;/span&gt; Equals(IDictionary x, IDictionary y)
&lt;b id="230"&gt;230  &lt;/b&gt;    {
&lt;b id="231"&gt;231  &lt;/b&gt;        &lt;span class="kwd"&gt;if&lt;/span&gt; (&lt;span class="kwd"&gt;object&lt;/span&gt;.ReferenceEquals(x, y)) &lt;span class="kwd"&gt;return true&lt;/span&gt;;
&lt;b id="232"&gt;232  &lt;/b&gt;        &lt;span class="kwd"&gt;if&lt;/span&gt; (&lt;span class="kwd"&gt;null&lt;/span&gt; == x || &lt;span class="kwd"&gt;null&lt;/span&gt; == y) &lt;span class="kwd"&gt;return false&lt;/span&gt;;
&lt;b id="233"&gt;233  &lt;/b&gt;        &lt;span class="kwd"&gt;if&lt;/span&gt; (x.Count != y.Count) &lt;span class="kwd"&gt;return false&lt;/span&gt;;
&lt;b id="234"&gt;234  &lt;/b&gt;
&lt;b id="235"&gt;235  &lt;/b&gt;        &lt;span class="kwd"&gt;foreach&lt;/span&gt; (DictionaryEntry entry &lt;span class="kwd"&gt;in&lt;/span&gt; x)
&lt;b id="236"&gt;236  &lt;/b&gt;        {
&lt;b id="237"&gt;237  &lt;/b&gt;            &lt;span class="kwd"&gt;if&lt;/span&gt; (!y.Contains(entry.Key)) &lt;span class="kwd"&gt;return false&lt;/span&gt;;
&lt;b id="238"&gt;238  &lt;/b&gt;            &lt;span class="kwd"&gt;if&lt;/span&gt; (!ValueEquals(entry.Value, y[entry.Key])) &lt;span class="kwd"&gt;return false&lt;/span&gt;;
&lt;b id="239"&gt;239  &lt;/b&gt;        }
&lt;b id="240"&gt;240  &lt;/b&gt;
&lt;b id="241"&gt;241  &lt;/b&gt;        &lt;span class="kwd"&gt;return true&lt;/span&gt;;
&lt;b id="242"&gt;242  &lt;/b&gt;    }
&lt;b id="243"&gt;243  &lt;/b&gt;
&lt;b id="244"&gt;244  &lt;/b&gt;    &lt;span class="kwd"&gt;private static bool&lt;/span&gt; ValueEquals(&lt;span class="kwd"&gt;object&lt;/span&gt; x, &lt;span class="kwd"&gt;object&lt;/span&gt; y)
&lt;b id="245"&gt;245  &lt;/b&gt;    {
&lt;b id="246"&gt;246  &lt;/b&gt;        &lt;span class="kwd"&gt;if&lt;/span&gt; (&lt;span class="kwd"&gt;object&lt;/span&gt;.ReferenceEquals(&lt;span class="kwd"&gt;null&lt;/span&gt;, x)) &lt;span class="kwd"&gt;return object&lt;/span&gt;.ReferenceEquals(&lt;span class="kwd"&gt;null&lt;/span&gt;, y);
&lt;b id="247"&gt;247  &lt;/b&gt;        &lt;span class="kwd"&gt;if&lt;/span&gt; (&lt;span class="kwd"&gt;object&lt;/span&gt;.ReferenceEquals(&lt;span class="kwd"&gt;null&lt;/span&gt;, y)) &lt;span class="kwd"&gt;return false&lt;/span&gt;;
&lt;b id="248"&gt;248  &lt;/b&gt;        &lt;span class="kwd"&gt;return&lt;/span&gt; x.Equals(y);
&lt;b id="249"&gt;249  &lt;/b&gt;    }
&lt;b id="250"&gt;250  &lt;/b&gt;}
&lt;/pre&gt;&amp;nbsp;</description></item><item><title>Re: ObjectDataSource + GridView + Disabled ViewState = Major Concurrency Issues (possible solution)</title><link>http://forums.asp.net/thread/1488132.aspx</link><pubDate>Wed, 06 Dec 2006 14:27:25 GMT</pubDate><guid isPermaLink="false">4c671506-2930-414c-a40b-8bf57ded5924:1488132</guid><dc:creator>jdcrutchley</dc:creator><author>jdcrutchley</author><slash:comments>0</slash:comments><comments>http://forums.asp.net/thread/1488132.aspx</comments><wfw:commentRss>http://forums.asp.net/commentrss.aspx?SectionID=53&amp;PostID=1488132</wfw:commentRss><description>&lt;p&gt;Unfortunately I've lost the code, but I experimented once with creating a derived button control that would emit a "doPostBack" script targetted to it's parent when placed in a templated control.&amp;nbsp; So instead of doing __doPostBack('grdData$ctl04$ctl00','') it would do __doPostBack('grdData','Delete$2').&amp;nbsp; That way the event&amp;nbsp;could be&amp;nbsp;raised as if it came from the gridview before instantiating the templated controls.&amp;nbsp; I wish I still had the code so I could show it to you, but essentially I just overrode the Render method.&amp;nbsp; There's probably a better way to do it, but I was just playing around with alternatives at the time.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description></item><item><title>Re: ObjectDataSource + GridView + Disabled ViewState = Major Concurrency Issues (possible solution)</title><link>http://forums.asp.net/thread/1487973.aspx</link><pubDate>Wed, 06 Dec 2006 11:23:12 GMT</pubDate><guid isPermaLink="false">4c671506-2930-414c-a40b-8bf57ded5924:1487973</guid><dc:creator>RichardD</dc:creator><author>RichardD</author><slash:comments>0</slash:comments><comments>http://forums.asp.net/thread/1487973.aspx</comments><wfw:commentRss>http://forums.asp.net/commentrss.aspx?SectionID=53&amp;PostID=1487973</wfw:commentRss><description>&lt;p&gt;The workaround works fine if you're using a CommandField, but not if you're using a TemplateField.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;With a CommandField, the generated postback script looks like: &lt;pre class="coloredcode"&gt;__doPostBack('GridView1','Delete$2')&lt;/pre&gt;&lt;/li&gt;

&lt;li&gt;With a TemplateField, the script looks like: &lt;pre class="coloredcode"&gt;__doPostBack('grdData$ctl04$ctl00','')&lt;/pre&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Using a TemplateField, the child controls have to be re-created before the event can be raised, which involves re-binding the grid to the data source. As a result, by the time the RowCommand event is raised, the DataKeys collection has been re-populated.&lt;/p&gt;</description></item><item><title>Re: ObjectDataSource + GridView + Disabled ViewState = Major Concurrency Issues (possible solution)</title><link>http://forums.asp.net/thread/1487624.aspx</link><pubDate>Wed, 06 Dec 2006 04:43:58 GMT</pubDate><guid isPermaLink="false">4c671506-2930-414c-a40b-8bf57ded5924:1487624</guid><dc:creator>Scott Mitchell</dc:creator><author>Scott Mitchell</author><slash:comments>0</slash:comments><comments>http://forums.asp.net/thread/1487624.aspx</comments><wfw:commentRss>http://forums.asp.net/commentrss.aspx?SectionID=53&amp;PostID=1487624</wfw:commentRss><description>&lt;p&gt;My workaround works fine in my tests using an ObjectDataSource bound to the GridView. The following works for me:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;pre class="coloredcode"&gt;&lt;b id="1"&gt;1    &lt;/b&gt;&lt;span class="dir"&gt;&amp;lt;%@ Page Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="Basics.aspx.cs" Inherits="EditInsertDelete_Basics" Title="Untitled Page" %&amp;gt;&lt;/span&gt;
&lt;b id="2"&gt;2    &lt;/b&gt;&amp;lt;&lt;span class="tag"&gt;asp:Content&lt;/span&gt;&lt;span class="attr"&gt; ID=&lt;/span&gt;&lt;span class="attrv"&gt;"Content1"&lt;/span&gt;&lt;span class="attr"&gt; ContentPlaceHolderID=&lt;/span&gt;&lt;span class="attrv"&gt;"MainContent"&lt;/span&gt;&lt;span class="attr"&gt; Runat=&lt;/span&gt;&lt;span class="attrv"&gt;"Server"&lt;/span&gt;&amp;gt;
&lt;b id="3"&gt;3    &lt;/b&gt;    &amp;lt;&lt;span class="tag"&gt;h2&lt;/span&gt;&amp;gt;
&lt;b id="4"&gt;4    &lt;/b&gt;        The Basics of Editing, Inserting, and Deleting&amp;lt;/&lt;span class="tag"&gt;h2&lt;/span&gt;&amp;gt;
&lt;b id="5"&gt;5    &lt;/b&gt;        &amp;lt;&lt;span class="tag"&gt;asp:ObjectDataSource&lt;/span&gt;&lt;span class="attr"&gt; ID=&lt;/span&gt;&lt;span class="attrv"&gt;"ObjectDataSource1"&lt;/span&gt;&lt;span class="attr"&gt; runat=&lt;/span&gt;&lt;span class="attrv"&gt;"server"&lt;/span&gt;&lt;span class="attr"&gt; DeleteMethod=&lt;/span&gt;&lt;span class="attrv"&gt;"DeleteProduct"&lt;/span&gt;
&lt;b id="6"&gt;6    &lt;/b&gt;&lt;span class="attr"&gt;            InsertMethod=&lt;/span&gt;&lt;span class="attrv"&gt;"AddProduct"&lt;/span&gt;&lt;span class="attr"&gt; SelectMethod=&lt;/span&gt;&lt;span class="attrv"&gt;"GetProducts"&lt;/span&gt;
&lt;b id="7"&gt;7    &lt;/b&gt;&lt;span class="attr"&gt;            TypeName=&lt;/span&gt;&lt;span class="attrv"&gt;"ProductsBLL"&lt;/span&gt;&lt;span class="attr"&gt; UpdateMethod=&lt;/span&gt;&lt;span class="attrv"&gt;"UpdateProduct"&lt;/span&gt;&lt;span class="attr"&gt; OnDataBinding=&lt;/span&gt;&lt;span class="attrv"&gt;"ObjectDataSource1_DataBinding"&lt;/span&gt;&lt;span class="attr"&gt; OnDeleting=&lt;/span&gt;&lt;span class="attrv"&gt;"ObjectDataSource1_Deleting"&lt;/span&gt;&lt;span class="attr"&gt; OnSelecting=&lt;/span&gt;&lt;span class="attrv"&gt;"ObjectDataSource1_Selecting"&lt;/span&gt;&amp;gt;
&lt;b id="8"&gt;8    &lt;/b&gt;            &amp;lt;&lt;span class="tag"&gt;DeleteParameters&lt;/span&gt;&amp;gt;
&lt;b id="9"&gt;9    &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;asp:Parameter&lt;/span&gt;&lt;span class="attr"&gt; Name=&lt;/span&gt;&lt;span class="attrv"&gt;"productID"&lt;/span&gt;&lt;span class="attr"&gt; Type=&lt;/span&gt;&lt;span class="attrv"&gt;"Int32"&lt;/span&gt; /&amp;gt;
&lt;b id="10"&gt;10   &lt;/b&gt;            &amp;lt;/&lt;span class="tag"&gt;DeleteParameters&lt;/span&gt;&amp;gt;
&lt;b id="11"&gt;11   &lt;/b&gt;            &amp;lt;&lt;span class="tag"&gt;UpdateParameters&lt;/span&gt;&amp;gt;
&lt;b id="12"&gt;12   &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;asp:Parameter&lt;/span&gt;&lt;span class="attr"&gt; Name=&lt;/span&gt;&lt;span class="attrv"&gt;"productName"&lt;/span&gt;&lt;span class="attr"&gt; Type=&lt;/span&gt;&lt;span class="attrv"&gt;"String"&lt;/span&gt; /&amp;gt;
&lt;b id="13"&gt;13   &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;asp:Parameter&lt;/span&gt;&lt;span class="attr"&gt; Name=&lt;/span&gt;&lt;span class="attrv"&gt;"supplierID"&lt;/span&gt;&lt;span class="attr"&gt; Type=&lt;/span&gt;&lt;span class="attrv"&gt;"Int32"&lt;/span&gt; /&amp;gt;
&lt;b id="14"&gt;14   &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;asp:Parameter&lt;/span&gt;&lt;span class="attr"&gt; Name=&lt;/span&gt;&lt;span class="attrv"&gt;"categoryID"&lt;/span&gt;&lt;span class="attr"&gt; Type=&lt;/span&gt;&lt;span class="attrv"&gt;"Int32"&lt;/span&gt; /&amp;gt;
&lt;b id="15"&gt;15   &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;asp:Parameter&lt;/span&gt;&lt;span class="attr"&gt; Name=&lt;/span&gt;&lt;span class="attrv"&gt;"quantityPerUnit"&lt;/span&gt;&lt;span class="attr"&gt; Type=&lt;/span&gt;&lt;span class="attrv"&gt;"String"&lt;/span&gt; /&amp;gt;
&lt;b id="16"&gt;16   &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;asp:Parameter&lt;/span&gt;&lt;span class="attr"&gt; Name=&lt;/span&gt;&lt;span class="attrv"&gt;"unitPrice"&lt;/span&gt;&lt;span class="attr"&gt; Type=&lt;/span&gt;&lt;span class="attrv"&gt;"Decimal"&lt;/span&gt; /&amp;gt;
&lt;b id="17"&gt;17   &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;asp:Parameter&lt;/span&gt;&lt;span class="attr"&gt; Name=&lt;/span&gt;&lt;span class="attrv"&gt;"unitsInStock"&lt;/span&gt;&lt;span class="attr"&gt; Type=&lt;/span&gt;&lt;span class="attrv"&gt;"Int16"&lt;/span&gt; /&amp;gt;
&lt;b id="18"&gt;18   &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;asp:Parameter&lt;/span&gt;&lt;span class="attr"&gt; Name=&lt;/span&gt;&lt;span class="attrv"&gt;"unitsOnOrder"&lt;/span&gt;&lt;span class="attr"&gt; Type=&lt;/span&gt;&lt;span class="attrv"&gt;"Int16"&lt;/span&gt; /&amp;gt;
&lt;b id="19"&gt;19   &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;asp:Parameter&lt;/span&gt;&lt;span class="attr"&gt; Name=&lt;/span&gt;&lt;span class="attrv"&gt;"reorderLevel"&lt;/span&gt;&lt;span class="attr"&gt; Type=&lt;/span&gt;&lt;span class="attrv"&gt;"Int16"&lt;/span&gt; /&amp;gt;
&lt;b id="20"&gt;20   &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;asp:Parameter&lt;/span&gt;&lt;span class="attr"&gt; Name=&lt;/span&gt;&lt;span class="attrv"&gt;"discontinued"&lt;/span&gt;&lt;span class="attr"&gt; Type=&lt;/span&gt;&lt;span class="attrv"&gt;"Boolean"&lt;/span&gt; /&amp;gt;
&lt;b id="21"&gt;21   &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;asp:Parameter&lt;/span&gt;&lt;span class="attr"&gt; Name=&lt;/span&gt;&lt;span class="attrv"&gt;"productID"&lt;/span&gt;&lt;span class="attr"&gt; Type=&lt;/span&gt;&lt;span class="attrv"&gt;"Int32"&lt;/span&gt; /&amp;gt;
&lt;b id="22"&gt;22   &lt;/b&gt;            &amp;lt;/&lt;span class="tag"&gt;UpdateParameters&lt;/span&gt;&amp;gt;
&lt;b id="23"&gt;23   &lt;/b&gt;            &amp;lt;&lt;span class="tag"&gt;InsertParameters&lt;/span&gt;&amp;gt;
&lt;b id="24"&gt;24   &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;asp:Parameter&lt;/span&gt;&lt;span class="attr"&gt; Name=&lt;/span&gt;&lt;span class="attrv"&gt;"productName"&lt;/span&gt;&lt;span class="attr"&gt; Type=&lt;/span&gt;&lt;span class="attrv"&gt;"String"&lt;/span&gt; /&amp;gt;
&lt;b id="25"&gt;25   &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;asp:Parameter&lt;/span&gt;&lt;span class="attr"&gt; Name=&lt;/span&gt;&lt;span class="attrv"&gt;"supplierID"&lt;/span&gt;&lt;span class="attr"&gt; Type=&lt;/span&gt;&lt;span class="attrv"&gt;"Int32"&lt;/span&gt; /&amp;gt;
&lt;b id="26"&gt;26   &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;asp:Parameter&lt;/span&gt;&lt;span class="attr"&gt; Name=&lt;/span&gt;&lt;span class="attrv"&gt;"categoryID"&lt;/span&gt;&lt;span class="attr"&gt; Type=&lt;/span&gt;&lt;span class="attrv"&gt;"Int32"&lt;/span&gt; /&amp;gt;
&lt;b id="27"&gt;27   &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;asp:Parameter&lt;/span&gt;&lt;span class="attr"&gt; Name=&lt;/span&gt;&lt;span class="attrv"&gt;"quantityPerUnit"&lt;/span&gt;&lt;span class="attr"&gt; Type=&lt;/span&gt;&lt;span class="attrv"&gt;"String"&lt;/span&gt; /&amp;gt;
&lt;b id="28"&gt;28   &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;asp:Parameter&lt;/span&gt;&lt;span class="attr"&gt; Name=&lt;/span&gt;&lt;span class="attrv"&gt;"unitPrice"&lt;/span&gt;&lt;span class="attr"&gt; Type=&lt;/span&gt;&lt;span class="attrv"&gt;"Decimal"&lt;/span&gt; /&amp;gt;
&lt;b id="29"&gt;29   &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;asp:Parameter&lt;/span&gt;&lt;span class="attr"&gt; Name=&lt;/span&gt;&lt;span class="attrv"&gt;"unitsInStock"&lt;/span&gt;&lt;span class="attr"&gt; Type=&lt;/span&gt;&lt;span class="attrv"&gt;"Int16"&lt;/span&gt; /&amp;gt;
&lt;b id="30"&gt;30   &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;asp:Parameter&lt;/span&gt;&lt;span class="attr"&gt; Name=&lt;/span&gt;&lt;span class="attrv"&gt;"unitsOnOrder"&lt;/span&gt;&lt;span class="attr"&gt; Type=&lt;/span&gt;&lt;span class="attrv"&gt;"Int16"&lt;/span&gt; /&amp;gt;
&lt;b id="31"&gt;31   &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;asp:Parameter&lt;/span&gt;&lt;span class="attr"&gt; Name=&lt;/span&gt;&lt;span class="attrv"&gt;"reorderLevel"&lt;/span&gt;&lt;span class="attr"&gt; Type=&lt;/span&gt;&lt;span class="attrv"&gt;"Int16"&lt;/span&gt; /&amp;gt;
&lt;b id="32"&gt;32   &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;asp:Parameter&lt;/span&gt;&lt;span class="attr"&gt; Name=&lt;/span&gt;&lt;span class="attrv"&gt;"discontinued"&lt;/span&gt;&lt;span class="attr"&gt; Type=&lt;/span&gt;&lt;span class="attrv"&gt;"Boolean"&lt;/span&gt; /&amp;gt;
&lt;b id="33"&gt;33   &lt;/b&gt;            &amp;lt;/&lt;span class="tag"&gt;InsertParameters&lt;/span&gt;&amp;gt;
&lt;b id="34"&gt;34   &lt;/b&gt;        &amp;lt;/&lt;span class="tag"&gt;asp:ObjectDataSource&lt;/span&gt;&amp;gt;
&lt;b id="35"&gt;35   &lt;/b&gt;    &amp;lt;&lt;span class="tag"&gt;h3&lt;/span&gt;&amp;gt;Editing, Inserting, and Deleting Data from a FormView&amp;lt;/&lt;span class="tag"&gt;h3&lt;/span&gt;&amp;gt;
&lt;b id="36"&gt;36   &lt;/b&gt;    &amp;lt;&lt;span class="tag"&gt;p&lt;/span&gt;&amp;gt;
&lt;b id="37"&gt;37   &lt;/b&gt;        &amp;lt;&lt;span class="tag"&gt;asp:FormView&lt;/span&gt;&lt;span class="attr"&gt; ID=&lt;/span&gt;&lt;span class="attrv"&gt;"FormView1"&lt;/span&gt;&lt;span class="attr"&gt; runat=&lt;/span&gt;&lt;span class="attrv"&gt;"server"&lt;/span&gt;&lt;span class="attr"&gt; DataKeyNames=&lt;/span&gt;&lt;span class="attrv"&gt;"ProductID"&lt;/span&gt;&lt;span class="attr"&gt; DataSourceID=&lt;/span&gt;&lt;span class="attrv"&gt;"ObjectDataSource1"&lt;/span&gt;&lt;span class="attr"&gt; AllowPaging=&lt;/span&gt;&lt;span class="attrv"&gt;"True"&lt;/span&gt;&lt;span class="attr"&gt; EnableViewState=&lt;/span&gt;&lt;span class="attrv"&gt;"False"&lt;/span&gt;&amp;gt;
&lt;b id="38"&gt;38   &lt;/b&gt;            &amp;lt;&lt;span class="tag"&gt;EditItemTemplate&lt;/span&gt;&amp;gt;
&lt;b id="39"&gt;39   &lt;/b&gt;                ProductID:
&lt;b id="40"&gt;40   &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;asp:Label&lt;/span&gt;&lt;span class="attr"&gt; ID=&lt;/span&gt;&lt;span class="attrv"&gt;"ProductIDLabel1"&lt;/span&gt;&lt;span class="attr"&gt; runat=&lt;/span&gt;&lt;span class="attrv"&gt;"server"&lt;/span&gt;&lt;span class="attr"&gt; Text=&lt;/span&gt;&lt;span class="attrv"&gt;'&lt;span class="dir"&gt;&amp;lt;%#&lt;/span&gt; Eval("ProductID") &lt;span class="dir"&gt;%&amp;gt;&lt;/span&gt;'&lt;/span&gt;&amp;gt;&amp;lt;/&lt;span class="tag"&gt;asp:Label&lt;/span&gt;&amp;gt;&amp;lt;&lt;span class="tag"&gt;br&lt;/span&gt; /&amp;gt;
&lt;b id="41"&gt;41   &lt;/b&gt;                ProductName:
&lt;b id="42"&gt;42   &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;asp:TextBox&lt;/span&gt;&lt;span class="attr"&gt; ID=&lt;/span&gt;&lt;span class="attrv"&gt;"ProductNameTextBox"&lt;/span&gt;&lt;span class="attr"&gt; runat=&lt;/span&gt;&lt;span class="attrv"&gt;"server"&lt;/span&gt;&lt;span class="attr"&gt; Text=&lt;/span&gt;&lt;span class="attrv"&gt;'&lt;span class="dir"&gt;&amp;lt;%#&lt;/span&gt; Bind("ProductName") &lt;span class="dir"&gt;%&amp;gt;&lt;/span&gt;'&lt;/span&gt;&amp;gt;
&lt;b id="43"&gt;43   &lt;/b&gt;                &amp;lt;/&lt;span class="tag"&gt;asp:TextBox&lt;/span&gt;&amp;gt;&amp;lt;&lt;span class="tag"&gt;br&lt;/span&gt; /&amp;gt;
&lt;b id="44"&gt;44   &lt;/b&gt;                SupplierID:
&lt;b id="45"&gt;45   &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;asp:TextBox&lt;/span&gt;&lt;span class="attr"&gt; ID=&lt;/span&gt;&lt;span class="attrv"&gt;"SupplierIDTextBox"&lt;/span&gt;&lt;span class="attr"&gt; runat=&lt;/span&gt;&lt;span class="attrv"&gt;"server"&lt;/span&gt;&lt;span class="attr"&gt; Text=&lt;/span&gt;&lt;span class="attrv"&gt;'&lt;span class="dir"&gt;&amp;lt;%#&lt;/span&gt; Bind("SupplierID") &lt;span class="dir"&gt;%&amp;gt;&lt;/span&gt;'&lt;/span&gt;&amp;gt;
&lt;b id="46"&gt;46   &lt;/b&gt;                &amp;lt;/&lt;span class="tag"&gt;asp:TextBox&lt;/span&gt;&amp;gt;&amp;lt;&lt;span class="tag"&gt;br&lt;/span&gt; /&amp;gt;
&lt;b id="47"&gt;47   &lt;/b&gt;                CategoryID:
&lt;b id="48"&gt;48   &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;asp:TextBox&lt;/span&gt;&lt;span class="attr"&gt; ID=&lt;/span&gt;&lt;span class="attrv"&gt;"CategoryIDTextBox"&lt;/span&gt;&lt;span class="attr"&gt; runat=&lt;/span&gt;&lt;span class="attrv"&gt;"server"&lt;/span&gt;&lt;span class="attr"&gt; Text=&lt;/span&gt;&lt;span class="attrv"&gt;'&lt;span class="dir"&gt;&amp;lt;%#&lt;/span&gt; Bind("CategoryID") &lt;span class="dir"&gt;%&amp;gt;&lt;/span&gt;'&lt;/span&gt;&amp;gt;
&lt;b id="49"&gt;49   &lt;/b&gt;                &amp;lt;/&lt;span class="tag"&gt;asp:TextBox&lt;/span&gt;&amp;gt;&amp;lt;&lt;span class="tag"&gt;br&lt;/span&gt; /&amp;gt;
&lt;b id="50"&gt;50   &lt;/b&gt;                QuantityPerUnit:
&lt;b id="51"&gt;51   &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;asp:TextBox&lt;/span&gt;&lt;span class="attr"&gt; ID=&lt;/span&gt;&lt;span class="attrv"&gt;"QuantityPerUnitTextBox"&lt;/span&gt;&lt;span class="attr"&gt; runat=&lt;/span&gt;&lt;span class="attrv"&gt;"server"&lt;/span&gt;&lt;span class="attr"&gt; Text=&lt;/span&gt;&lt;span class="attrv"&gt;'&lt;span class="dir"&gt;&amp;lt;%#&lt;/span&gt; Bind("QuantityPerUnit") &lt;span class="dir"&gt;%&amp;gt;&lt;/span&gt;'&lt;/span&gt;&amp;gt;
&lt;b id="52"&gt;52   &lt;/b&gt;                &amp;lt;/&lt;span class="tag"&gt;asp:TextBox&lt;/span&gt;&amp;gt;&amp;lt;&lt;span class="tag"&gt;br&lt;/span&gt; /&amp;gt;
&lt;b id="53"&gt;53   &lt;/b&gt;                UnitPrice:
&lt;b id="54"&gt;54   &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;asp:TextBox&lt;/span&gt;&lt;span class="attr"&gt; ID=&lt;/span&gt;&lt;span class="attrv"&gt;"UnitPriceTextBox"&lt;/span&gt;&lt;span class="attr"&gt; runat=&lt;/span&gt;&lt;span class="attrv"&gt;"server"&lt;/span&gt;&lt;span class="attr"&gt; Text=&lt;/span&gt;&lt;span class="attrv"&gt;'&lt;span class="dir"&gt;&amp;lt;%#&lt;/span&gt; Bind("UnitPrice") &lt;span class="dir"&gt;%&amp;gt;&lt;/span&gt;'&lt;/span&gt;&amp;gt;
&lt;b id="55"&gt;55   &lt;/b&gt;                &amp;lt;/&lt;span class="tag"&gt;asp:TextBox&lt;/span&gt;&amp;gt;&amp;lt;&lt;span class="tag"&gt;br&lt;/span&gt; /&amp;gt;
&lt;b id="56"&gt;56   &lt;/b&gt;                UnitsInStock:
&lt;b id="57"&gt;57   &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;asp:TextBox&lt;/span&gt;&lt;span class="attr"&gt; ID=&lt;/span&gt;&lt;span class="attrv"&gt;"UnitsInStockTextBox"&lt;/span&gt;&lt;span class="attr"&gt; runat=&lt;/span&gt;&lt;span class="attrv"&gt;"server"&lt;/span&gt;&lt;span class="attr"&gt; Text=&lt;/span&gt;&lt;span class="attrv"&gt;'&lt;span class="dir"&gt;&amp;lt;%#&lt;/span&gt; Bind("UnitsInStock") &lt;span class="dir"&gt;%&amp;gt;&lt;/span&gt;'&lt;/span&gt;&amp;gt;
&lt;b id="58"&gt;58   &lt;/b&gt;                &amp;lt;/&lt;span class="tag"&gt;asp:TextBox&lt;/span&gt;&amp;gt;&amp;lt;&lt;span class="tag"&gt;br&lt;/span&gt; /&amp;gt;
&lt;b id="59"&gt;59   &lt;/b&gt;                UnitsOnOrder:
&lt;b id="60"&gt;60   &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;asp:TextBox&lt;/span&gt;&lt;span class="attr"&gt; ID=&lt;/span&gt;&lt;span class="attrv"&gt;"UnitsOnOrderTextBox"&lt;/span&gt;&lt;span class="attr"&gt; runat=&lt;/span&gt;&lt;span class="attrv"&gt;"server"&lt;/span&gt;&lt;span class="attr"&gt; Text=&lt;/span&gt;&lt;span class="attrv"&gt;'&lt;span class="dir"&gt;&amp;lt;%#&lt;/span&gt; Bind("UnitsOnOrder") &lt;span class="dir"&gt;%&amp;gt;&lt;/span&gt;'&lt;/span&gt;&amp;gt;
&lt;b id="61"&gt;61   &lt;/b&gt;                &amp;lt;/&lt;span class="tag"&gt;asp:TextBox&lt;/span&gt;&amp;gt;&amp;lt;&lt;span class="tag"&gt;br&lt;/span&gt; /&amp;gt;
&lt;b id="62"&gt;62   &lt;/b&gt;                ReorderLevel:
&lt;b id="63"&gt;63   &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;asp:TextBox&lt;/span&gt;&lt;span class="attr"&gt; ID=&lt;/span&gt;&lt;span class="attrv"&gt;"ReorderLevelTextBox"&lt;/span&gt;&lt;span class="attr"&gt; runat=&lt;/span&gt;&lt;span class="attrv"&gt;"server"&lt;/span&gt;&lt;span class="attr"&gt; Text=&lt;/span&gt;&lt;span class="attrv"&gt;'&lt;span class="dir"&gt;&amp;lt;%#&lt;/span&gt; Bind("ReorderLevel") &lt;span class="dir"&gt;%&amp;gt;&lt;/span&gt;'&lt;/span&gt;&amp;gt;
&lt;b id="64"&gt;64   &lt;/b&gt;                &amp;lt;/&lt;span class="tag"&gt;asp:TextBox&lt;/span&gt;&amp;gt;&amp;lt;&lt;span class="tag"&gt;br&lt;/span&gt; /&amp;gt;
&lt;b id="65"&gt;65   &lt;/b&gt;                Discontinued:
&lt;b id="66"&gt;66   &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;asp:CheckBox&lt;/span&gt;&lt;span class="attr"&gt; ID=&lt;/span&gt;&lt;span class="attrv"&gt;"DiscontinuedCheckBox"&lt;/span&gt;&lt;span class="attr"&gt; runat=&lt;/span&gt;&lt;span class="attrv"&gt;"server"&lt;/span&gt;&lt;span class="attr"&gt; Checked=&lt;/span&gt;&lt;span class="attrv"&gt;'&lt;span class="dir"&gt;&amp;lt;%#&lt;/span&gt; Bind("Discontinued") &lt;span class="dir"&gt;%&amp;gt;&lt;/span&gt;'&lt;/span&gt; /&amp;gt;
&lt;b id="67"&gt;67   &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;br&lt;/span&gt; /&amp;gt;
&lt;b id="68"&gt;68   &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;asp:LinkButton&lt;/span&gt;&lt;span class="attr"&gt; ID=&lt;/span&gt;&lt;span class="attrv"&gt;"UpdateButton"&lt;/span&gt;&lt;span class="attr"&gt; runat=&lt;/span&gt;&lt;span class="attrv"&gt;"server"&lt;/span&gt;&lt;span class="attr"&gt; CausesValidation=&lt;/span&gt;&lt;span class="attrv"&gt;"True"&lt;/span&gt;&lt;span class="attr"&gt; CommandName=&lt;/span&gt;&lt;span class="attrv"&gt;"Update"&lt;/span&gt;
&lt;b id="69"&gt;69   &lt;/b&gt;&lt;span class="attr"&gt;                    Text=&lt;/span&gt;&lt;span class="attrv"&gt;"Update"&lt;/span&gt;&amp;gt;
&lt;b id="70"&gt;70   &lt;/b&gt;                &amp;lt;/&lt;span class="tag"&gt;asp:LinkButton&lt;/span&gt;&amp;gt;
&lt;b id="71"&gt;71   &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;asp:LinkButton&lt;/span&gt;&lt;span class="attr"&gt; ID=&lt;/span&gt;&lt;span class="attrv"&gt;"UpdateCancelButton"&lt;/span&gt;&lt;span class="attr"&gt; runat=&lt;/span&gt;&lt;span class="attrv"&gt;"server"&lt;/span&gt;&lt;span class="attr"&gt; CausesValidation=&lt;/span&gt;&lt;span class="attrv"&gt;"False"&lt;/span&gt;&lt;span class="attr"&gt; CommandName=&lt;/span&gt;&lt;span class="attrv"&gt;"Cancel"&lt;/span&gt;
&lt;b id="72"&gt;72   &lt;/b&gt;&lt;span class="attr"&gt;                    Text=&lt;/span&gt;&lt;span class="attrv"&gt;"Cancel"&lt;/span&gt;&amp;gt;
&lt;b id="73"&gt;73   &lt;/b&gt;                &amp;lt;/&lt;span class="tag"&gt;asp:LinkButton&lt;/span&gt;&amp;gt;
&lt;b id="74"&gt;74   &lt;/b&gt;            &amp;lt;/&lt;span class="tag"&gt;EditItemTemplate&lt;/span&gt;&amp;gt;
&lt;b id="75"&gt;75   &lt;/b&gt;            &amp;lt;&lt;span class="tag"&gt;InsertItemTemplate&lt;/span&gt;&amp;gt;
&lt;b id="76"&gt;76   &lt;/b&gt;                ProductName:
&lt;b id="77"&gt;77   &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;asp:TextBox&lt;/span&gt;&lt;span class="attr"&gt; ID=&lt;/span&gt;&lt;span class="attrv"&gt;"ProductNameTextBox"&lt;/span&gt;&lt;span class="attr"&gt; runat=&lt;/span&gt;&lt;span class="attrv"&gt;"server"&lt;/span&gt;&lt;span class="attr"&gt; Text=&lt;/span&gt;&lt;span class="attrv"&gt;'&lt;span class="dir"&gt;&amp;lt;%#&lt;/span&gt; Bind("ProductName") &lt;span class="dir"&gt;%&amp;gt;&lt;/span&gt;'&lt;/span&gt;&amp;gt;
&lt;b id="78"&gt;78   &lt;/b&gt;                &amp;lt;/&lt;span class="tag"&gt;asp:TextBox&lt;/span&gt;&amp;gt;&amp;lt;&lt;span class="tag"&gt;br&lt;/span&gt; /&amp;gt;
&lt;b id="79"&gt;79   &lt;/b&gt;                SupplierID:
&lt;b id="80"&gt;80   &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;asp:TextBox&lt;/span&gt;&lt;span class="attr"&gt; ID=&lt;/span&gt;&lt;span class="attrv"&gt;"SupplierIDTextBox"&lt;/span&gt;&lt;span class="attr"&gt; runat=&lt;/span&gt;&lt;span class="attrv"&gt;"server"&lt;/span&gt;&lt;span class="attr"&gt; Text=&lt;/span&gt;&lt;span class="attrv"&gt;'&lt;span class="dir"&gt;&amp;lt;%#&lt;/span&gt; Bind("SupplierID") &lt;span class="dir"&gt;%&amp;gt;&lt;/span&gt;'&lt;/span&gt;&amp;gt;
&lt;b id="81"&gt;81   &lt;/b&gt;                &amp;lt;/&lt;span class="tag"&gt;asp:TextBox&lt;/span&gt;&amp;gt;&amp;lt;&lt;span class="tag"&gt;br&lt;/span&gt; /&amp;gt;
&lt;b id="82"&gt;82   &lt;/b&gt;                CategoryID:
&lt;b id="83"&gt;83   &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;asp:TextBox&lt;/span&gt;&lt;span class="attr"&gt; ID=&lt;/span&gt;&lt;span class="attrv"&gt;"CategoryIDTextBox"&lt;/span&gt;&lt;span class="attr"&gt; runat=&lt;/span&gt;&lt;span class="attrv"&gt;"server"&lt;/span&gt;&lt;span class="attr"&gt; Text=&lt;/span&gt;&lt;span class="attrv"&gt;'&lt;span class="dir"&gt;&amp;lt;%#&lt;/span&gt; Bind("CategoryID") &lt;span class="dir"&gt;%&amp;gt;&lt;/span&gt;'&lt;/span&gt;&amp;gt;
&lt;b id="84"&gt;84   &lt;/b&gt;                &amp;lt;/&lt;span class="tag"&gt;asp:TextBox&lt;/span&gt;&amp;gt;&amp;lt;&lt;span class="tag"&gt;br&lt;/span&gt; /&amp;gt;
&lt;b id="85"&gt;85   &lt;/b&gt;                QuantityPerUnit:
&lt;b id="86"&gt;86   &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;asp:TextBox&lt;/span&gt;&lt;span class="attr"&gt; ID=&lt;/span&gt;&lt;span class="attrv"&gt;"QuantityPerUnitTextBox"&lt;/span&gt;&lt;span class="attr"&gt; runat=&lt;/span&gt;&lt;span class="attrv"&gt;"server"&lt;/span&gt;&lt;span class="attr"&gt; Text=&lt;/span&gt;&lt;span class="attrv"&gt;'&lt;span class="dir"&gt;&amp;lt;%#&lt;/span&gt; Bind("QuantityPerUnit") &lt;span class="dir"&gt;%&amp;gt;&lt;/span&gt;'&lt;/span&gt;&amp;gt;
&lt;b id="87"&gt;87   &lt;/b&gt;                &amp;lt;/&lt;span class="tag"&gt;asp:TextBox&lt;/span&gt;&amp;gt;&amp;lt;&lt;span class="tag"&gt;br&lt;/span&gt; /&amp;gt;
&lt;b id="88"&gt;88   &lt;/b&gt;                UnitPrice:
&lt;b id="89"&gt;89   &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;asp:TextBox&lt;/span&gt;&lt;span class="attr"&gt; ID=&lt;/span&gt;&lt;span class="attrv"&gt;"UnitPriceTextBox"&lt;/span&gt;&lt;span class="attr"&gt; runat=&lt;/span&gt;&lt;span class="attrv"&gt;"server"&lt;/span&gt;&lt;span class="attr"&gt; Text=&lt;/span&gt;&lt;span class="attrv"&gt;'&lt;span class="dir"&gt;&amp;lt;%#&lt;/span&gt; Bind("UnitPrice") &lt;span class="dir"&gt;%&amp;gt;&lt;/span&gt;'&lt;/span&gt;&amp;gt;
&lt;b id="90"&gt;90   &lt;/b&gt;                &amp;lt;/&lt;span class="tag"&gt;asp:TextBox&lt;/span&gt;&amp;gt;&amp;lt;&lt;span class="tag"&gt;br&lt;/span&gt; /&amp;gt;
&lt;b id="91"&gt;91   &lt;/b&gt;                UnitsInStock:
&lt;b id="92"&gt;92   &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;asp:TextBox&lt;/span&gt;&lt;span class="attr"&gt; ID=&lt;/span&gt;&lt;span class="attrv"&gt;"UnitsInStockTextBox"&lt;/span&gt;&lt;span class="attr"&gt; runat=&lt;/span&gt;&lt;span class="attrv"&gt;"server"&lt;/span&gt;&lt;span class="attr"&gt; Text=&lt;/span&gt;&lt;span class="attrv"&gt;'&lt;span class="dir"&gt;&amp;lt;%#&lt;/span&gt; Bind("UnitsInStock") &lt;span class="dir"&gt;%&amp;gt;&lt;/span&gt;'&lt;/span&gt;&amp;gt;
&lt;b id="93"&gt;93   &lt;/b&gt;                &amp;lt;/&lt;span class="tag"&gt;asp:TextBox&lt;/span&gt;&amp;gt;&amp;lt;&lt;span class="tag"&gt;br&lt;/span&gt; /&amp;gt;
&lt;b id="94"&gt;94   &lt;/b&gt;                UnitsOnOrder:
&lt;b id="95"&gt;95   &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;asp:TextBox&lt;/span&gt;&lt;span class="attr"&gt; ID=&lt;/span&gt;&lt;span class="attrv"&gt;"UnitsOnOrderTextBox"&lt;/span&gt;&lt;span class="attr"&gt; runat=&lt;/span&gt;&lt;span class="attrv"&gt;"server"&lt;/span&gt;&lt;span class="attr"&gt; Text=&lt;/span&gt;&lt;span class="attrv"&gt;'&lt;span class="dir"&gt;&amp;lt;%#&lt;/span&gt; Bind("UnitsOnOrder") &lt;span class="dir"&gt;%&amp;gt;&lt;/span&gt;'&lt;/span&gt;&amp;gt;
&lt;b id="96"&gt;96   &lt;/b&gt;                &amp;lt;/&lt;span class="tag"&gt;asp:TextBox&lt;/span&gt;&amp;gt;&amp;lt;&lt;span class="tag"&gt;br&lt;/span&gt; /&amp;gt;
&lt;b id="97"&gt;97   &lt;/b&gt;                ReorderLevel:
&lt;b id="98"&gt;98   &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;asp:TextBox&lt;/span&gt;&lt;span class="attr"&gt; ID=&lt;/span&gt;&lt;span class="attrv"&gt;"ReorderLevelTextBox"&lt;/span&gt;&lt;span class="attr"&gt; runat=&lt;/span&gt;&lt;span class="attrv"&gt;"server"&lt;/span&gt;&lt;span class="attr"&gt; Text=&lt;/span&gt;&lt;span class="attrv"&gt;'&lt;span class="dir"&gt;&amp;lt;%#&lt;/span&gt; Bind("ReorderLevel") &lt;span class="dir"&gt;%&amp;gt;&lt;/span&gt;'&lt;/span&gt;&amp;gt;
&lt;b id="99"&gt;99   &lt;/b&gt;                &amp;lt;/&lt;span class="tag"&gt;asp:TextBox&lt;/span&gt;&amp;gt;&amp;lt;&lt;span class="tag"&gt;br&lt;/span&gt; /&amp;gt;
&lt;b id="100"&gt;100  &lt;/b&gt;                Discontinued:
&lt;b id="101"&gt;101  &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;asp:CheckBox&lt;/span&gt;&lt;span class="attr"&gt; ID=&lt;/span&gt;&lt;span class="attrv"&gt;"DiscontinuedCheckBox"&lt;/span&gt;&lt;span class="attr"&gt; runat=&lt;/span&gt;&lt;span class="attrv"&gt;"server"&lt;/span&gt;&lt;span class="attr"&gt; Checked=&lt;/span&gt;&lt;span class="attrv"&gt;'&lt;span class="dir"&gt;&amp;lt;%#&lt;/span&gt; Bind("Discontinued") &lt;span class="dir"&gt;%&amp;gt;&lt;/span&gt;'&lt;/span&gt; /&amp;gt;&amp;lt;&lt;span class="tag"&gt;br&lt;/span&gt; /&amp;gt;
&lt;b id="102"&gt;102  &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;asp:LinkButton&lt;/span&gt;&lt;span class="attr"&gt; ID=&lt;/span&gt;&lt;span class="attrv"&gt;"InsertButton"&lt;/span&gt;&lt;span class="attr"&gt; runat=&lt;/span&gt;&lt;span class="attrv"&gt;"server"&lt;/span&gt;&lt;span class="attr"&gt; CausesValidation=&lt;/span&gt;&lt;span class="attrv"&gt;"True"&lt;/span&gt;&lt;span class="attr"&gt; CommandName=&lt;/span&gt;&lt;span class="attrv"&gt;"Insert"&lt;/span&gt;
&lt;b id="103"&gt;103  &lt;/b&gt;&lt;span class="attr"&gt;                    Text=&lt;/span&gt;&lt;span class="attrv"&gt;"Insert"&lt;/span&gt;&amp;gt;
&lt;b id="104"&gt;104  &lt;/b&gt;                &amp;lt;/&lt;span class="tag"&gt;asp:LinkButton&lt;/span&gt;&amp;gt;
&lt;b id="105"&gt;105  &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;asp:LinkButton&lt;/span&gt;&lt;span class="attr"&gt; ID=&lt;/span&gt;&lt;span class="attrv"&gt;"InsertCancelButton"&lt;/span&gt;&lt;span class="attr"&gt; runat=&lt;/span&gt;&lt;span class="attrv"&gt;"server"&lt;/span&gt;&lt;span class="attr"&gt; CausesValidation=&lt;/span&gt;&lt;span class="attrv"&gt;"False"&lt;/span&gt;&lt;span class="attr"&gt; CommandName=&lt;/span&gt;&lt;span class="attrv"&gt;"Cancel"&lt;/span&gt;
&lt;b id="106"&gt;106  &lt;/b&gt;&lt;span class="attr"&gt;                    Text=&lt;/span&gt;&lt;span class="attrv"&gt;"Cancel"&lt;/span&gt;&amp;gt;
&lt;b id="107"&gt;107  &lt;/b&gt;                &amp;lt;/&lt;span class="tag"&gt;asp:LinkButton&lt;/span&gt;&amp;gt;
&lt;b id="108"&gt;108  &lt;/b&gt;            &amp;lt;/&lt;span class="tag"&gt;InsertItemTemplate&lt;/span&gt;&amp;gt;
&lt;b id="109"&gt;109  &lt;/b&gt;            &amp;lt;&lt;span class="tag"&gt;ItemTemplate&lt;/span&gt;&amp;gt;
&lt;b id="110"&gt;110  &lt;/b&gt;                ProductID:
&lt;b id="111"&gt;111  &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;asp:Label&lt;/span&gt;&lt;span class="attr"&gt; ID=&lt;/span&gt;&lt;span class="attrv"&gt;"ProductIDLabel"&lt;/span&gt;&lt;span class="attr"&gt; runat=&lt;/span&gt;&lt;span class="attrv"&gt;"server"&lt;/span&gt;&lt;span class="attr"&gt; Text=&lt;/span&gt;&lt;span class="attrv"&gt;'&lt;span class="dir"&gt;&amp;lt;%#&lt;/span&gt; Eval("ProductID") &lt;span class="dir"&gt;%&amp;gt;&lt;/span&gt;'&lt;/span&gt;&amp;gt;&amp;lt;/&lt;span class="tag"&gt;asp:Label&lt;/span&gt;&amp;gt;&amp;lt;&lt;span class="tag"&gt;br&lt;/span&gt; /&amp;gt;
&lt;b id="112"&gt;112  &lt;/b&gt;                ProductName:
&lt;b id="113"&gt;113  &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;asp:Label&lt;/span&gt;&lt;span class="attr"&gt; ID=&lt;/span&gt;&lt;span class="attrv"&gt;"ProductNameLabel"&lt;/span&gt;&lt;span class="attr"&gt; runat=&lt;/span&gt;&lt;span class="attrv"&gt;"server"&lt;/span&gt;&lt;span class="attr"&gt; Text=&lt;/span&gt;&lt;span class="attrv"&gt;'&lt;span class="dir"&gt;&amp;lt;%#&lt;/span&gt; Bind("ProductName") &lt;span class="dir"&gt;%&amp;gt;&lt;/span&gt;'&lt;/span&gt;&amp;gt;
&lt;b id="114"&gt;114  &lt;/b&gt;                &amp;lt;/&lt;span class="tag"&gt;asp:Label&lt;/span&gt;&amp;gt;&amp;lt;&lt;span class="tag"&gt;br&lt;/span&gt; /&amp;gt;
&lt;b id="115"&gt;115  &lt;/b&gt;                SupplierID:
&lt;b id="116"&gt;116  &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;asp:Label&lt;/span&gt;&lt;span class="attr"&gt; ID=&lt;/span&gt;&lt;span class="attrv"&gt;"SupplierIDLabel"&lt;/span&gt;&lt;span class="attr"&gt; runat=&lt;/span&gt;&lt;span class="attrv"&gt;"server"&lt;/span&gt;&lt;span class="attr"&gt; Text=&lt;/span&gt;&lt;span class="attrv"&gt;'&lt;span class="dir"&gt;&amp;lt;%#&lt;/span&gt; Bind("SupplierID") &lt;span class="dir"&gt;%&amp;gt;&lt;/span&gt;'&lt;/span&gt;&amp;gt;
&lt;b id="117"&gt;117  &lt;/b&gt;                &amp;lt;/&lt;span class="tag"&gt;asp:Label&lt;/span&gt;&amp;gt;&amp;lt;&lt;span class="tag"&gt;br&lt;/span&gt; /&amp;gt;
&lt;b id="118"&gt;118  &lt;/b&gt;                CategoryID:
&lt;b id="119"&gt;119  &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;asp:Label&lt;/span&gt;&lt;span class="attr"&gt; ID=&lt;/span&gt;&lt;span class="attrv"&gt;"CategoryIDLabel"&lt;/span&gt;&lt;span class="attr"&gt; runat=&lt;/span&gt;&lt;span class="attrv"&gt;"server"&lt;/span&gt;&lt;span class="attr"&gt; Text=&lt;/span&gt;&lt;span class="attrv"&gt;'&lt;span class="dir"&gt;&amp;lt;%#&lt;/span&gt; Bind("CategoryID") &lt;span class="dir"&gt;%&amp;gt;&lt;/span&gt;'&lt;/span&gt;&amp;gt;
&lt;b id="120"&gt;120  &lt;/b&gt;                &amp;lt;/&lt;span class="tag"&gt;asp:Label&lt;/span&gt;&amp;gt;&amp;lt;&lt;span class="tag"&gt;br&lt;/span&gt; /&amp;gt;
&lt;b id="121"&gt;121  &lt;/b&gt;                QuantityPerUnit:
&lt;b id="122"&gt;122  &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;asp:Label&lt;/span&gt;&lt;span class="attr"&gt; ID=&lt;/span&gt;&lt;span class="attrv"&gt;"QuantityPerUnitLabel"&lt;/span&gt;&lt;span class="attr"&gt; runat=&lt;/span&gt;&lt;span class="attrv"&gt;"server"&lt;/span&gt;&lt;span class="attr"&gt; Text=&lt;/span&gt;&lt;span class="attrv"&gt;'&lt;span class="dir"&gt;&amp;lt;%#&lt;/span&gt; Bind("QuantityPerUnit") &lt;span class="dir"&gt;%&amp;gt;&lt;/span&gt;'&lt;/span&gt;&amp;gt;
&lt;b id="123"&gt;123  &lt;/b&gt;                &amp;lt;/&lt;span class="tag"&gt;asp:Label&lt;/span&gt;&amp;gt;&amp;lt;&lt;span class="tag"&gt;br&lt;/span&gt; /&amp;gt;
&lt;b id="124"&gt;124  &lt;/b&gt;                UnitPrice:
&lt;b id="125"&gt;125  &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;asp:Label&lt;/span&gt;&lt;span class="attr"&gt; ID=&lt;/span&gt;&lt;span class="attrv"&gt;"UnitPriceLabel"&lt;/span&gt;&lt;span class="attr"&gt; runat=&lt;/span&gt;&lt;span class="attrv"&gt;"server"&lt;/span&gt;&lt;span class="attr"&gt; Text=&lt;/span&gt;&lt;span class="attrv"&gt;'&lt;span class="dir"&gt;&amp;lt;%#&lt;/span&gt; Bind("UnitPrice") &lt;span class="dir"&gt;%&amp;gt;&lt;/span&gt;'&lt;/span&gt;&amp;gt;&amp;lt;/&lt;span class="tag"&gt;asp:Label&lt;/span&gt;&amp;gt;&amp;lt;&lt;span class="tag"&gt;br&lt;/span&gt; /&amp;gt;
&lt;b id="126"&gt;126  &lt;/b&gt;                UnitsInStock:
&lt;b id="127"&gt;127  &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;asp:Label&lt;/span&gt;&lt;span class="attr"&gt; ID=&lt;/span&gt;&lt;span class="attrv"&gt;"UnitsInStockLabel"&lt;/span&gt;&lt;span class="attr"&gt; runat=&lt;/span&gt;&lt;span class="attrv"&gt;"server"&lt;/span&gt;&lt;span class="attr"&gt; Text=&lt;/span&gt;&lt;span class="attrv"&gt;'&lt;span class="dir"&gt;&amp;lt;%#&lt;/span&gt; Bind("UnitsInStock") &lt;span class="dir"&gt;%&amp;gt;&lt;/span&gt;'&lt;/span&gt;&amp;gt;
&lt;b id="128"&gt;128  &lt;/b&gt;                &amp;lt;/&lt;span class="tag"&gt;asp:Label&lt;/span&gt;&amp;gt;&amp;lt;&lt;span class="tag"&gt;br&lt;/span&gt; /&amp;gt;
&lt;b id="129"&gt;129  &lt;/b&gt;                UnitsOnOrder:
&lt;b id="130"&gt;130  &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;asp:Label&lt;/span&gt;&lt;span class="attr"&gt; ID=&lt;/span&gt;&lt;span class="attrv"&gt;"UnitsOnOrderLabel"&lt;/span&gt;&lt;span class="attr"&gt; runat=&lt;/span&gt;&lt;span class="attrv"&gt;"server"&lt;/span&gt;&lt;span class="attr"&gt; Text=&lt;/span&gt;&lt;span class="attrv"&gt;'&lt;span class="dir"&gt;&amp;lt;%#&lt;/span&gt; Bind("UnitsOnOrder") &lt;span class="dir"&gt;%&amp;gt;&lt;/span&gt;'&lt;/span&gt;&amp;gt;
&lt;b id="131"&gt;131  &lt;/b&gt;                &amp;lt;/&lt;span class="tag"&gt;asp:Label&lt;/span&gt;&amp;gt;&amp;lt;&lt;span class="tag"&gt;br&lt;/span&gt; /&amp;gt;
&lt;b id="132"&gt;132  &lt;/b&gt;                ReorderLevel:
&lt;b id="133"&gt;133  &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;asp:Label&lt;/span&gt;&lt;span class="attr"&gt; ID=&lt;/span&gt;&lt;span class="attrv"&gt;"ReorderLevelLabel"&lt;/span&gt;&lt;span class="attr"&gt; runat=&lt;/span&gt;&lt;span class="attrv"&gt;"server"&lt;/span&gt;&lt;span class="attr"&gt; Text=&lt;/span&gt;&lt;span class="attrv"&gt;'&lt;span class="dir"&gt;&amp;lt;%#&lt;/span&gt; Bind("ReorderLevel") &lt;span class="dir"&gt;%&amp;gt;&lt;/span&gt;'&lt;/span&gt;&amp;gt;
&lt;b id="134"&gt;134  &lt;/b&gt;                &amp;lt;/&lt;span class="tag"&gt;asp:Label&lt;/span&gt;&amp;gt;&amp;lt;&lt;span class="tag"&gt;br&lt;/span&gt; /&amp;gt;
&lt;b id="135"&gt;135  &lt;/b&gt;                Discontinued:
&lt;b id="136"&gt;136  &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;asp:CheckBox&lt;/span&gt;&lt;span class="attr"&gt; ID=&lt;/span&gt;&lt;span class="attrv"&gt;"DiscontinuedCheckBox"&lt;/span&gt;&lt;span class="attr"&gt; runat=&lt;/span&gt;&lt;span class="attrv"&gt;"server"&lt;/span&gt;&lt;span class="attr"&gt; Checked=&lt;/span&gt;&lt;span class="attrv"&gt;'&lt;span class="dir"&gt;&amp;lt;%#&lt;/span&gt; Bind("Discontinued") &lt;span class="dir"&gt;%&amp;gt;&lt;/span&gt;'&lt;/span&gt;
&lt;b id="137"&gt;137  &lt;/b&gt;&lt;span class="attr"&gt;                    Enabled=&lt;/span&gt;&lt;span class="attrv"&gt;"false"&lt;/span&gt; /&amp;gt;&amp;lt;&lt;span class="tag"&gt;br&lt;/span&gt; /&amp;gt;
&lt;b id="138"&gt;138  &lt;/b&gt;                CategoryName:
&lt;b id="139"&gt;139  &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;asp:Label&lt;/span&gt;&lt;span class="attr"&gt; ID=&lt;/span&gt;&lt;span class="attrv"&gt;"CategoryNameLabel"&lt;/span&gt;&lt;span class="attr"&gt; runat=&lt;/span&gt;&lt;span class="attrv"&gt;"server"&lt;/span&gt;&lt;span class="attr"&gt; Text=&lt;/span&gt;&lt;span class="attrv"&gt;'&lt;span class="dir"&gt;&amp;lt;%#&lt;/span&gt; Bind("CategoryName") &lt;span class="dir"&gt;%&amp;gt;&lt;/span&gt;'&lt;/span&gt;&amp;gt;
&lt;b id="140"&gt;140  &lt;/b&gt;                &amp;lt;/&lt;span class="tag"&gt;asp:Label&lt;/span&gt;&amp;gt;&amp;lt;&lt;span class="tag"&gt;br&lt;/span&gt; /&amp;gt;
&lt;b id="141"&gt;141  &lt;/b&gt;                SupplierName:
&lt;b id="142"&gt;142  &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;asp:Label&lt;/span&gt;&lt;span class="attr"&gt; ID=&lt;/span&gt;&lt;span class="attrv"&gt;"SupplierNameLabel"&lt;/span&gt;&lt;span class="attr"&gt; runat=&lt;/span&gt;&lt;span class="attrv"&gt;"server"&lt;/span&gt;&lt;span class="attr"&gt; Text=&lt;/span&gt;&lt;span class="attrv"&gt;'&lt;span class="dir"&gt;&amp;lt;%#&lt;/span&gt; Bind("SupplierName") &lt;span class="dir"&gt;%&amp;gt;&lt;/span&gt;'&lt;/span&gt;&amp;gt;
&lt;b id="143"&gt;143  &lt;/b&gt;                &amp;lt;/&lt;span class="tag"&gt;asp:Label&lt;/span&gt;&amp;gt;&amp;lt;&lt;span class="tag"&gt;br&lt;/span&gt; /&amp;gt;
&lt;b id="144"&gt;144  &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;asp:LinkButton&lt;/span&gt;&lt;span class="attr"&gt; ID=&lt;/span&gt;&lt;span class="attrv"&gt;"EditButton"&lt;/span&gt;&lt;span class="attr"&gt; runat=&lt;/span&gt;&lt;span class="attrv"&gt;"server"&lt;/span&gt;&lt;span class="attr"&gt; CausesValidation=&lt;/span&gt;&lt;span class="attrv"&gt;"False"&lt;/span&gt;&lt;span class="attr"&gt; CommandName=&lt;/span&gt;&lt;span class="attrv"&gt;"Edit"&lt;/span&gt;
&lt;b id="145"&gt;145  &lt;/b&gt;&lt;span class="attr"&gt;                    Text=&lt;/span&gt;&lt;span class="attrv"&gt;"Edit"&lt;/span&gt;&amp;gt;
&lt;b id="146"&gt;146  &lt;/b&gt;                &amp;lt;/&lt;span class="tag"&gt;asp:LinkButton&lt;/span&gt;&amp;gt;
&lt;b id="147"&gt;147  &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;asp:LinkButton&lt;/span&gt;&lt;span class="attr"&gt; ID=&lt;/span&gt;&lt;span class="attrv"&gt;"DeleteButton"&lt;/span&gt;&lt;span class="attr"&gt; runat=&lt;/span&gt;&lt;span class="attrv"&gt;"server"&lt;/span&gt;&lt;span class="attr"&gt; CausesValidation=&lt;/span&gt;&lt;span class="attrv"&gt;"False"&lt;/span&gt;&lt;span class="attr"&gt; CommandName=&lt;/span&gt;&lt;span class="attrv"&gt;"Delete"&lt;/span&gt;
&lt;b id="148"&gt;148  &lt;/b&gt;&lt;span class="attr"&gt;                    Text=&lt;/span&gt;&lt;span class="attrv"&gt;"Delete"&lt;/span&gt;&amp;gt;
&lt;b id="149"&gt;149  &lt;/b&gt;                &amp;lt;/&lt;span class="tag"&gt;asp:LinkButton&lt;/span&gt;&amp;gt;
&lt;b id="150"&gt;150  &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;asp:LinkButton&lt;/span&gt;&lt;span class="attr"&gt; ID=&lt;/span&gt;&lt;span class="attrv"&gt;"NewButton"&lt;/span&gt;&lt;span class="attr"&gt; runat=&lt;/span&gt;&lt;span class="attrv"&gt;"server"&lt;/span&gt;&lt;span class="attr"&gt; CausesValidation=&lt;/span&gt;&lt;span class="attrv"&gt;"False"&lt;/span&gt;&lt;span class="attr"&gt; CommandName=&lt;/span&gt;&lt;span class="attrv"&gt;"New"&lt;/span&gt;
&lt;b id="151"&gt;151  &lt;/b&gt;&lt;span class="attr"&gt;                    Text=&lt;/span&gt;&lt;span class="attrv"&gt;"New"&lt;/span&gt;&amp;gt;
&lt;b id="152"&gt;152  &lt;/b&gt;                &amp;lt;/&lt;span class="tag"&gt;asp:LinkButton&lt;/span&gt;&amp;gt;
&lt;b id="153"&gt;153  &lt;/b&gt;            &amp;lt;/&lt;span class="tag"&gt;ItemTemplate&lt;/span&gt;&amp;gt;
&lt;b id="154"&gt;154  &lt;/b&gt;        &amp;lt;/&lt;span class="tag"&gt;asp:FormView&lt;/span&gt;&amp;gt;
&lt;b id="155"&gt;155  &lt;/b&gt;        &amp;nbsp;&amp;lt;/&lt;span class="tag"&gt;p&lt;/span&gt;&amp;gt;
&lt;b id="156"&gt;156  &lt;/b&gt;    &amp;lt;&lt;span class="tag"&gt;h3&lt;/span&gt;&amp;gt;
&lt;b id="157"&gt;157  &lt;/b&gt;        Editing, Inserting, and Deleting Data from a DetailsView&amp;lt;/&lt;span class="tag"&gt;h3&lt;/span&gt;&amp;gt;
&lt;b id="158"&gt;158  &lt;/b&gt;    &amp;lt;&lt;span class="tag"&gt;p&lt;/span&gt;&amp;gt;
&lt;b id="159"&gt;159  &lt;/b&gt;        &amp;lt;&lt;span class="tag"&gt;asp:DetailsView&lt;/span&gt;&lt;span class="attr"&gt; ID=&lt;/span&gt;&lt;span class="attrv"&gt;"DetailsView1"&lt;/span&gt;&lt;span class="attr"&gt; runat=&lt;/span&gt;&lt;span class="attrv"&gt;"server"&lt;/span&gt;&lt;span class="attr"&gt; AutoGenerateRows=&lt;/span&gt;&lt;span class="attrv"&gt;"False"&lt;/span&gt;&lt;span class="attr"&gt; DataKeyNames=&lt;/span&gt;&lt;span class="attrv"&gt;"ProductID"&lt;/span&gt;
&lt;b id="160"&gt;160  &lt;/b&gt;&lt;span class="attr"&gt;            DataSourceID=&lt;/span&gt;&lt;span class="attrv"&gt;"ObjectDataSource1"&lt;/span&gt;&lt;span class="attr"&gt; AllowPaging=&lt;/span&gt;&lt;span class="attrv"&gt;"True"&lt;/span&gt;&lt;span class="attr"&gt; EnableViewState=&lt;/span&gt;&lt;span class="attrv"&gt;"False"&lt;/span&gt;&amp;gt;
&lt;b id="161"&gt;161  &lt;/b&gt;            &amp;lt;&lt;span class="tag"&gt;Fields&lt;/span&gt;&amp;gt;
&lt;b id="162"&gt;162  &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;asp:BoundField&lt;/span&gt;&lt;span class="attr"&gt; DataField=&lt;/span&gt;&lt;span class="attrv"&gt;"ProductID"&lt;/span&gt;&lt;span class="attr"&gt; HeaderText=&lt;/span&gt;&lt;span class="attrv"&gt;"ProductID"&lt;/span&gt;&lt;span class="attr"&gt; InsertVisible=&lt;/span&gt;&lt;span class="attrv"&gt;"False"&lt;/span&gt;
&lt;b id="163"&gt;163  &lt;/b&gt;&lt;span class="attr"&gt;                    ReadOnly=&lt;/span&gt;&lt;span class="attrv"&gt;"True"&lt;/span&gt;&lt;span class="attr"&gt; SortExpression=&lt;/span&gt;&lt;span class="attrv"&gt;"ProductID"&lt;/span&gt; /&amp;gt;
&lt;b id="164"&gt;164  &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;asp:BoundField&lt;/span&gt;&lt;span class="attr"&gt; DataField=&lt;/span&gt;&lt;span class="attrv"&gt;"ProductName"&lt;/span&gt;&lt;span class="attr"&gt; HeaderText=&lt;/span&gt;&lt;span class="attrv"&gt;"ProductName"&lt;/span&gt;&lt;span class="attr"&gt; SortExpression=&lt;/span&gt;&lt;span class="attrv"&gt;"ProductName"&lt;/span&gt; /&amp;gt;
&lt;b id="165"&gt;165  &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;asp:BoundField&lt;/span&gt;&lt;span class="attr"&gt; DataField=&lt;/span&gt;&lt;span class="attrv"&gt;"SupplierID"&lt;/span&gt;&lt;span class="attr"&gt; HeaderText=&lt;/span&gt;&lt;span class="attrv"&gt;"SupplierID"&lt;/span&gt;&lt;span class="attr"&gt; SortExpression=&lt;/span&gt;&lt;span class="attrv"&gt;"SupplierID"&lt;/span&gt; /&amp;gt;
&lt;b id="166"&gt;166  &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;asp:BoundField&lt;/span&gt;&lt;span class="attr"&gt; DataField=&lt;/span&gt;&lt;span class="attrv"&gt;"CategoryID"&lt;/span&gt;&lt;span class="attr"&gt; HeaderText=&lt;/span&gt;&lt;span class="attrv"&gt;"CategoryID"&lt;/span&gt;&lt;span class="attr"&gt; SortExpression=&lt;/span&gt;&lt;span class="attrv"&gt;"CategoryID"&lt;/span&gt; /&amp;gt;
&lt;b id="167"&gt;167  &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;asp:BoundField&lt;/span&gt;&lt;span class="attr"&gt; DataField=&lt;/span&gt;&lt;span class="attrv"&gt;"QuantityPerUnit"&lt;/span&gt;&lt;span class="attr"&gt; HeaderText=&lt;/span&gt;&lt;span class="attrv"&gt;"QuantityPerUnit"&lt;/span&gt;&lt;span class="attr"&gt; SortExpression=&lt;/span&gt;&lt;span class="attrv"&gt;"QuantityPerUnit"&lt;/span&gt; /&amp;gt;
&lt;b id="168"&gt;168  &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;asp:BoundField&lt;/span&gt;&lt;span class="attr"&gt; DataField=&lt;/span&gt;&lt;span class="attrv"&gt;"UnitPrice"&lt;/span&gt;&lt;span class="attr"&gt; HeaderText=&lt;/span&gt;&lt;span class="attrv"&gt;"UnitPrice"&lt;/span&gt;&lt;span class="attr"&gt; SortExpression=&lt;/span&gt;&lt;span class="attrv"&gt;"UnitPrice"&lt;/span&gt; /&amp;gt;
&lt;b id="169"&gt;169  &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;asp:BoundField&lt;/span&gt;&lt;span class="attr"&gt; DataField=&lt;/span&gt;&lt;span class="attrv"&gt;"UnitsInStock"&lt;/span&gt;&lt;span class="attr"&gt; HeaderText=&lt;/span&gt;&lt;span class="attrv"&gt;"UnitsInStock"&lt;/span&gt;&lt;span class="attr"&gt; SortExpression=&lt;/span&gt;&lt;span class="attrv"&gt;"UnitsInStock"&lt;/span&gt; /&amp;gt;
&lt;b id="170"&gt;170  &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;asp:BoundField&lt;/span&gt;&lt;span class="attr"&gt; DataField=&lt;/span&gt;&lt;span class="attrv"&gt;"UnitsOnOrder"&lt;/span&gt;&lt;span class="attr"&gt; HeaderText=&lt;/span&gt;&lt;span class="attrv"&gt;"UnitsOnOrder"&lt;/span&gt;&lt;span class="attr"&gt; SortExpression=&lt;/span&gt;&lt;span class="attrv"&gt;"UnitsOnOrder"&lt;/span&gt; /&amp;gt;
&lt;b id="171"&gt;171  &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;asp:BoundField&lt;/span&gt;&lt;span class="attr"&gt; DataField=&lt;/span&gt;&lt;span class="attrv"&gt;"ReorderLevel"&lt;/span&gt;&lt;span class="attr"&gt; HeaderText=&lt;/span&gt;&lt;span class="attrv"&gt;"ReorderLevel"&lt;/span&gt;&lt;span class="attr"&gt; SortExpression=&lt;/span&gt;&lt;span class="attrv"&gt;"ReorderLevel"&lt;/span&gt; /&amp;gt;
&lt;b id="172"&gt;172  &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;asp:CheckBoxField&lt;/span&gt;&lt;span class="attr"&gt; DataField=&lt;/span&gt;&lt;span class="attrv"&gt;"Discontinued"&lt;/span&gt;&lt;span class="attr"&gt; HeaderText=&lt;/span&gt;&lt;span class="attrv"&gt;"Discontinued"&lt;/span&gt;&lt;span class="attr"&gt; SortExpression=&lt;/span&gt;&lt;span class="attrv"&gt;"Discontinued"&lt;/span&gt; /&amp;gt;
&lt;b id="173"&gt;173  &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;asp:BoundField&lt;/span&gt;&lt;span class="attr"&gt; DataField=&lt;/span&gt;&lt;span class="attrv"&gt;"CategoryName"&lt;/span&gt;&lt;span class="attr"&gt; HeaderText=&lt;/span&gt;&lt;span class="attrv"&gt;"CategoryName"&lt;/span&gt;&lt;span class="attr"&gt; ReadOnly=&lt;/span&gt;&lt;span class="attrv"&gt;"True"&lt;/span&gt;
&lt;b id="174"&gt;174  &lt;/b&gt;&lt;span class="attr"&gt;                    SortExpression=&lt;/span&gt;&lt;span class="attrv"&gt;"CategoryName"&lt;/span&gt;&lt;span class="attr"&gt; InsertVisible=&lt;/span&gt;&lt;span class="attrv"&gt;"False"&lt;/span&gt; /&amp;gt;
&lt;b id="175"&gt;175  &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;asp:BoundField&lt;/span&gt;&lt;span class="attr"&gt; DataField=&lt;/span&gt;&lt;span class="attrv"&gt;"SupplierName"&lt;/span&gt;&lt;span class="attr"&gt; HeaderText=&lt;/span&gt;&lt;span class="attrv"&gt;"SupplierName"&lt;/span&gt;&lt;span class="attr"&gt; ReadOnly=&lt;/span&gt;&lt;span class="attrv"&gt;"True"&lt;/span&gt;
&lt;b id="176"&gt;176  &lt;/b&gt;&lt;span class="attr"&gt;                    SortExpression=&lt;/span&gt;&lt;span class="attrv"&gt;"SupplierName"&lt;/span&gt;&lt;span class="attr"&gt; InsertVisible=&lt;/span&gt;&lt;span class="attrv"&gt;"False"&lt;/span&gt; /&amp;gt;
&lt;b id="177"&gt;177  &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;asp:CommandField&lt;/span&gt;&lt;span class="attr"&gt; ShowDeleteButton=&lt;/span&gt;&lt;span class="attrv"&gt;"True"&lt;/span&gt;&lt;span class="attr"&gt; ShowEditButton=&lt;/span&gt;&lt;span class="attrv"&gt;"True"&lt;/span&gt;&lt;span class="attr"&gt; ShowInsertButton=&lt;/span&gt;&lt;span class="attrv"&gt;"True"&lt;/span&gt; /&amp;gt;
&lt;b id="178"&gt;178  &lt;/b&gt;            &amp;lt;/&lt;span class="tag"&gt;Fields&lt;/span&gt;&amp;gt;
&lt;b id="179"&gt;179  &lt;/b&gt;        &amp;lt;/&lt;span class="tag"&gt;asp:DetailsView&lt;/span&gt;&amp;gt;
&lt;b id="180"&gt;180  &lt;/b&gt;        &amp;nbsp;&amp;lt;/&lt;span class="tag"&gt;p&lt;/span&gt;&amp;gt;
&lt;b id="181"&gt;181  &lt;/b&gt;    &amp;lt;&lt;span class="tag"&gt;h3&lt;/span&gt;&amp;gt;
&lt;b id="182"&gt;182  &lt;/b&gt;        Editing and Deleting Data from a GridView&amp;lt;/&lt;span class="tag"&gt;h3&lt;/span&gt;&amp;gt;
&lt;b id="183"&gt;183  &lt;/b&gt;    &amp;lt;&lt;span class="tag"&gt;p&lt;/span&gt;&amp;gt;
&lt;b id="184"&gt;184  &lt;/b&gt;        &amp;lt;&lt;span class="tag"&gt;asp:GridView&lt;/span&gt;&lt;span class="attr"&gt; ID=&lt;/span&gt;&lt;span class="attrv"&gt;"GridView1"&lt;/span&gt;&lt;span class="attr"&gt; runat=&lt;/span&gt;&lt;span class="attrv"&gt;"server"&lt;/span&gt;&lt;span class="attr"&gt; AutoGenerateColumns=&lt;/span&gt;&lt;span class="attrv"&gt;"False"&lt;/span&gt;&lt;span class="attr"&gt; DataKeyNames=&lt;/span&gt;&lt;span class="attrv"&gt;"ProductID"&lt;/span&gt;&lt;span class="attr"&gt; DataSourceID=&lt;/span&gt;&lt;span class="attrv"&gt;"ObjectDataSource1"&lt;/span&gt;&lt;span class="attr"&gt; EnableViewState=&lt;/span&gt;&lt;span class="attrv"&gt;"False"&lt;/span&gt;&lt;span class="attr"&gt; OnRowCommand=&lt;/span&gt;&lt;span class="attrv"&gt;"GridView1_RowCommand"&lt;/span&gt;&amp;gt;
&lt;b id="185"&gt;185  &lt;/b&gt;            &amp;lt;&lt;span class="tag"&gt;Columns&lt;/span&gt;&amp;gt;
&lt;b id="186"&gt;186  &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;asp:CommandField&lt;/span&gt;&lt;span class="attr"&gt; ShowDeleteButton=&lt;/span&gt;&lt;span class="attrv"&gt;"True"&lt;/span&gt;&lt;span class="attr"&gt; ShowEditButton=&lt;/span&gt;&lt;span class="attrv"&gt;"True"&lt;/span&gt; /&amp;gt;
&lt;b id="187"&gt;187  &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;asp:BoundField&lt;/span&gt;&lt;span class="attr"&gt; DataField=&lt;/span&gt;&lt;span class="attrv"&gt;"ProductID"&lt;/span&gt;&lt;span class="attr"&gt; HeaderText=&lt;/span&gt;&lt;span class="attrv"&gt;"ProductID"&lt;/span&gt;&lt;span class="attr"&gt; InsertVisible=&lt;/span&gt;&lt;span class="attrv"&gt;"False"&lt;/span&gt;
&lt;b id="188"&gt;188  &lt;/b&gt;&lt;span class="attr"&gt;                    ReadOnly=&lt;/span&gt;&lt;span class="attrv"&gt;"True"&lt;/span&gt;&lt;span class="attr"&gt; SortExpression=&lt;/span&gt;&lt;span class="attrv"&gt;"ProductID"&lt;/span&gt; /&amp;gt;
&lt;b id="189"&gt;189  &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;asp:BoundField&lt;/span&gt;&lt;span class="attr"&gt; DataField=&lt;/span&gt;&lt;span class="attrv"&gt;"ProductName"&lt;/span&gt;&lt;span class="attr"&gt; HeaderText=&lt;/span&gt;&lt;span class="attrv"&gt;"ProductName"&lt;/span&gt;&lt;span class="attr"&gt; SortExpression=&lt;/span&gt;&lt;span class="attrv"&gt;"ProductName"&lt;/span&gt; /&amp;gt;
&lt;b id="190"&gt;190  &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;asp:BoundField&lt;/span&gt;&lt;span class="attr"&gt; DataField=&lt;/span&gt;&lt;span class="attrv"&gt;"SupplierID"&lt;/span&gt;&lt;span class="attr"&gt; HeaderText=&lt;/span&gt;&lt;span class="attrv"&gt;"SupplierID"&lt;/span&gt;&lt;span class="attr"&gt; SortExpression=&lt;/span&gt;&lt;span class="attrv"&gt;"SupplierID"&lt;/span&gt; /&amp;gt;
&lt;b id="191"&gt;191  &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;asp:BoundField&lt;/span&gt;&lt;span class="attr"&gt; DataField=&lt;/span&gt;&lt;span class="attrv"&gt;"CategoryID"&lt;/span&gt;&lt;span class="attr"&gt; HeaderText=&lt;/span&gt;&lt;span class="attrv"&gt;"CategoryID"&lt;/span&gt;&lt;span class="attr"&gt; SortExpression=&lt;/span&gt;&lt;span class="attrv"&gt;"CategoryID"&lt;/span&gt; /&amp;gt;
&lt;b id="192"&gt;192  &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;asp:BoundField&lt;/span&gt;&lt;span class="attr"&gt; DataField=&lt;/span&gt;&lt;span class="attrv"&gt;"QuantityPerUnit"&lt;/span&gt;&lt;span class="attr"&gt; HeaderText=&lt;/span&gt;&lt;span class="attrv"&gt;"QuantityPerUnit"&lt;/span&gt;&lt;span class="attr"&gt; SortExpression=&lt;/span&gt;&lt;span class="attrv"&gt;"QuantityPerUnit"&lt;/span&gt; /&amp;gt;
&lt;b id="193"&gt;193  &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;asp:BoundField&lt;/span&gt;&lt;span class="attr"&gt; DataField=&lt;/span&gt;&lt;span class="attrv"&gt;"UnitPrice"&lt;/span&gt;&lt;span class="attr"&gt; HeaderText=&lt;/span&gt;&lt;span class="attrv"&gt;"UnitPrice"&lt;/span&gt;&lt;span class="attr"&gt; SortExpression=&lt;/span&gt;&lt;span class="attrv"&gt;"UnitPrice"&lt;/span&gt; /&amp;gt;
&lt;b id="194"&gt;194  &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;asp:BoundField&lt;/span&gt;&lt;span class="attr"&gt; DataField=&lt;/span&gt;&lt;span class="attrv"&gt;"UnitsInStock"&lt;/span&gt;&lt;span class="attr"&gt; HeaderText=&lt;/span&gt;&lt;span class="attrv"&gt;"UnitsInStock"&lt;/span&gt;&lt;span class="attr"&gt; SortExpression=&lt;/span&gt;&lt;span class="attrv"&gt;"UnitsInStock"&lt;/span&gt; /&amp;gt;
&lt;b id="195"&gt;195  &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;asp:BoundField&lt;/span&gt;&lt;span class="attr"&gt; DataField=&lt;/span&gt;&lt;span class="attrv"&gt;"UnitsOnOrder"&lt;/span&gt;&lt;span class="attr"&gt; HeaderText=&lt;/span&gt;&lt;span class="attrv"&gt;"UnitsOnOrder"&lt;/span&gt;&lt;span class="attr"&gt; SortExpression=&lt;/span&gt;&lt;span class="attrv"&gt;"UnitsOnOrder"&lt;/span&gt; /&amp;gt;
&lt;b id="196"&gt;196  &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;asp:BoundField&lt;/span&gt;&lt;span class="attr"&gt; DataField=&lt;/span&gt;&lt;span class="attrv"&gt;"ReorderLevel"&lt;/span&gt;&lt;span class="attr"&gt; HeaderText=&lt;/span&gt;&lt;span class="attrv"&gt;"ReorderLevel"&lt;/span&gt;&lt;span class="attr"&gt; SortExpression=&lt;/span&gt;&lt;span class="attrv"&gt;"ReorderLevel"&lt;/span&gt; /&amp;gt;
&lt;b id="197"&gt;197  &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;asp:CheckBoxField&lt;/span&gt;&lt;span class="attr"&gt; DataField=&lt;/span&gt;&lt;span class="attrv"&gt;"Discontinued"&lt;/span&gt;&lt;span class="attr"&gt; HeaderText=&lt;/span&gt;&lt;span class="attrv"&gt;"Discontinued"&lt;/span&gt;&lt;span class="attr"&gt; SortExpression=&lt;/span&gt;&lt;span class="attrv"&gt;"Discontinued"&lt;/span&gt; /&amp;gt;
&lt;b id="198"&gt;198  &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;asp:BoundField&lt;/span&gt;&lt;span class="attr"&gt; DataField=&lt;/span&gt;&lt;span class="attrv"&gt;"CategoryName"&lt;/span&gt;&lt;span class="attr"&gt; HeaderText=&lt;/span&gt;&lt;span class="attrv"&gt;"CategoryName"&lt;/span&gt;&lt;span class="attr"&gt; ReadOnly=&lt;/span&gt;&lt;span class="attrv"&gt;"True"&lt;/span&gt;
&lt;b id="199"&gt;199  &lt;/b&gt;&lt;span class="attr"&gt;                    SortExpression=&lt;/span&gt;&lt;span class="attrv"&gt;"CategoryName"&lt;/span&gt; /&amp;gt;
&lt;b id="200"&gt;200  &lt;/b&gt;                &amp;lt;&lt;span class="tag"&gt;asp:BoundField&lt;/span&gt;&lt;span class="attr"&gt; DataField=&lt;/span&gt;&lt;span class="attrv"&gt;"SupplierName"&lt;/span&gt;&lt;span class="attr"&gt; HeaderText=&lt;/span&gt;&lt;span class="attrv"&gt;"SupplierName"&lt;/span&gt;&lt;span class="attr"&gt; ReadOnly=&lt;/span&gt;&lt;span class="attrv"&gt;"True"&lt;/span&gt;
&lt;b id="201"&gt;201  &lt;/b&gt;&lt;span class="attr"&gt;                    SortExpression=&lt;/span&gt;&lt;span class="attrv"&gt;"SupplierName"&lt;/span&gt; /&amp;gt;
&lt;b id="202"&gt;202  &lt;/b&gt;            &amp;lt;/&lt;span class="tag"&gt;Columns&lt;/span&gt;&amp;gt;
&lt;b id="203"&gt;203  &lt;/b&gt;        &amp;lt;/&lt;span class="tag"&gt;asp:GridView&lt;/span&gt;&amp;gt;
&lt;b id="204"&gt;204  &lt;/b&gt;        &amp;nbsp;&amp;nbsp;&amp;lt;/&lt;span class="tag"&gt;p&lt;/span&gt;&amp;gt;
&lt;b id="205"&gt;205  &lt;/b&gt;&amp;lt;/&lt;span class="tag"&gt;asp:Content&lt;/span&gt;&amp;gt;
&lt;/pre&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;pre class="coloredcode"&gt;&lt;b id="1"&gt;1    &lt;/b&gt;&lt;span class="kwd"&gt;using&lt;/span&gt; System;
&lt;b id="2"&gt;2    &lt;/b&gt;&lt;span class="kwd"&gt;using&lt;/span&gt; System.Data;
&lt;b id="3"&gt;3    &lt;/b&gt;&lt;span class="kwd"&gt;using&lt;/span&gt; System.Configuration;
&lt;b id="4"&gt;4    &lt;/b&gt;&lt;span class="kwd"&gt;using&lt;/span&gt; System.Collections;
&lt;b id="5"&gt;5    &lt;/b&gt;&lt;span class="kwd"&gt;using&lt;/span&gt; System.Web;
&lt;b id="6"&gt;6    &lt;/b&gt;&lt;span class="kwd"&gt;using&lt;/span&gt; System.Web.Security;
&lt;b id="7"&gt;7    &lt;/b&gt;&lt;span class="kwd"&gt;using&lt;/span&gt; System.Web.UI;
&lt;b id="8"&gt;8    &lt;/b&gt;&lt;span class="kwd"&gt;using&lt;/span&gt; System.Web.UI.WebControls;
&lt;b id="9"&gt;9    &lt;/b&gt;&lt;span class="kwd"&gt;using&lt;/span&gt; System.Web.UI.WebControls.WebParts;
&lt;b id="10"&gt;10   &lt;/b&gt;&lt;span class="kwd"&gt;using&lt;/span&gt; System.Web.UI.HtmlControls;
&lt;b id="11"&gt;11   &lt;/b&gt;
&lt;b id="12"&gt;12   &lt;/b&gt;&lt;span class="kwd"&gt;public&lt;/span&gt; partial &lt;span class="kwd"&gt;class&lt;/span&gt; EditInsertDelete_Basics : System.Web.UI.Page
&lt;b id="13"&gt;13   &lt;/b&gt;{
&lt;b id="14"&gt;14   &lt;/b&gt;    
&lt;b id="15"&gt;15   &lt;/b&gt;
&lt;b id="16"&gt;16   &lt;/b&gt;    &lt;span class="kwd"&gt;protected void&lt;/span&gt; Page_Load(&lt;span class="kwd"&gt;object&lt;/span&gt; sender, EventArgs e)
&lt;b id="17"&gt;17   &lt;/b&gt;    {
&lt;b id="18"&gt;18   &lt;/b&gt;        &lt;span class="kwd"&gt;int&lt;/span&gt; y = 0;
&lt;b id="19"&gt;19   &lt;/b&gt;    }
&lt;b id="20"&gt;20   &lt;/b&gt;    &lt;span class="kwd"&gt;protected void&lt;/span&gt; ObjectDataSource1_Deleting(&lt;span class="kwd"&gt;object&lt;/span&gt; sender, ObjectDataSourceMethodEventArgs e)
&lt;b id="21"&gt;21   &lt;/b&gt;    {
&lt;b id="22"&gt;22   &lt;/b&gt;        &lt;span class="kwd"&gt;if&lt;/span&gt; (recordToDelete &amp;gt; 0)
&lt;b id="23"&gt;23   &lt;/b&gt;            e.InputParameters[&lt;span class="st"&gt;"ProductID"&lt;/span&gt;] = recordToDelete;
&lt;b id="24"&gt;24   &lt;/b&gt;    }
&lt;b id="25"&gt;25   &lt;/b&gt;    &lt;span class="kwd"&gt;protected void&lt;/span&gt; ObjectDataSource1_DataBinding(&lt;span class="kwd"&gt;object&lt;/span&gt; sender, EventArgs e)
&lt;b id="26"&gt;26   &lt;/b&gt;    {
&lt;b id="27"&gt;27   &lt;/b&gt;        &lt;span class="kwd"&gt;int&lt;/span&gt; x = 0;
&lt;b id="28"&gt;28   &lt;/b&gt;    }
&lt;b id="29"&gt;29   &lt;/b&gt;    &lt;span class="kwd"&gt;protected void&lt;/span&gt; ObjectDataSource1_Selecting(&lt;span class="kwd"&gt;object&lt;/span&gt; sender, ObjectDataSourceSelectingEventArgs e)
&lt;b id="30"&gt;30   &lt;/b&gt;    {
&lt;b id="31"&gt;31   &lt;/b&gt;        &lt;span class="kwd"&gt;int&lt;/span&gt; x = 0;
&lt;b id="32"&gt;32   &lt;/b&gt;    }
&lt;b id="33"&gt;33   &lt;/b&gt;
&lt;b id="34"&gt;34   &lt;/b&gt;    &lt;span class="kwd"&gt;int&lt;/span&gt; recordToDelete = -1;
&lt;b id="35"&gt;35   &lt;/b&gt;    &lt;span class="kwd"&gt;protected void&lt;/span&gt; GridView1_RowCommand(&lt;span class="kwd"&gt;object&lt;/span&gt; sender, GridViewCommandEventArgs e)
&lt;b id="36"&gt;36   &lt;/b&gt;    {
&lt;b id="37"&gt;37   &lt;/b&gt;        recordToDelete = Convert.ToInt32(GridView1.DataKeys[Convert.ToInt32(e.CommandArgument)].Value);
&lt;b id="38"&gt;38   &lt;/b&gt;        &lt;span class="kwd"&gt;int&lt;/span&gt; x = 0;
&lt;b id="39"&gt;39   &lt;/b&gt;    }
&lt;b id="40"&gt;40   &lt;/b&gt;}
&lt;b id="41"&gt;41   &lt;/b&gt;
&lt;/pre&gt;&amp;nbsp;&amp;nbsp;</description></item><item><title>Re: ObjectDataSource + GridView + Disabled ViewState = Major Concurrency Issues (possible solution)</title><link>http://forums.asp.net/thread/1487109.aspx</link><pubDate>Tue, 05 Dec 2006 19:47:53 GMT</pubDate><guid isPermaLink="false">4c671506-2930-414c-a40b-8bf57ded5924:1487109</guid><dc:creator>RichardD</dc:creator><author>RichardD</author><slash:comments>0</slash:comments><comments>http://forums.asp.net/thread/1487109.aspx</comments><wfw:commentRss>http://forums.asp.net/commentrss.aspx?SectionID=53&amp;PostID=1487109</wfw:commentRss><description>&lt;p&gt;I've reported this as a bug:&lt;/p&gt;&lt;p&gt;&lt;a href="https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=243580" target="_blank"&gt;https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=243580&lt;/a&gt;&amp;nbsp;&lt;/p&gt;</description></item><item><title>Re: ObjectDataSource + GridView + Disabled ViewState = Major Concurrency Issues (possible solution)</title><link>http://forums.asp.net/thread/1487072.aspx</link><pubDate>Tue, 05 Dec 2006 19:25:36 GMT</pubDate><guid isPermaLink="false">4c671506-2930-414c-a40b-8bf57ded5924:1487072</guid><dc:creator>RichardD</dc:creator><author>RichardD</author><slash:comments>0</slash:comments><comments>http://forums.asp.net/thread/1487072.aspx</comments><wfw:commentRss>http://forums.asp.net/commentrss.aspx?SectionID=53&amp;PostID=1487072</wfw:commentRss><description>This workaround doesn&amp;#39;t seem to work for a GridView bound to an ObjectDataSource control:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The CommandArgument is not set for the RowCommand event. &lt;/li&gt;&lt;li&gt;By the time the RowCommand event is raised, the DataKeys collection has already been updated.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;The only solution I&amp;#39;ve found is to create a derived control:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Override the &lt;strike&gt;OnLoad&lt;/strike&gt; LoadControlState method and take a copy of the DataKeys;&lt;/li&gt;&lt;li&gt;Override the OnBubbleEvent, cast the source parameter to a GridViewRow, and use the RowIndex to find the key from the copied list;&lt;/li&gt;&lt;li&gt;Finally, override the RowDeleting and RowUpdating methods, and copy the values from the original key to the event arguments.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;pre class="coloredcode"&gt;&lt;b id="1"&gt;1    &lt;/b&gt;&lt;span class="kwd"&gt;using&lt;/span&gt; System;&lt;br /&gt;&lt;b id="2"&gt;2    &lt;/b&gt;&lt;span class="kwd"&gt;using&lt;/span&gt; System.Collections;&lt;br /&gt;&lt;b id="3"&gt;3    &lt;/b&gt;&lt;span class="kwd"&gt;using&lt;/span&gt; System.Web;&lt;br /&gt;&lt;b id="4"&gt;4    &lt;/b&gt;&lt;span class="kwd"&gt;using&lt;/span&gt; System.Web.UI;&lt;br /&gt;&lt;b id="5"&gt;5    &lt;/b&gt;&lt;span class="kwd"&gt;using&lt;/span&gt; System.Web.UI.WebControls;&lt;br /&gt;&lt;b id="6"&gt;6    &lt;/b&gt;&lt;br /&gt;&lt;b id="7"&gt;7    &lt;/b&gt;&lt;span class="kwd"&gt;public class&lt;/span&gt; ExtendedGridView : GridView&lt;br /&gt;&lt;b id="8"&gt;8    &lt;/b&gt;{&lt;br /&gt;&lt;b id="9"&gt;9    &lt;/b&gt;    &lt;span class="kwd"&gt;private&lt;/span&gt; DataKey[] _originalDataKeys;&lt;br /&gt;&lt;b id="10"&gt;10   &lt;/b&gt;    &lt;span class="kwd"&gt;private&lt;/span&gt; DataKey _rowCommandDataKey;&lt;br /&gt;&lt;b id="11"&gt;11   &lt;/b&gt;    &lt;br /&gt;&lt;b id="12"&gt;12   &lt;/b&gt;    &lt;span class="kwd"&gt;public&lt;/span&gt; ExtendedGridView()&lt;br /&gt;&lt;b id="13"&gt;13   &lt;/b&gt;    {&lt;br /&gt;&lt;b id="14"&gt;14   &lt;/b&gt;    }&lt;br /&gt;&lt;b id="15"&gt;15   &lt;/b&gt;    &lt;br /&gt;&lt;b id="16"&gt;16   &lt;/b&gt;    &lt;span class="kwd"&gt;protected override void&lt;/span&gt; LoadControlState(object savedState)&lt;br /&gt;&lt;b id="17"&gt;17   &lt;/b&gt;    {&lt;br /&gt;&lt;b id="18"&gt;18   &lt;/b&gt;        &lt;span class="kwd"&gt;base&lt;/span&gt;.LoadControlState(savedState);&lt;br /&gt;&lt;b id="19"&gt;19   &lt;/b&gt;        &lt;br /&gt;&lt;b id="20"&gt;20   &lt;/b&gt;        &lt;span class="kwd"&gt;if&lt;/span&gt; (!EnableViewState)&lt;br /&gt;&lt;b id="21"&gt;21   &lt;/b&gt;        {&lt;br /&gt;&lt;b id="22"&gt;22   &lt;/b&gt;            DataKeyArray keys = &lt;span class="kwd"&gt;this&lt;/span&gt;.DataKeys;&lt;br /&gt;&lt;b id="23"&gt;23   &lt;/b&gt;            &lt;span class="kwd"&gt;if&lt;/span&gt; (&lt;span class="kwd"&gt;null&lt;/span&gt; != keys &amp;amp;&amp;amp; 0 != keys.Count)&lt;br /&gt;&lt;b id="24"&gt;24   &lt;/b&gt;            {&lt;br /&gt;&lt;b id="25"&gt;25   &lt;/b&gt;                _originalDataKeys = &lt;span class="kwd"&gt;new&lt;/span&gt; DataKey[keys.Count];&lt;br /&gt;&lt;b id="26"&gt;26   &lt;/b&gt;                keys.CopyTo(_originalDataKeys, 0);&lt;br /&gt;&lt;b id="27"&gt;27   &lt;/b&gt;            }&lt;br /&gt;&lt;b id="28"&gt;28   &lt;/b&gt;        }&lt;br /&gt;&lt;b id="29"&gt;29   &lt;/b&gt;    }&lt;br /&gt;&lt;b id="30"&gt;30   &lt;/b&gt;&lt;br /&gt;&lt;b id="31"&gt;31   &lt;/b&gt;    &lt;span class="kwd"&gt;protected override bool&lt;/span&gt; OnBubbleEvent(&lt;span class="kwd"&gt;object&lt;/span&gt; source, EventArgs e)&lt;br /&gt;&lt;b id="32"&gt;32   &lt;/b&gt;    {&lt;br /&gt;&lt;b id="33"&gt;33   &lt;/b&gt;        &lt;span class="kwd"&gt;if&lt;/span&gt; (&lt;span class="kwd"&gt;null&lt;/span&gt; != _originalDataKeys)&lt;br /&gt;&lt;b id="34"&gt;34   &lt;/b&gt;        {&lt;br /&gt;&lt;b id="35"&gt;35   &lt;/b&gt;            GridViewRow row = source &lt;span class="kwd"&gt;as&lt;/span&gt; GridViewRow;&lt;br /&gt;&lt;b id="36"&gt;36   &lt;/b&gt;            GridViewCommandEventArgs args = e &lt;span class="kwd"&gt;as&lt;/span&gt; GridViewCommandEventArgs;&lt;br /&gt;&lt;b id="37"&gt;37   &lt;/b&gt;            &lt;span class="kwd"&gt;if&lt;/span&gt; (&lt;span class="kwd"&gt;null&lt;/span&gt; != row &amp;amp;&amp;amp; &lt;span class="kwd"&gt;null&lt;/span&gt; != args)&lt;br /&gt;&lt;b id="38"&gt;38   &lt;/b&gt;            {&lt;br /&gt;&lt;b id="39"&gt;39   &lt;/b&gt;                _rowCommandDataKey = _originalDataKeys[row.RowIndex];&lt;br /&gt;&lt;b id="40"&gt;40   &lt;/b&gt;            }&lt;br /&gt;&lt;b id="41"&gt;41   &lt;/b&gt;        }&lt;br /&gt;&lt;b id="42"&gt;42   &lt;/b&gt;        &lt;br /&gt;&lt;b id="43"&gt;43   &lt;/b&gt;        &lt;span class="kwd"&gt;return base&lt;/span&gt;.OnBubbleEvent(source, e);&lt;br /&gt;&lt;b id="44"&gt;44   &lt;/b&gt;    }&lt;br /&gt;&lt;b id="45"&gt;45   &lt;/b&gt;    &lt;br /&gt;&lt;b id="46"&gt;46   &lt;/b&gt;    &lt;span class="kwd"&gt;protected override void&lt;/span&gt; OnRowDeleting(GridViewDeleteEventArgs e)&lt;br /&gt;&lt;b id="47"&gt;47   &lt;/b&gt;    {&lt;br /&gt;&lt;b id="48"&gt;48   &lt;/b&gt;        &lt;span class="kwd"&gt;if&lt;/span&gt; (&lt;span class="kwd"&gt;null&lt;/span&gt; != _rowCommandDataKey)&lt;br /&gt;&lt;b id="49"&gt;49   &lt;/b&gt;        {&lt;br /&gt;&lt;b id="50"&gt;50   &lt;/b&gt;            &lt;span class="kwd"&gt;foreach&lt;/span&gt; (DictionaryEntry entry &lt;span class="kwd"&gt;in&lt;/span&gt; _rowCommandDataKey.Values)&lt;br /&gt;&lt;b id="51"&gt;51   &lt;/b&gt;            {&lt;br /&gt;&lt;b id="52"&gt;52   &lt;/b&gt;                e.Keys[entry.Key] = entry.Value;&lt;br /&gt;&lt;b id="53"&gt;53   &lt;/b&gt;            }&lt;br /&gt;&lt;b id="54"&gt;54   &lt;/b&gt;            &lt;br /&gt;&lt;b id="55"&gt;55   &lt;/b&gt;            _rowCommandDataKey = &lt;span class="kwd"&gt;null&lt;/span&gt;;&lt;br /&gt;&lt;b id="56"&gt;56   &lt;/b&gt;            _originalDataKeys = &lt;span class="kwd"&gt;null&lt;/span&gt;;&lt;br /&gt;&lt;b id="57"&gt;57   &lt;/b&gt;        }&lt;br /&gt;&lt;b id="58"&gt;58   &lt;/b&gt;        &lt;br /&gt;&lt;b id="59"&gt;59   &lt;/b&gt;        &lt;span class="kwd"&gt;base&lt;/span&gt;.OnRowDeleting(e);&lt;br /&gt;&lt;b id="60"&gt;60   &lt;/b&gt;    }&lt;br /&gt;&lt;b id="61"&gt;61   &lt;/b&gt;    &lt;br /&gt;&lt;b id="62"&gt;62   &lt;/b&gt;    &lt;span class="kwd"&gt;protected override void&lt;/span&gt; OnRowUpdating(GridViewUpdateEventArgs e)&lt;br /&gt;&lt;b id="63"&gt;63   &lt;/b&gt;    {&lt;br /&gt;&lt;b id="64"&gt;64   &lt;/b&gt;        &lt;span class="kwd"&gt;if&lt;/span&gt; (&lt;span class="kwd"&gt;null&lt;/span&gt; != _rowCommandDataKey)&lt;br /&gt;&lt;b id="65"&gt;65   &lt;/b&gt;        {&lt;br /&gt;&lt;b id="66"&gt;66   &lt;/b&gt;            &lt;span class="kwd"&gt;foreach&lt;/span&gt; (DictionaryEntry entry &lt;span class="kwd"&gt;in&lt;/span&gt; _rowCommandDataKey.Values)&lt;br /&gt;&lt;b id="67"&gt;67   &lt;/b&gt;            {&lt;br /&gt;&lt;b id="68"&gt;68   &lt;/b&gt;                e.Keys[entry.Key] = entry.Value;&lt;br /&gt;&lt;b id="69"&gt;69   &lt;/b&gt;            }&lt;br /&gt;&lt;b id="70"&gt;70   &lt;/b&gt;            &lt;br /&gt;&lt;b id="71"&gt;71   &lt;/b&gt;            _rowCommandDataKey = &lt;span class="kwd"&gt;null&lt;/span&gt;;&lt;br /&gt;&lt;b id="72"&gt;72   &lt;/b&gt;            _originalDataKeys = &lt;span class="kwd"&gt;null&lt;/span&gt;;&lt;br /&gt;&lt;b id="73"&gt;73   &lt;/b&gt;        }&lt;br /&gt;&lt;b id="74"&gt;74   &lt;/b&gt;        &lt;br /&gt;&lt;b id="75"&gt;75   &lt;/b&gt;        &lt;span class="kwd"&gt;base&lt;/span&gt;.OnRowUpdating(e);&lt;br /&gt;&lt;b id="76"&gt;76   &lt;/b&gt;    }&lt;br /&gt;&lt;b id="77"&gt;77   &lt;/b&gt;}&lt;br /&gt;&lt;/pre&gt;&amp;nbsp;&lt;br /&gt;</description></item><item><title>Re: ObjectDataSource + GridView + Disabled ViewState = Major Concurrency Issues (possible solution)</title><link>http://forums.asp.net/thread/1464373.aspx</link><pubDate>Tue, 14 Nov 2006 16:07:10 GMT</pubDate><guid isPermaLink="false">4c671506-2930-414c-a40b-8bf57ded5924:1464373</guid><dc:creator>Scott Mitchell</dc:creator><author>Scott Mitchell</author><slash:comments>0</slash:comments><comments>http://forums.asp.net/thread/1464373.aspx</comments><wfw:commentRss>http://forums.asp.net/commentrss.aspx?SectionID=53&amp;PostID=1464373</wfw:commentRss><description>&lt;p&gt;I also wanted to share my approach [see &lt;a href="http://scottonwriting.net/sowblog/posts/10054.aspx"&gt;http://scottonwriting.net/sowblog/posts/10054.aspx&lt;/a&gt; for additional comments]:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;font color="#000000"&gt;In&amp;nbsp;the &lt;em&gt;Editing, Inserting, and Deleting Data&lt;/em&gt; tutorials of my &lt;a href="http://www.asp.net/Learn/DataAccess/default.aspx?tabid=63"&gt;&lt;em&gt;Working with Data in ASP.NET 2.0&lt;/em&gt; tutorial series&lt;/a&gt;,
I demonstrate how the GridView, DetailsView, and FormView can all
support the built-in editing, deleting, and inserting capabilities with
view state disabled. The reason is because the key data Web control
properties (such as the &lt;font face="Courier New"&gt;DataKeys&lt;/font&gt; collection), are stored in &lt;em&gt;&lt;a href="http://www.codeproject.com/aspnet/TestControlStateEx.asp"&gt;control state&lt;/a&gt;&lt;/em&gt;, which is always persisted to view state regardless of the control's &lt;a href="http://msdn2.microsoft.com/en-us/library/system.web.ui.control.viewstate.aspx"&gt;&lt;font face="Courier New"&gt;EnableViewState&lt;/font&gt; property&lt;/a&gt; value.&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;In&amp;nbsp;my tutorials I don't mention the view state issue, I just silently set the &lt;font face="Courier New"&gt;EnableViewState&lt;/font&gt;
property to false. And this works wonderfully when testing the page.
Deletes and edits work exactly as expected, with or without view state
enabled. However, a rather insidious behavior can rear its head when
there are multiple users visiting the same page. This potential trap
was pointed out to me by alert reader Jamie Crutchley, whose observed
and shared information about this problem on the ASP.NET Forums in the
past. I'll explain the problem (and a potential workaround) in my own
words, but you can read Jamie's posts &lt;a href="http://forums.asp.net/thread/1400929.aspx"&gt;here&lt;/a&gt; and &lt;a href="http://forums.asp.net/thread/1401397.aspx"&gt;here&lt;/a&gt;, if you'd rather.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;PROBLEM&lt;/strong&gt;: Two users - Alice and Bob - visit a page (&lt;font face="Courier New"&gt;Products.aspx&lt;/font&gt;) that&amp;nbsp;uses a GridView whose to list&amp;nbsp;products; the GridView's view state has been disabled. The GridView uses its &lt;font face="Courier New"&gt;DataKeys&lt;/font&gt;
collection to store the primary key values of the three products.
Imagine that the products listed are Pens, Books, and Paper, and their
respective primary key values&amp;nbsp;are 1, 2, and 3.&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;Alice clicks on the Delete button for the first product in the grid (Pens). &lt;/li&gt;&lt;li&gt;A postback occurs. Because the GridView's view state has been
disabled, on postback the data is re-read from the GridView's data
source. &lt;strong&gt;This has the side effect of repopulating the &lt;font face="Courier New"&gt;DataKeys&lt;/font&gt; collection with the newly read data!&lt;/strong&gt; &lt;/li&gt;&lt;li&gt;Since the first row index was clicked, the GridView grabs the &lt;font face="Courier New"&gt;DataKeys&lt;/font&gt; value&amp;nbsp;indexed at 0 and issues a delete based on that primary key value (1).&lt;/li&gt;&lt;li&gt;Bob still sees all three products on the page (since he loaded&amp;nbsp;the
page&amp;nbsp;before Alice deleted Pens). Sometime after Alice has made her
deletion, Bob, too, decides that Pens must be deleted. He clicks on the
Delete button for Pens.&lt;/li&gt;&lt;li&gt;A postback occurs. Because the GridView's view state has been
disabled, on postback the data is re-read from the GridView's data
source. &lt;strong&gt;This has the side effect of repopulating the &lt;font face="Courier New"&gt;DataKeys&lt;/font&gt; collection with the newly read data!&lt;/strong&gt; &lt;/li&gt;&lt;li&gt;Since the first row index was clicked, the GridView grabs the &lt;font face="Courier New"&gt;DataKeys&lt;/font&gt; value&amp;nbsp;indexed at 0. However, since the DataKeys collection has been reloaded in Step 5, the first &lt;font face="Courier New"&gt;DataKeys&lt;/font&gt;
value is the primary key of Books (since Pens&amp;nbsp;has since been&amp;nbsp;deleted).
The consequence is that Books is deleted, even though Bob wanted to
delete Pens!!&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;More generally, if Alice deletes any product whose index preceeds
the index of the record Bob deletes, Bob's delete will actually delete
a different record. Similarly, if Alice deletes a preceeding record of
the one Bob is editing, the edits will be applied to a preceeding row.
Eep.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SHORT AND SIMPLE SOLUTION: &lt;/strong&gt;Unless you are
absolutely, 100%, certifiably, unconditionally certain that there will
never, ever, not in a million years be two users concurrently
editing/deleting records, then be sure to leave the GridView /
DetailsView / FormView's &lt;font face="Courier New"&gt;EnableViewState&lt;/font&gt; property to True (the default).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;MORE&amp;nbsp;INVOLVED SOLUTION:&lt;/strong&gt; If you really would like to
reduce the page size by disabling view state, you can use the following
“hack”... When a Delete (or Edit) button is clicked in the GridView the
&lt;a href="http://msdn2.microsoft.com/en-us/library/system.web.ui.webcontrols.gridview.rowcommand.aspx"&gt;&lt;font face="Courier New"&gt;RowCommand&lt;/font&gt; event&lt;/a&gt; fires &lt;em&gt;before&lt;/em&gt; the &lt;font face="Courier New"&gt;DataKeys&lt;/font&gt; collection is internally repopulated. Therefore, you can create an event handler that includes code that “saves” the &lt;font face="Courier New"&gt;DataKeys&lt;/font&gt; value(s) for the record being deleted. Then, in the ObjectDataSource's &lt;a href="http://msdn2.microsoft.com/en-us/library/system.web.ui.webcontrols.objectdatasource.deleting.aspx"&gt;&lt;font face="Courier New"&gt;Deleting&lt;/font&gt; event&lt;/a&gt; handler you can reassign this value back to the primary key parameter(s).&lt;/p&gt;
&lt;p&gt;Here's some code to implement this approach. First, in the &lt;font face="Courier New"&gt;RowCommand &lt;/font&gt;event handler the primary key (&lt;font face="Courier New"&gt;ProductID&lt;/font&gt;) is saved in a page-level variable:&lt;/p&gt;
&lt;div style="background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:Courier New;"&gt;
&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;int&lt;/span&gt; recordToDelete = -1;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;protected&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; GridView1_RowCommand(&lt;span style="color:blue;"&gt;object&lt;/span&gt; sender, &lt;span style="color:teal;"&gt;GridViewCommandEventArgs&lt;/span&gt; e)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;3&lt;/span&gt;&amp;nbsp;{&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;4&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; recordToDelete = &lt;span style="color:teal;"&gt;Convert&lt;/span&gt;.ToInt32(GridView1.DataKeys[&lt;span style="color:teal;"&gt;Convert&lt;/span&gt;.ToInt32(e.CommandArgument)].Value);&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;5&lt;/span&gt;&amp;nbsp;}&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;Then, in the ObjectDataSource's &lt;font face="Courier New"&gt;Deleting&lt;/font&gt; event, assign the page-level variable to the appropriate parameter:&lt;/p&gt;
&lt;div style="background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:Courier New;"&gt;
&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;protected&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; ObjectDataSource1_Deleting(&lt;span style="color:blue;"&gt;object&lt;/span&gt; sender, &lt;span style="color:teal;"&gt;ObjectDataSourceMethodEventArgs&lt;/span&gt; e)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2&lt;/span&gt;&amp;nbsp;{&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;3&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (recordToDelete &amp;gt; 0)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;4&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; e.InputParameters[&lt;span style="color:maroon;"&gt;"ProductID"&lt;/span&gt;] = recordToDelete;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;5&lt;/span&gt;&amp;nbsp;}&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;The tutorials and code at Working with Data in ASP.NET 2.0 will
be updated so that they no longer disable view state and will&amp;nbsp;include a
similar warning as to this blog entry, although due to the breadth of
material online, it may take several days or weeks to get all the
changes made and propagated...&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;a href="http://scottonwriting.net/sowblog/posts/10054.aspx"&gt;http://scottonwriting.net/sowblog/posts/10054.aspx&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;</description></item><item><title>ObjectDataSource + GridView + Disabled ViewState = Major Concurrency Issues (possible solution)</title><link>http://forums.asp.net/thread/1401397.aspx</link><pubDate>Sun, 17 Sep 2006 02:53:04 GMT</pubDate><guid isPermaLink="false">4c671506-2930-414c-a40b-8bf57ded5924:1401397</guid><dc:creator>jdcrutchley</dc:creator><author>jdcrutchley</author><slash:comments>0</slash:comments><comments>http://forums.asp.net/thread/1401397.aspx</comments><wfw:commentRss>http://forums.asp.net/commentrss.aspx?SectionID=53&amp;PostID=1401397</wfw:commentRss><description>&lt;p&gt;&lt;strong&gt;DISCLAIMER:&amp;nbsp; &lt;/strong&gt;I&amp;#39;m no expert on the GridView lifecycle, but empirical evidence seems to suggest this stuff is correct...&amp;nbsp; I&amp;#39;m sure if I&amp;#39;ve gotten anything wrong here an expert will jump in and correct me. &lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issue:&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;When you hook up a GridView to an ObjectDataSource when the ViewState is disabled, there is a major concurrency issue.&amp;nbsp; The issue is that if Bob and Joe are both looking at the same list, and Joe deletes Row #3, then Bob goes to delete Row #5, Bob is really going to delete Row #6 (of the original list they were looking at) because all of the rows have shifted upward after Joe&amp;#39;s delete.&amp;nbsp; This could happen even with the ObjectDataSource&amp;#39;s concurrency stuff running because things like Delete are just looking at row number.&amp;nbsp; Note that this might also happen with ViewState enabled - I&amp;#39;m not really sure because I never enable ViewState for big honking GridViews...&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Root Cause:&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;When the GridView fires off a Delete event, it sets the form&amp;#39;s __EVENTTARGET variable to the ID of the GridView (like ctl00$ContentPlaceHolder1$GridView1) and the __EVENTARGUMENT to &amp;quot;Delete$x&amp;quot; where the &amp;quot;x&amp;quot; part represents the row of the deleted item.&amp;nbsp; So, Joe fires off his delete of Row #3 and __EVENTARGUMENT is &amp;quot;Delete$3&amp;quot;, and this tells the ObjectDataSource &amp;quot;Delete the thing at Row #3&amp;quot;, so it grabs the DataKey and does a delete.&amp;nbsp; Now Bob fires off his delete before refreshing the display and __EVENTARGUMENT gets set to &amp;quot;Delete$5&amp;quot;.&amp;nbsp; Trouble is, now what was Row #5 is really Row #4 because of Joe&amp;#39;s previous delete, so the ObjectDataSource ends up deleting the wrong line.&amp;nbsp; Another side effect of this is that hitting the browser&amp;#39;s refresh button immediately after doing a delete of Row #3 will cause whatever happens to now be on Row #3 to be deleted without error.&amp;nbsp; Again, this might not be the same if you have concurrency set on the ObjectDataSource and ViewState enabled on your GridView - but who wants all of the data in a huge GridView getting sent to the client anyway?&lt;/p&gt;&lt;p&gt;&lt;strong&gt;A&amp;nbsp;Possible&amp;nbsp;Solution:&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Well, the only way I&amp;#39;ve found to get around this is to just chuck the ObjectDataSource and go back to manually binding my data.&amp;nbsp; (That&amp;#39;s probably a tiny bit faster anyway since the calls can be early-bound.)&amp;nbsp; Once that&amp;#39;s done, you can hook up to the GridView&amp;#39;s OnRowCreated event and do something like this:&lt;/p&gt;&lt;pre class="coloredcode"&gt;&lt;span class="kwd"&gt;if&lt;/span&gt; (e.Row.RowType == DataControlRowType.DataRow)
    e.Row.ID = &lt;span class="st"&gt;&amp;quot;ctl&amp;quot;&lt;/span&gt; + ((MyNamespace.MyClass)e.Row.DataItem).ID;
&lt;/pre&gt;&lt;p&gt;Doing this will make the ID of the control represent the unique ID of your object instead of the row number. That way command event gets fired if that unique item still exists in the list, but if it doesn&amp;#39;t, the command event is never fired.&amp;nbsp; Also, if you want to let the user know that their&amp;nbsp;action didn&amp;#39;t happen because of a concurrency issue, you can check in OnLoad to see if you&amp;#39;re in a postback and if FindControl can&amp;#39;t find a control with the ID in &amp;nbsp;__EVENTTARGET then the item they were going to perform the action on is gone and you can give them a notification.&lt;/p&gt;&lt;p&gt;This method doesn&amp;#39;t work at all with the DataSource controls because the event that gets fired for them always uses the GridView as the sender (as opposed to the LinkButton within it) and so there&amp;#39;s no way to use this hackery to change from row number&amp;nbsp;to object ID.&amp;nbsp; I tried just changing the CommandArgument in the OnDeleting event, but it&amp;#39;s readonly and that would confuse the DataSource anyway because it&amp;#39;s expecting a row number...&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Drawbacks:&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Well, one obvious drawback is you can&amp;#39;t use the ObjectDataSource to automagically update your data.&amp;nbsp; To me that&amp;#39;s a very small issue though since writing a &amp;quot;GV1.DataSource=something; GV1.DataBind();&amp;quot; isn&amp;#39;t the hardest thing in the world and I don&amp;#39;t like alot of automagical stuff anyway...&amp;nbsp; There are probably other ones that will pop up as I use this more, but for now it&amp;#39;s working great for me.&lt;/p&gt;&lt;p&gt;As always, there&amp;#39;s more than one way to beat a mule, so you could also just use HyperLinks for your actions and add your object ID to the querystring if you don&amp;#39;t mind adding junk to your querystring.&amp;nbsp; That&amp;#39;d work too, but again, you couldn&amp;#39;t use the ObjectDataSource to automagically delete your data.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Bottom Line:&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;ObjectDataSource is good for quick prototyping or single-user applications, but not so good for real-world applications that will have multiple users updating the same data.&lt;/p&gt;&lt;p&gt;jdc&lt;/p&gt;</description></item></channel></rss>