Как показать оригинальные выбранные элементы DropDownList в событии GridView RowUpdating - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть столбцы GridView, которые я хотел бы обновить с помощью события RowUpdating. Для этого я использую выпадающий список в GridView EditItemTemplate, и он отлично работает.

Однако при входе в режим редактирования GridView возникает проблема; выбранный элемент в раскрывающемся списке показывает его значение по умолчанию, а не ранее выбранные элементы, которые хранятся в базе данных. Поэтому, если пользователь редактирует другой столбец и пропускает раскрывающийся список, столбец GridView (с раскрывающимся списком в EditItemTemplate) будет ошибочно обновлен до значения по умолчанию для раскрывающегося списка.

Другими словами, когда я вхожу в режим редактирования GridView, я хочу, чтобы в раскрывающемся списке отображалось (или выбиралось) значение, связанное с моей базой данных SQL, и не показывавшее его значение по умолчанию или первое значение. Я попытался использовать <% # Bind ("zone")%> ', который работает для текстового поля, но не работает для выпадающего списка. Есть идеи?

Вот мой код GridView:

<asp:GridView ID="GridView1" runat="server" 
    AutoGenerateColumns="False" 
    DataKeyNames="ID" AllowSorting="False"  
    onrowediting="GridView1_RowEditing"
    onrowcancelingedit="GridView1_RowCancelingEdit"
    onrowdatabound="GridView1_RowDataBound"
    onrowupdating="GridView1_RowUpdating"
    EnableViewState="False">
    <Columns>
        <asp:TemplateField HeaderText="Zone" SortExpression="Zone">
            <EditItemTemplate>         
                <asp:DropDownList ID="ddlZone" runat="server" Width="80px">
                    <asp:ListItem Value="zone1">Zone 1</asp:ListItem>
                    <asp:ListItem Value="zone2">Zone 2</asp:ListItem>
                    <asp:ListItem Value="zone3">Zone 3</asp:ListItem>
                </asp:DropDownList>                        
            </EditItemTemplate>
            <ItemTemplate>
                <asp:Label ID="lblZone" runat="server" Text='<%# Bind("zone") %>'></asp:Label>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Subzone" SortExpression="Subzone">
            <EditItemTemplate>
                <asp:TextBox ID="txtSubzone" runat="server" Text='<%# Bind("subzone") %>' Width="100px"></asp:TextBox>
            </EditItemTemplate>
            <ItemTemplate>
                <asp:Label ID="lblSubzone" runat="server" Text='<%# Bind("subzone") %>'></asp:Label>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

Код:

protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
{

    string textZone = (GridView1.Rows[e.RowIndex].FindControl("ddlZone") as DropDownList).SelectedItem.Value;
    string textSubzone = ((TextBox)GridView1.Rows[e.RowIndex].FindControl("txtSubzone")).Text;



    string query = "UPDATE tblRegion SET zone = '" + textZone
        + "', subzone ='" + Subzone"
        + "' WHERE (ID ='" + entryID + "')";

    SqlCommand sqlCmd = new SqlCommand(query, conn);
    SqlDataAdapter sqlDa = new SqlDataAdapter(sqlCmd);

    conn.Open();
    DataTable dt = new DataTable();
    sqlDa.Fill(dt);
    conn.Close();
}

Заранее спасибо: -)

1 Ответ

0 голосов
/ 05 ноября 2018

Если ваш список всегда статичен, это должно сработать.

<asp:DropDownList ID="ddlZone" runat="server" Width="80px" SelectedValue='<%# Bind("zone") %>'>

Если по какой-то причине это не так, вы можете попробовать установить выбранное значение из кода, стоящего за событием OnDataRowBound.

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowState == DataControlRowState.Edit)
        {
            var ddl = (DropDownList) e.Row.FindControl("ddlZone");
            ddl.SelectedValue = "zone1"; //Your logic to bind the requiered index or value
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...