存储SQL查询结果以填充formview中的dropdownlist

时间:2013-09-30 17:21:44

标签: c# caching drop-down-menu webforms formview

我有dropdownlist个zipcodes。

这是一个非常大的列表,从数据库加载需要很长时间。所以,首先我在寻找最佳解决方案,以便在首次加载网站时尝试缓存或保存这些数据,以便我可以在需要时使用它。我尝试了一个列表和字典,然后在代码中设置了datasource,但它不允许我设置所选的值。

它一直告诉我它无法绑定到没有datasource的控件。为了使事情变得更加困难,dropdownlist位于formview内。

我只是不确定最好的办法。我在datasource创建的方法中设置了formview和值,但我选择的值来自formview datasource

 private Dictionary<int, string> CreateZipcodeList()
{
    string connStr = ConfigurationManager.ConnectionStrings["KlamathAlgaeEntityDevConnectionString"].ConnectionString;
    SqlConnection conn = new SqlConnection(connStr);
    Dictionary<int,string> ziplist = new Dictionary<int,string>();

    //Create CoreEntity Record
    SqlCommand cmd1 = new SqlCommand(@"select zipcode.ZipCodeId, zipcode.zip + ', ' + city.name + ', ' + ISNULL(GeographicState.name,'') + ', ' + Country.name as zipstring
                                    from zipcode left outer join City on ZipCode.CityId = city.CityId
                                    left outer join GeographicState on ZipCode.GeographicStateId = GeographicState.GeographicStateId
                                    left outer join Country on ZipCode.CountryId = Country.CountryId
                                    order by country.name, GeographicState.name, city.name",
                                    conn);

    try
    {
        conn.Open();

        SqlDataReader reader = cmd1.ExecuteReader(CommandBehavior.CloseConnection);
        while (reader.Read())
        {
            if (!reader.IsDBNull(0))
            {
                ziplist.Add(reader.GetInt32(0), reader["zipstring"].ToString());
            }
        }
    }

    finally
    {
        if (conn != null)
        {
            conn.Close();
        }
    }
    return ziplist;
}

protected void AddressForm_ItemCreated(Object sender, EventArgs e)
{


         ((DropDownList)AddressForm.FindControl("Zipcodeddl")).DataSource = CreateZipcodeList();
        ((DropDownList)AddressForm.FindControl("Zipcodeddl")).DataTextField = "Value";
        ((DropDownList)AddressForm.FindControl("Zipcodeddl")).DataValueField = "Key";
        ((DropDownList)AddressForm.FindControl("Zipcodeddl")).DataBind();
        //((DropDownList)AddressForm.FindControl("Zipcodeddl")).SelectedValue = Eval("zipcodeid").ToString();
}

这会填充下拉列表,但是当我尝试设置所选值时,它表示控件不是数据绑定。这也不会将字典存储在任何地方,因此我需要在需要时调用该函数来加载字典。

1 个答案:

答案 0 :(得分:0)

好的,下拉的记录太多了。为什么不允许用户输入5个数字字符,然后按数字搜索数据库。我想不出任何理由你必须将整个邮政编码列表放在下拉列表中,因为没有人会手动点击以找到他们想要的那个。我不认为它服务于一个有用的目的,但如果有一个让我知道,我会试着找出一个解决方案。

这就是邮局如何做到的。

更新

为了完成这项工作,您将拥有一个TextBox,用户可以在其中输入他们认为的邮政编码。给他们一个按钮,点击搜索该邮政编码。

对数据库执行sql查询,查找Zipcode.Zip,如果找到,请返回所需的所有数据。

如果找不到我要做的就是开始删除最后一个字符并使用修改后的查询进行另一次搜索,使用“Zipcode.Zip like'%modifiedZipCode%',然后返回最近的10个左右选项,然后放入那些在下拉菜单中。

如果您删除了一位数字且数据库找不到它,您可以根据需要删除字符,然后重新运行查询,直到您获得所需的10条或多条记录。在某些时候删除数字将变得毫无意义,因为用户显然输入了错误的邮政编码。