Setting selectedValue of ListBox displayed in EditItemTemplate

I am using a GridView with TemplateFields that are populated from a database.

One of these fields is called ‘Category’.

In the ItemTemplate it is displayed as a Label. But when I switch to the EditItemTemplate, it is dispayed as a ListBox.

The challenge:

I want the ListBox’s selectedValue to be set to the value shown in the Label in the ItemTemplate, (which is the database value).

How can I do this? How can I access the value of the Label in ItemTemplate before the EditItemTempate is displayed?

I have tried accessing the OldValues property, but that is only available (in Visual Web Developer) in the RowUpdating event. This is too late in the sequence, occurring after the Update button is clicked. I want access to the OldValues when the Edit button is clicked.

Do I need to do a database read within code for that particular row? It seems a shame when the value has already been read, and should be in the system somewhere.

Can anyone please help?

Here is the sample GridView Control.

<asp:GridView ID="gridViewEmployee" runat="server" AutoGenerateColumns="false" OnRowCancelingEdit="gridViewEmployee_RowCancelingEdit"
                OnRowEditing="gridViewEmployee_RowEditing" 
                onrowdatabound="gridViewEmployee_RowDataBound">
                <Columns>
                    <asp:TemplateField HeaderText="Sno">
                        <ItemTemplate>
                            <%# Container.DataItemIndex + 1  %>
                        </ItemTemplate>
                    </asp:TemplateField>
                    <asp:TemplateField HeaderText="City">
                        <ItemTemplate>
                            <asp:Label ID="lblCity" Text='<%# Eval("City") %>' runat="server"></asp:Label>
                        </ItemTemplate>
                        <EditItemTemplate>
                            <asp:ListBox ID="lstboxCity" runat="server">
                            
                            </asp:ListBox>
                        </EditItemTemplate>
                    </asp:TemplateField>
                    <asp:CommandField ButtonType="Button" EditText="Edit" ShowEditButton="true" />
                </Columns>
            </asp:GridView>


Row Editing Event :

protected void gridViewEmployee_RowEditing(object sender, GridViewEditEventArgs e)
    {
        gridViewEmployee.EditIndex = e.NewEditIndex;
        //Call the data binding method to bind data to the GridView
       
    }

You should set the index for the listbox in the RowDataBound Event for the GridView as follows, this event will fire when data is being bound to the GridView

protected void gridViewEmployee_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow && gridViewEmployee.EditIndex == e.Row.RowIndex)
        {
           //Access the ListBox and Label 
            ListBox lstboxCity = (ListBox)e.Row.FindControl("lstboxCity");
            Label lblCity = (Label)e.Row.FindControl("lblCity");
            DataTable dt = new DataTable();
            lstboxCity.DataSource = dt;
            lstboxCity.DataTextField = "city";
            lstboxCity.DataValueField = "city";
            lstboxCity.DataBind();
          // Set the Index of the lstboxCity ,using the following line
            lstboxCity.Items.FindByText(lblCity.Text).Selected = true;
        }
    }

For RowCancelingEdit Event :

protected void gridViewEmployee_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
    {
        gridViewEmployee.EditIndex = -1;
        //Call the data binding method to bind data to the GridView
       
    }