Member 12695777 Ответов: 1

Не обновляйте раскрывающийся список gridview при редактировании


У меня есть простой gridview, извлекающий данные из таблицы базы данных SQL-server. Он имеет 2 каскадных выпадающих списка. Это простая практика asp.net веб-приложение на языке C#. Я использую “вариант командное поле в качестве” в столбце “редактирование”.
То, что я пытаюсь сделать, - это настроить выпадающие списки в gridview так, чтобы они сохраняли свои текущие значения при нажатии кнопки edit. Как бы то ни было, когда я нажимаю кнопку edit, она обновляет страницу / gridview и возвращает второй выпадающий список к первому выбору в меню. Я хочу, чтобы он сохранил свое первоначальное значение, если только первый выпадающий список не будет изменен.
Это позволит мне изменить другие поля, не затрагивая два выпадающих списка.
Этот простой gridview имеет только 5 столбцов:
Изменить – (для кнопки Изменить)
ID – (не редактируемый столбец)
Имя – (простое текстовое поле)
Производитель – ( 1-й выпадающий список “ddlManufacturer”)
Model – ( 2-й выпадающий список “ddlModel”)

Я попробовал установить “AutoPostBack=false” в gridview и в обоих выпадающих списках.
Я также попытался изменить команды “e.NewValue” на странице aspx.cs на “e.OldValue” но, похоже, ничего не работает. Каждый раз, когда я нажимаю кнопку Изменить, он сбрасывает второй выпадающий список на первое значение в списке.
Любая помощь будет очень признательна.
Спасибо.

Что я уже пробовал:

Мой код aspx:
<asp:Content ID="BodyContent" ContentPlaceHolderID="MainContent" runat="server">
    <div>


<%-- GRIDVIEW --%>

<div>
    <asp:GridView ID="GridView1" runat="server" DataSourceID="SqlDataSource1" OnRowUpdating="GridView1_RowUpdating"
AutoGenerateColumns="False" DataKeyNames="CustomerId" CellPadding="4" ForeColor="#333333" GridLines="Both" >
        <AlternatingRowStyle BackColor="White" />

<Columns>
<%-- Modify Column --%>
<asp:CommandField ShowEditButton="True" HeaderText="Modify" />

<%-- CustomerId Column --%>
    <asp:BoundField DataField="CustomerId" HeaderText="ID" SortExpression="CustomerId" ReadOnly="true" /> 

<%-- Name Column --%>
<asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name" />

<%-- Manufacturer Column --%>
<asp:TemplateField HeaderText="Manufacturer" SortExpression="Manufacturer">
<EditItemTemplate>
<asp:DropDownList ID="ddlManufacturer" runat="server" AutoPostBack="True" DataTextField="Manufacturer"
DataValueField="Manufacturer" Width="122px" SelectedValue='<%# Bind("Manufacturer") %>'
DataSourceID="SqlDataSource2" >
</asp:DropDownList>
<asp:SqlDataSource ID="SqlDataSource2" runat="server" ConnectionString="<%$ ConnectionStrings:CarsConnectionString %>"
SelectCommand="SELECT [Manufacturer] FROM Manufacturer"></asp:SqlDataSource>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label2" runat="server" Text='<%# Bind("Manufacturer") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>

<%-- Model Column --%>
<asp:TemplateField HeaderText="Model" SortExpression="Model">
<EditItemTemplate>
Model:
<asp:DropDownList ID="ddlModel" runat="server" DataSourceID="SqlDataSource3" DataTextField="Model" DataValueField="Model">
</asp:DropDownList>
<asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ControlToValidate="ddlModel" InitialValue="Select" ErrorMessage="Select a Model" ></asp:RequiredFieldValidator>
<asp:SqlDataSource ID="SqlDataSource3" runat="server" ConnectionString="<%$ ConnectionStrings:CarsConnectionString %>"
SelectCommand="SELECT [Model],[Manufacturer] FROM [Model] "  FilterExpression="[Manufacturer]= '{0}'">
<FilterParameters><asp:ControlParameter ControlID="ddlManufacturer" Name="Manufacturer" PropertyName="SelectedValue" Type="String" />
</FilterParameters>
</asp:SqlDataSource>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<%# Bind("Model") %>'></asp:Label>
   
</ItemTemplate>
   
</asp:TemplateField>

</Columns>

<%-- GridView Color Scheme --%>
        <EditRowStyle BackColor="#7C6F57" />
        <FooterStyle BackColor="#1C5E55" Font-Bold="True" ForeColor="White" />
        <HeaderStyle BackColor="#1C5E55" Font-Bold="True" ForeColor="White" />
        <PagerStyle BackColor="#666666" ForeColor="White" HorizontalAlign="Center" />
        <RowStyle BackColor="#E3EAEB" />
        <SelectedRowStyle BackColor="#C5BBAF" Font-Bold="True" ForeColor="#333333" />
        <SortedAscendingCellStyle BackColor="#F8FAFA" />
        <SortedAscendingHeaderStyle BackColor="#246B61" />
        <SortedDescendingCellStyle BackColor="#D4DFE1" />
        <SortedDescendingHeaderStyle BackColor="#15524A" />

</asp:GridView>

<%-- DataSource for GridView --%>
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:CarsConnectionString %>"
    
SelectCommand="SELECT [CustomerId], [Name], [Manufacturer], [Model] FROM [Customers] ORDER BY CustomerId"
InsertCommand="INSERT INTO [Customers] ([Name], [Manufacturer], [Model]) VALUES (@Name, @Manufacturer, @Model)"
UpdateCommand="UPDATE [Customers] SET [Name] = @Name, [Manufacturer] = @Manufacturer, [Model] = @Model WHERE [CustomerId] = @CustomerId"
DeleteCommand="DELETE FROM [Customers] WHERE [CustomerId] = @CustomerId">

</asp:SqlDataSource>

</div>
</div>
    
</asp:Content>


Мой aspx-файл.в CS (код позади):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
using System.Configuration;
using System.Data.Sql;
using System.Data;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

namespace CascadingGridview6
{
    public partial class Contact : Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                
            }
        }

        SqlConnection con = new SqlConnection(@"Data Source=dsouthres18v;Initial Catalog=Cars;Integrated Security=True");

        public int NewEditIndex { get; private set; }

        protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
        {
            
            string strModel = ((DropDownList)((GridView)sender).Rows[e.RowIndex].FindControl("ddlModel")).SelectedValue;
            string strManufacturer = ((DropDownList)((GridView)sender).Rows[e.RowIndex].FindControl("ddlManufacturer")).SelectedValue;
            e.NewValues[
            "Model"] = strModel;
            e.NewValues[
            "Manufacturer"] = strManufacturer;
            e.Cancel =
            false;
            GridView gv = (GridView)sender;
            for (int i = 0; i < gv.Columns.Count; i++)
            {
                DataControlFieldCell cell = gv.Rows[e.RowIndex].Cells[i] as DataControlFieldCell;
                gv.Columns[i].ExtractValuesFromCell(e.NewValues, cell,
                DataControlRowState.Edit, true);
            }
        }

        
    }
}

Karthik_Mahalingam

вы пробовали использовать панель обновления ?

[no name]

Я думал об этом, но если я помещу gridview в панель обновления; когда я нажму кнопку edit (то есть в gridview), это обновит / обновит gridview, даже если он находится в панели обновления. (Я думаю) я не очень хорошо знаком с тем, как работает панель обновления. Спасибо за предложение.

[no name]

Я все еще ищу ответ на этот вопрос, если кто-нибудь может мне помочь. Возможно ли это вообще? Спасибо.

[no name]

Кроме того, панель обновления не работает. Я попробовал вложить оба раскрывающихся списка в панель обновления, и я попробовал вложить каждую часть 2 раскрывающихся меню. Пока ничего не работает. Пожалуйста, посоветуйте. Спасибо.

1 Ответов

Рейтинг:
6

Member 12695777

ОБНОВЛЕНИЕ
Я нашел решение своей проблемы, и я уверен, что есть и другие, кто хотел бы знать ответ. Итак, вот оно,
Мой код был в основном на ходу, я пропустил только пару пунктов.

First; I copied the "asp:Label…. " command from the "ItemTemplate" section of the "Model" column and pasted it in the "EditItemTemplate" just above the dropdown list and added the value (Visible="false") to the end of the statement.


Second; I added the following (GridView1_RowDataBound) method to the "aspx.cs" page just above the existing (GridView1_RowUpdating) method and populated it with the following code –


if (e.Row.RowType == DataControlRowType.DataRow)
            {
                if ((e.Row.RowState & DataControlRowState.Edit) > 0)
                {

                    DropDownList DDL2 = e.Row.FindControl("ddlModel") as DropDownList;       // 2nd ddl (Region)

                    Label LBL2 = e.Row.FindControl("Label1") as Label;       // label in "edit" mode on second ddl

                    DDL2.DataBind();
                    DDL2.SelectedValue = Convert.ToString(LBL2.Text);
                }
            }


Наконец, я добавил команду (OnRowDataBound=”GridView1_RowDataBound”) в начало Gridview, где вы фактически вызываете Gridview.

Вот полный исходный код для обеих страниц:
HTML-страница (default.aspx)

<%@ Page Title="Cascading Gridview" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="About.aspx.cs" Inherits="WebApplication1.About" %>

<asp:Content ID="BodyContent" ContentPlaceHolderID="MainContent" runat="server">
 <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="Customerid" DataSourceID="SqlDataSource1" 
        CellPadding="4" ForeColor="#333333" OnRowUpdating="GridView1_RowUpdating" OnRowDataBound="GridView1_RowDataBound">
        <AlternatingRowStyle BackColor="White" />
        <Columns>
            <%-- Edit Column --%>
            <asp:CommandField ShowEditButton="true" />

            <%-- CustomerId Column --%>
            <asp:BoundField DataField="Customerid" HeaderText="Customerid" InsertVisible="False" ReadOnly="True" SortExpression="Customerid" />

            <%-- Name Column --%>
            <asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name" />

            <%-- Manufacturer Column --%>
            <asp:TemplateField HeaderText="Manufacturer" SortExpression="Manufacturer">
                <EditItemTemplate>
                    
                    <%--<asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("Manufacturer") %>'></asp:TextBox>--%>

                    <%-- Dropdown List --%>
                    <asp:DropDownList ID="ddlManufacturer" runat="server" AutoPostBack="true" DataTextField="Manufacturer"
                        DataValueField="Manufacturer" SelectedValue='<%# Bind("Manufacturer") %>' DataSourceID="SqlDataSource2" >
                    </asp:DropDownList>

                    <%-- SQL DataSource --%>
                    <asp:SqlDataSource ID="SqlDataSource2" runat="server" ConnectionString="<%$ ConnectionStrings:conString %>"
                        SelectCommand="SELECT [Manufacturer] FROM Manufacturer"></asp:SqlDataSource>
                </EditItemTemplate>

                    <%-- Label --%>
                <ItemTemplate>
                    <asp:Label ID="Label1" runat="server" Text='<%# Bind("Manufacturer") %>'></asp:Label>
                </ItemTemplate>
            </asp:TemplateField>

            <%-- Model Column --%>
            <asp:TemplateField HeaderText="Model" SortExpression="Model">
                <EditItemTemplate>
                    <%--<asp:TextBox ID="TextBox2" runat="server" Text='<%# Bind("Model") %>'></asp:TextBox>--%>

                     <%-- Label --%>
                    <asp:Label ID="Label1" runat="server" Text='<%# Bind("Model") %>' Visible="false"></asp:Label>

                     <%-- DropDownList --%>
                    <asp:DropDownList ID="ddlModel" runat="server" DataSourceID="SqlDataSource3" DataTextField="Model" DataValueField="Model" >
                    </asp:DropDownList>

                    <%-- Data Source --%>
                    <asp:SqlDataSource ID="SqlDataSource3" runat="server" ConnectionString="<%$ ConnectionStrings:conString %>"
                    SelectCommand="SELECT [Model],[Manufacturer] FROM [Model] " FilterExpression="[Manufacturer]= '{0}'">
                    <FilterParameters><asp:ControlParameter ControlID="ddlManufacturer" Name="Manufacturer" PropertyName="SelectedValue" Type="String" />
                    </FilterParameters>
                    </asp:SqlDataSource>
                </EditItemTemplate>

                <%-- Label --%>
                <ItemTemplate>
                    <asp:Label ID="Label2" runat="server" Text='<%# Bind("Model") %>'></asp:Label>
                </ItemTemplate>
            </asp:TemplateField>

            <%-- ID Column --%>
            <asp:BoundField DataField="id" HeaderText="id" SortExpression="id" />

        </Columns>
        <FooterStyle BackColor="#990000" Font-Bold="True" ForeColor="White" />
        <HeaderStyle BackColor="#990000" Font-Bold="True" ForeColor="White" />
        <PagerStyle BackColor="#FFCC66" ForeColor="#333333" HorizontalAlign="Center" />
        <RowStyle BackColor="#FFFBD6" ForeColor="#333333" />
        <SelectedRowStyle BackColor="#FFCC66" Font-Bold="True" ForeColor="Navy" />
        <SortedAscendingCellStyle BackColor="#FDF5AC" />
        <SortedAscendingHeaderStyle BackColor="#4D0000" />
        <SortedDescendingCellStyle BackColor="#FCF6C0" />
        <SortedDescendingHeaderStyle BackColor="#820000" />
</asp:GridView>
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:conString %>" 
    SelectCommand="SELECT [CustomerId], [Name], [Manufacturer], [Model], [id] FROM [Customers] ORDER BY CustomerId"
    UpdateCommand="UPDATE [Customers] SET [Name]=@Name, [Manufacturer]=@Manufacturer, [Model]=@Model WHERE [CustomerId]=@CustomerId"></asp:SqlDataSource>
</asp:Content>


Код страницы (по умолчанию.aspx-файл.в CS)

using System;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace WebApplication1
{
    public partial class About : Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                if ((e.Row.RowState & DataControlRowState.Edit) > 0)
                {

                    DropDownList DDL2 = e.Row.FindControl("ddlModel") as DropDownList;       // 2nd ddl (Region)

                    Label LBL2 = e.Row.FindControl("Label1") as Label;       // label in "edit" mode on second ddl

                    DDL2.DataBind();
                    DDL2.SelectedValue = Convert.ToString(LBL2.Text);
                }
            }
        }
        protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
        {
            string strModel = ((DropDownList)((GridView)sender).Rows[e.RowIndex].FindControl("ddlModel")).SelectedValue;
            string strManufacturer = ((DropDownList)((GridView)sender).Rows[e.RowIndex].FindControl("ddlManufacturer")).SelectedItem.Value;
            e.NewValues[
            "Model"] = strModel;
            e.NewValues[
            "Manufacturer"] = strManufacturer;
            e.Cancel =
            false;
            GridView gv = (GridView)sender;
            for (int i = 0; i < gv.Columns.Count; i++)
            {
                DataControlFieldCell cell = gv.Rows[e.RowIndex].Cells[i] as DataControlFieldCell;
                gv.Columns[i].ExtractValuesFromCell(e.NewValues, cell,
                DataControlRowState.Edit, true);
            }
        }
    }
}


Maciej Los

+5 за ваши усилия.

[no name]

Спасибо за 5 звезд.
Пожалуйста, не стесняйтесь поделиться ответом со всеми, у кого есть такая же проблема.