我有一个下载列表,我从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天。
答案 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作为值,并在以后需要时查找关联的电子邮件地址。