Как заполнить выпадающий список, содержащийся в 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
Большое спасибо. Совет приветствуется.