Improved solution, tested in VS2010:
Since you already have ItemTemplate structure, one way to achieve this is to set the edit template for each of the columns, and have a non-editable field (a label) for the columns that you want to keep disabled from the users.
<asp:GridView ID="GridView1" runat="server"
CellPadding="4" ForeColor="#333333"
GridLines="Vertical" Height="265px"
Width="100%" HorizontalAlign="Left" onrowediting="gridView_RowEditing"
onrowcancelingedit="gridView_RowCancelingEdit"
onrowupdating="gridView_RowUpdating"
onrowdeleting="gridView_Rowdeleting" AutoGenerateColumns="False">
<AlternatingRowStyle BackColor="White" />
<Columns>
<asp:TemplateField ShowHeader="true">
<ItemTemplate>
<asp:Button ID="btnedit" CommandName="EDIT" runat="server" Text="EDIT" />
</ItemTemplate>
<EditItemTemplate>
<asp:Button ID="btnupdate" CommandName="Update" runat="server" Text="Update" />
<asp:Button ID="btnCancel" CommandName="Cancel" runat="server" Text="Cancel" />
<asp:Button ID="btnDelete" CommandName="Delete" runat="server" Text="Delete" />
</EditItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Item IP" ShowHeader="true">
<ItemTemplate>
<asp:Label ID="iplabel" runat="server" Text='<%# Bind("Item_IP") %>'></asp:Label>
</ItemTemplate>
<EditItemTemplate>
<asp:Label ID="iplabel" runat="server" Text='<%# Bind("Item_IP") %>'></asp:Label>
</EditItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Name" ShowHeader="true">
<ItemTemplate>
<asp:Label ID="namelabel" runat="server" Text='<%# Bind("Name") %>'></asp:Label>
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox ID="namebox" runat="server" Text='<%# Bind("Name") %>'></asp:TextBox>
</EditItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Price" ShowHeader="true">
<ItemTemplate>
<asp:Label ID="pricelabel" runat="server" Text='<%# Bind("Price") %>'></asp:Label>
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox ID="pricebox" runat="server" Text='<%# Bind("Price") %>'></asp:TextBox>
</EditItemTemplate>
</asp:TemplateField>
</Columns>
<EmptyDataTemplate>
<p>No items.</p>
</EmptyDataTemplate>
<EditRowStyle BackColor="#2461BF" BorderWidth="1px" />
<FooterStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
<HeaderStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" Height="3px" />
<PagerStyle BackColor="#2461BF" ForeColor="White" HorizontalAlign="Center" />
<RowStyle BackColor="#EFF3FB" />
<SelectedRowStyle BackColor="#D1DDF1" Font-Bold="True" ForeColor="#333333" />
<SortedAscendingCellStyle BackColor="#F5F7FB" />
<SortedAscendingHeaderStyle BackColor="#6D95E1" />
<SortedDescendingCellStyle BackColor="#E9EBEF" />
<SortedDescendingHeaderStyle BackColor="#4870BE" />
</asp:GridView>
The previous suggestion I made about instantiating and setting the columns individually was not enough to overcome the behavior of the GridView. I've tested this, though, and it appears to have the behavior you desire.