Поскольку у вас есть TemplateField, содержащий метку в крайнем левом столбце, а не BoundField, вы получаете значение следующим образом:
foreach (GridViewRow dr in gvCategories.Rows)
{
Label l = (Label)dr.Cells[0].Controls[1];
if (l.Text.Trim() == txtEnterCategory.Text.Trim())
{
lblErrorMessage.Text = "This category already exits. Please enter a new category!";
lblErrorMessage.Visible = true;
isError=true;
}
Не спрашивайте меня, почему это Controls [1], но это так. Кажется, что каждый элемент управления в ItemTemplate TemplateField создает пару элементов управления, например, если у вас было это:
<asp:TemplateField>
<ItemTemplate>
<asp:TextBox ID="txtFoo" runat="server" />
<asp:TextBox ID="txtBar" runat="server" />
</ItemTemplate>
</asp:TemplateField>
txtFoo будет в Controls [1], а txtBar будет в Controls [3].