ASP.NET C#:无法从SQL数据库预选中下拉列表值,报CS1001错误
解决CS1001错误并实现下拉列表预选中值的问题
Hey JohnV,刚入门编程遇到这种语法加逻辑的混合问题太正常了,我帮你一步步理清楚怎么解决:
首先搞定CS1001错误的直接原因
你代码里的sdr.["Preg_TestToday"]是语法错误!SqlDataReader访问字段的正确写法是sdr["字段名"],不需要加那个多余的点(.)。这个小失误导致编译器找不到预期的标识符,直接触发了CS1001错误。
然后修正逻辑上的坑
除了语法错误,你的代码还有几个逻辑问题,会导致即使语法对了,下拉列表也可能无法正确选中值:
- 你先设置
ddl.SelectedValue再调用DataBind(),但DataBind()会重新加载下拉列表的所有选项,直接覆盖之前的选中设置,顺序完全搞反了。 SqlDataReader是一次性向前读取的数据流,绑定数据源后就被消耗了,没法重复读取字段值;而且如果查询没返回数据,直接访问字段会抛出异常。- 你重复设置了两次
ddl.SelectedValue,这完全没必要。 - 下拉列表绑定数据源时,需要明确指定
DataTextField和DataValueField,否则没法正确映射选项的文本和值。
修正后的代码(优化版,避免重复查询)
我用DataTable存储查询结果,这样既可以绑定下拉列表,又能直接获取要选中的值,不用重复执行SQL:
protected void DetailsView1_DataBound(object sender, EventArgs e) { DataTable dt = new DataTable(); using (SqlConnection sqlconn = new SqlConnection(mainconn)) { sqlconn.Open(); SqlCommand sqlcomm = new SqlCommand(); string sqlquery = "SELECT distinct [EncounterID], pd.[MRN], [VisitDate], FirstName, LastName, DOB, Gender,[BMI_Category], [Asthma_IDDate], [Tobacco_Counsel], [EC_ImmediateType], [BCM_ImplantDisp], [BCM_CondomDisp], [BCM_IUDDisp], [BCM_DepoDisp], [BCM_NuvaRingDisp], [BCM_PatchDisp], [Preg_TestToday], [Preg_TestResults], [EC_AdvanceType], [EC_Immediate], [EC_Advance], [BCM_FemaleCondomDisp], [BCM_LatexDamDisp], [NoBCM_PartnerMethod], [NoBCM_SeekingPreg], [NoBCM_Abst], [NoBCM_Preg], [NoBCM_SameSex], [NoBCM_Undecided], [NoBCM_Refused], [NoBCM_LarcAppt], [NoBCM_Other], [NoBCM_OtherReason], [NoBCM_AlreadyUsing], [BCMAlready_Patch], [BCMAlready_Depo], [BCMAlready_Condom], [BCMAlready_Implant], [BCMAlready_IUD], [BCMAlready_FemaleCondom], [BCMAlready_ECOnly] FROM [OSCRMedicalData] md INNER JOIN OSCRPersonData pd on md.MRN=pd.MRN WHERE ([EncounterID] = @EncounterID)"; sqlcomm.CommandText = sqlquery; sqlcomm.Connection = sqlconn; sqlcomm.Parameters.AddWithValue("@EncounterId", Txtsearch.Text); // 用DataAdapter把数据读到DataTable里 SqlDataAdapter sda = new SqlDataAdapter(sqlcomm); sda.Fill(dt); DropDownList ddl = (DropDownList)DetailsView1.FindControl("Preg_TestToday"); if (ddl != null && dt.Rows.Count > 0) { // 先绑定下拉列表的数据源,指定文本和值字段 ddl.DataSource = dt; ddl.DataTextField = "Preg_TestToday"; // 下拉列表显示的文本 ddl.DataValueField = "Preg_TestToday"; // 下拉列表选项的值 ddl.DataBind(); // 从DataTable获取要选中的值 string selectedValue = dt.Rows[0]["Preg_TestToday"].ToString(); // 先检查下拉列表是否包含这个值,避免找不到抛出异常 if (ddl.Items.FindByValue(selectedValue) != null) { ddl.SelectedValue = selectedValue; } } } }
关键修正点说明
- 去掉了
sdr.["Preg_TestToday"]里多余的点,彻底解决CS1001语法错误。 - 调整了顺序:先绑定数据源,再设置选中值,确保绑定后的选项不会覆盖选中设置。
- 用
DataTable存储数据,避免重复执行SQL查询,同时解决了SqlDataReader只能读取一次的问题。 - 添加了
DataTextField和DataValueField的设置,确保下拉列表正确加载选项。 - 增加了
dt.Rows.Count > 0和ddl.Items.FindByValue(selectedValue) != null的判断,避免空数据或不存在的选项导致异常。
内容的提问来源于stack exchange,提问作者JohnV
相关产品推荐
相关产品推荐

