0

国と都市のカスケード ドロップダウンに取り組んでいます。これは今のところ問題なく機能other cityしていますが、ユーザーが選択した国に関係なく、2 番目のドロップダウン (都市 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();
    }

上記のコードは、 Cascading ドロップダウンのこのチュートリアルに従っているサンプル コードです。

4

2 に答える 2

0

コードに触れずにこれを行うことができます..テーブル「都市」の新しい行に追加するだけです

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 で注文するときに常に最後にあることを確認するためのものです。

于 2013-09-02T13:04:21.777 に答える
0

戻り値として関数にリストとして渡さないのはなぜですか(リストを返すのは好きではありません)。このようにして、データベースの値を取得した後にリストに何が起こるかを制御できます。

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 : もう 1 つの優れたアプローチは、IEnumerable< CascadingDropDownNameValue> を返すことです。

    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 サーバーからそれ以上の行を取得することはありません。(一部の行キャッシング/ブロック読み取りを除く)

DataSet.Fillオブジェクトを返す前にすべての行を取得します。したがって、そのテーブルに +1m 行が含まれている場合。最初に 1m 行の DataTable を作成し、次にそれらをオブジェクトで返します。

接続文字列を渡す理由は、より多くの開いているレコードセットを許可するためです。(接続ごとに 1 つの開いているレコードセット)

この場合、cities.AddRangeはすべての行を繰り返します。トップ 10 のみを追加するには、次のようにします。

var cities = FetchCities(connectionString, knownCategoryValues, category).Take(10);
cities.AddRange(cities);

幸運を。

于 2013-09-02T13:04:56.797 に答える