【问题标题】:dropdownlist not behaving properly when datavaluefield and datatextfield are same当 datavaluefield 和 datatextfield 相同时,下拉列表行为不正确
【发布时间】:2011-03-24 07:55:02
【问题描述】:

我有一个下拉列表,我正在从 Excel 加载数据。 Excel 有 2 列产品和电子邮件。 Product 列中的数据绑定到 DataTextField,Email 列绑定到 DataValueField。 当不同产品的电子邮件不同但当电子邮件对不同产品具有相同值时,下拉菜单工作正常,然后无论我选择什么,在回发时,所选值都会更改为相同电子邮件值的第一项。

以下是 Excel 中的示例数据,用于显示下拉菜单的行为

示例 1。(此示例的下拉菜单效果很好)

产品电子邮件 iPad prashanth364@gmail.com iPhone 3G prashanth364@yahoo.co.in iPhone4 prashanth364@in.com

示例 2。(在下面的示例中,无论我在回发时选择什么(iPad 或 iPhone 3G 或 iPhone4),下拉选择的值都是 iPad)

产品电子邮件 iPad prashanth364@gmail.com iPhone 3G prashanth364@gmail.com iPhone4 prashanth364@gmail.com

示例 3。(在下面的示例中,当我选择 iPad 时,下拉菜单工作正常,但是当我在回发时选择 iPhone 3G 或 iPhone4 时,下拉选择的值将是 iPhone 3G。基本上,在此处选择 iPhone4 时,在回发时它显示的是 iPhone 3G)

产品电子邮件 iPad prashanth364@yahoo.co.in iPhone 3G prashanth364@gmail.com iPhone4 prashanth364@gmail.com

下面是我将数据从 excel 加载到下拉列表的功能

private void ExtractFromExcelInitial()
{

    // Put user code to initialize the page here
    // Create connection string variable. Modify the "Data Source"
    // parameter as appropriate for your environment.
    string ExcelFilePath = Server.MapPath("~/ProductExcel") + "\\ProductEmail.xls";
    String sConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" +
    "Data Source=" + ExcelFilePath + ";" +
    "Extended Properties=Excel 8.0;";

    // Create connection object by using the preceding connection string.
    OleDbConnection objConn = new OleDbConnection(sConnectionString);

    // Open connection with the database.
    objConn.Open();

    // The code to follow uses a SQL SELECT command to display the data from the worksheet.

    // Create new OleDbCommand to return data from worksheet.
    OleDbCommand objCmdSelect = new OleDbCommand("SELECT * FROM [Sheet1$]", objConn);


    // Create new OleDbDataAdapter that is used to build a DataSet
    // based on the preceding SQL SELECT statement.
    OleDbDataAdapter objAdapter1 = new OleDbDataAdapter();

    // Pass the Select command to the adapter.
    objAdapter1.SelectCommand = objCmdSelect;

    // Create new DataSet to hold information from the worksheet.
    DataSet objDataset1 = new DataSet();

    // Fill the DataSet with the information from the worksheet.
    objAdapter1.Fill(objDataset1, "XLData");


    ddlProduct.DataTextField = "Product";
    ddlProduct.DataValueField = "Emailid";
    ddlProduct.DataSource = objDataset1.Tables[0];

    ddlProduct.DataBind();
    ddlProduct.Items.Insert(0, new ListItem("Select Product", "0"));

    // Bind data to DataGrid control.
    ////DataGrid1.DataSource = objDataset1.Tables[0].DefaultView;
    ////DataGrid1.DataBind();

    // Clean up objects.
    objConn.Close();

}

请帮我解决这个问题,因为过去 3 天我一直坚持这个问题。

【问题讨论】:

    标签: asp.net drop-down-menu


    【解决方案1】:

    我认为 ASP.NET 假设下拉列表中的值是唯一的。通常 Values 用于存储 ID 之类的内容,因此您不必解析更具描述性的 Text 属性。

    当您进行回发时,ASP.NET 从您的页面获取的只是普通的 HTML 表单发布数据,以及一些 ControlState 和 ViewState(如果已启用)。表单发布数据将包含下拉列表的名称/ID,以及当前选择的值。 ControlState/ViewState 可能会在您的下拉列表中包含完整的文本/值对列表,因此可以在回发时自动重新填充控件,而无需担心。

    我猜在回发期间 ASP.NET 只是设置下拉列表的 SelectedValue 属性;因为你有非唯一的值,它只是默认选择第一个。

    基本上,您需要使下拉列表值独一无二。在进行初始数据绑定时,您可以选择复合值。查看您当前的实现,绑定到 DataSet,这可能有点痛苦。如果不是绑定到 DataSet,而是绑定到对象列表,那可能会更容易。所以也许是这样的:

    internal class Product
    {
       public int Id { get; set; }
       public string Email { get; set; }
       public string ProductName { get; set; }
       public string CompositeId
       {
          get
          {
             return String.Format("{0}|{1}", this.Id, this.Email);
          }
       }
    }
    
    // in the data-binding
    List<Product> products = GetProductsFromDataSet(objDataset1);
    ddlProduct.DataTextField = "ProductName";
    ddlProduct.DataValueField = "CompositeId";
    ddlProduct.DataSource = products;
    ddlProduct.DataBind();
    

    或者不要使用复合 ID,只需使用数字 ID 作为值,并在以后需要时查找关联的电子邮件地址。

    【讨论】:

    • 非常感谢克拉克。我使用数字 ID 作为值,并在需要时根据该值获取 emailId。成功了!!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-28
    • 1970-01-01
    • 1970-01-01
    • 2018-01-15
    • 1970-01-01
    • 2010-09-29
    • 1970-01-01
    相关资源
    最近更新 更多