Mohd.Mekki Ответов: 1

Как заполнить выпадающий список, содержащийся в gridview, значениями, отличающимися в каждой строке


Пожалуйста, помогите мне решить эту проблему:
У меня есть выпадающий список, его элементы-это названия стран. Я хотел бы добавить выбранный элемент выпадающего списка в GridView после нажатия кнопки CommandButton. GridView состоит из двух столбцов: BoundField Country и DropDownList TemplateField City, чтобы показать, что города принадлежат выбранной стране.
Моя проблема заключается в том, что при вставке новой строки поле шаблона DropDownList во всех строках обновляется до значений DropDownList в последней вставленной строке.

То, что я хочу, это при выборе Индии и представить список городов должен содержать (Дели, Ахмад Абад, ...)
То,что я хочу, это при выборе ОАЭ и представить список городов, которые должны содержать (Абу-Даби, Дубай, ...)
и первый ряд не должен быть затронут.

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

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="DropDownListInGridView.WebForm1" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Label runat="server">Country</asp:Label>
        <asp:DropDownList runat="server" ID="ddlCounty" Width = "200px" 

            AutoPostBack="True">
        </asp:DropDownList>
         
        <asp:Button ID="btnAppend" runat="server" Text="Append" Width = "100px" 

            onclick="btnAppend_Click" />
    </div>

    <br />
    <div>
        <asp:GridView ID="gvDetails" runat="server" AutoGenerateColumns="False" 

            Width = "300px" onrowdatabound="gvDetails_RowDataBound" >
            <Columns>
                <asp:BoundField DataField="CountryName" HeaderText="Country" />
                <asp:TemplateField HeaderText="City">
                    <ItemTemplate>
                        <asp:DropDownList ID="ddlCity" runat="server" Width = "98%">
                        </asp:DropDownList>
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>
        </asp:GridView>
    </div>
    </form>
</body>
</html>


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

namespace DropDownListInGridView
{
    public partial class WebForm1 : System.Web.UI.Page
    {
        static string Con = ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString;
        SqlConnection sqlCon = new SqlConnection(Con);
        SqlCommand cmd;
        SqlDataAdapter da;
        DataTable dt;
        static DataTable dtGrid = new DataTable();

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                cmd = new SqlCommand();
                cmd.Connection = sqlCon;
                cmd.CommandType = CommandType.Text;
                cmd.CommandText = "SELECT * FROM tlkCountry";
                try
                {
                    dt = new DataTable();
                    sqlCon.Open();
                    da = new SqlDataAdapter(cmd);
                    da.Fill(dt);
                    sqlCon.Close();
                    ddlCounty.DataSource = dt;
                    ddlCounty.DataTextField = "CountryName";
                    ddlCounty.DataValueField = "CountryID";
                    ddlCounty.DataBind();

                    dtGrid.Columns.Add("CountryName");
                }
                catch (Exception ex)
                {
                    
                }
            }
            
        }

        protected void btnAppend_Click(object sender, EventArgs e)
        {
            int i;
            dtGrid.Rows.Add();
            i = dtGrid.Rows.Count - 1;
            dtGrid.Rows[i]["CountryName"] = ddlCounty.SelectedItem.Text;

            gvDetails.DataSource = dtGrid;
            gvDetails.DataBind();            
        }

        protected void GetCitiesList(DropDownList ddl)
        {
            cmd = new SqlCommand();
            cmd.Connection = sqlCon;
            cmd.CommandType = CommandType.Text;
            cmd.CommandText = "SELECT CityID, CityName FROM tlkCity WHERE CountryID = " +ddlCounty.SelectedValue;
            try
            {
                dt = new DataTable();
                sqlCon.Open();
                da = new SqlDataAdapter(cmd);
                da.Fill(dt);
                sqlCon.Close();
                string s = dt.Rows.Count.ToString();
                ddl.DataSource = dt;
                ddl.DataTextField = "CityName";
                ddl.DataValueField = "CityID";
                ddl.DataBind();
            }
            catch (Exception ex)
            {
            }
        }

        protected void gvDetails_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                DropDownList[] _ddl= new DropDownList[10];
                _ddl[e.Row.RowIndex]= e.Row.FindControl("ddlCity") as DropDownList;
                GetCitiesList(_ddl[e.Row.RowIndex]);
            }
        }
    }
}


CREATE TABLE [dbo].[tlkCountry](
	[CountryID] [int] IDENTITY(1,1) NOT NULL,
	[CountryName] [nvarchar](50) NULL
)

CREATE TABLE [dbo].[tlkCity](
	[CityID] [int] IDENTITY(1,1) NOT NULL,
	[CountryID] [int] NULL,
	[CityName] [nvarchar](50) NULL
) 

Richard Deeming

cmd.CommandText = "SELECT CityID, CityName FROM tlkCity WHERE CountryID = " +ddlCounty.SelectedValue;

Не делай этого так!

В то время как в данном конкретном случае вероятно, вы в безопасности, так как использование конкатенации строк для построения SQL-запросов может привести и приведет к SQL-инъекция[^] факторы уязвимости.

ВСЕГДА используйте параметризованный запрос.
cmd.CommandText = "SELECT CityID, CityName FROM tlkCity WHERE CountryID = @CountryID";
cmd.Parameters.AddWithValue("@CountryID", ddlCounty.SelectedValue);

Mohd.Mekki

Большое спасибо. Совет приветствуется.

1 Ответов

Рейтинг:
9