当datavaluefield和datatextfield相同时,dropdownlist表现不正常

时间:2011-03-24 07:55:02

标签: asp.net drop-down-menu

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

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

示例1.(下拉列表适用于此示例)

 
Product               Email 
iPad                  prashanth364@gmail.com
iPhone 3G             prashanth364@yahoo.co.in
iPhone4               prashanth364@in.com

示例2.(在下面的示例中,无论我选择什么(iPad或iPhone 3G或iPhone4)在帖子后面,下拉选择的值将是iPad)

 
Product               Email 
iPad                  prashanth364@gmail.com
iPhone 3G             prashanth364@gmail.com
iPhone4               prashanth364@gmail.com

示例3.(在下面的示例中,当我选择iPad时,下拉列表工作正常,但当我在帖子后面选择iPhone 3G或iPhone4时,下拉选择的值将是iPhone 3G。基本上,在这里选择iPhone4,在回发后它显示iPhone 3G)

 
Product               Email 
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天。

1 个答案:

答案 0 :(得分:1)

我认为ASP.NET假设下拉列表中的值将是唯一的。通常,值用于存储类似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作为值,并在以后需要时查找关联的电子邮件地址。