如何向列表数组添加值
本文关键字:添加 数组 列表 | 更新日期: 2023-09-27 18:29:50
我正在为国家和城市创建级联下拉列表,目前运行良好,但无论用户选择哪个国家/地区,我都需要将other city
作为最后一个值添加到第二个下拉列表(城市DD)中。我无法使它像正常的添加操作一样工作到列表中。
public CascadingDropDownNameValue[] FetchCities(string knownCategoryValues, string category)
{
string CountryCode;
StringDictionary strCountries = AjaxControlToolkit.CascadingDropDown.ParseKnownCategoryValuesString(knownCategoryValues);
CountryCode = strCountries["Country"].ToString();
con.Open();
SqlCommand cmd = new SqlCommand("select * from Cities where Country=@Code Order by CityName ", con);
cmd.Parameters.AddWithValue("@Code", CountryCode);
cmd.ExecuteNonQuery();
SqlDataAdapter dastate = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
dastate.Fill(ds);
con.Close();
List<CascadingDropDownNameValue> states = new List<CascadingDropDownNameValue>();
foreach (DataRow dtRow in ds.Tables[0].Rows)
{
string StateID = dtRow["CityID"].ToString();
string StateName = dtRow["CityName"].ToString();
states.Add(new CascadingDropDownNameValue(StateName, StateID));
}
return states.ToArray();
}
上面的代码是一个示例代码,我正在学习级联下拉的教程
为什么不把它作为列表传递给函数(我不喜欢返回列表)作为返回值。通过这种方式,您可以控制在获取数据库值后列表会发生什么。
public void Fill()
{
List<CascadingDropDownNameValue> cities = new List<CascadingDropDownNameValue>();
FetchCities(cities, knownCategoryValues, category);
cities.Add(new CascadingDropDownNameValue("new city", "0"));
}
public void FetchCities(List<CascadingDropDownNameValue> values, string knownCategoryValues, string category)
{
string CountryCode;
StringDictionary strCountries = AjaxControlToolkit.CascadingDropDown.ParseKnownCategoryValuesString(knownCategoryValues);
CountryCode = strCountries["Country"].ToString();
con.Open();
SqlCommand cmd = new SqlCommand("select * from Cities where Country=@Code Order by CityName ", con);
cmd.Parameters.AddWithValue("@Code", CountryCode);
cmd.ExecuteNonQuery();
SqlDataAdapter dastate = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
dastate.Fill(ds);
con.Close();
List<CascadingDropDownNameValue> states = new List<CascadingDropDownNameValue>();
foreach (DataRow dtRow in ds.Tables[0].Rows)
{
string StateID = dtRow["CityID"].ToString();
string StateName = dtRow["CityName"].ToString();
values.Add(new CascadingDropDownNameValue(StateName, StateID));
}
}
UPDATE:另一个不错的方法是返回IEnumerable<级联DropDownNameValue>
public void Fill()
{
List<CascadingDropDownNameValue> cities = new List<CascadingDropDownNameValue>();
cities.AddRange(FetchCities(connectionString, knownCategoryValues, category));
cities.Add(new CascadingDropDownNameValue("new city", "0"));
}
public IEnumerable<CascadingDropDownNameValue> FetchCities(string connectionString, string knownCategoryValues, string category)
{
StringDictionary strCountries = AjaxControlToolkit.CascadingDropDown.ParseKnownCategoryValuesString(knownCategoryValues);
string CountryCode = strCountries["Country"].ToString();
using (SqlConnection con = new SqlConnection(connectionString))
using (SqlCommand cmd = new SqlCommand("select * from Cities where Country=@Code Order by CityName ", con))
{
cmd.Parameters.Add("@Code", SqlDbType.VarChar).Value = CountryCode;
using (SqlDataReader reader = cmd.ExecuteReader())
while (reader.Read())
{
string StateID = reader["CityID"].ToString();
string StateName = reader["CityName"].ToString();
yield return new CascadingDropDownNameValue(StateName, StateID);
}
}
}
其优点是,它将流式传输行,并在需要时将它们转换为对象。如果你只想进入前10名,这将带来优势。它不会从sql server获得更多的行。(除了一些行缓存/块读取)
DataSet.Fill
将在返回对象之前获取所有行。因此,如果该表包含+1m行。它将首先创建一个包含1m行的DataTable,然后在对象中返回它们。
我将连接字符串传递给它的原因是为了允许更多打开的记录集。(每个连接一个打开的记录集)
在这种情况下,cities.AddRange
将迭代所有行。只添加前10名将是:
var cities = FetchCities(connectionString, knownCategoryValues, category).Take(10);
cities.AddRange(cities);
祝你好运。
您可以在不接触代码的情况下完成此操作。。只需在表中添加"城市"新行
Country = "xxx"
CityName = "ZZZ: other country"
然后更新您的SQL:
SqlCommand cmd = new SqlCommand("select * from Cities where Country=@Code OR Country='xxx' Order by CityName ", con);
开始时的ZZZ
只是为了确保当CityName