2016-08-02 53 views
-1

我想将数据库中的项目添加到列表中,而不是从aspx静态添加项目。我做了这个方法,虽然它编译了,但它不会将任何列表项添加到我的下拉列表中。这里有一些代码,如果需要,我愿意提供更多。有问题的方法是addListItemsToPage()。为什么此方法不会将项目添加到下拉列表中?

C#

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 

namespace EndophthalmitisDatabase { 
    public partial class DataEntry : System.Web.UI.Page { 
     protected void Page_Load(object sender, EventArgs e) { 
      addListItemsToPage(); 
     } 

     protected void addListItemsToPage() { 
      EndophthalmitisDBDataContext dbContext = new EndophthalmitisDBDataContext(); 

      for (int i=0; dbContext.Hospital_Datas.Count() < i; i++){ 
       int id = dbContext.Hospital_Datas.ElementAt(i).HospitalID; 
       string str = dbContext.Hospital_Datas.ElementAt(i).Hospital_Name; 

       ListItem li = new ListItem(); 
       li.Text = str; 
       li.Value = id.ToString(); 

       hospitalDDL.Items.Add(li); 
      } 

     } 

     protected void submitEndoDataBtn_Click(object sender, EventArgs e) 
     { 
      using (EndophthalmitisDBDataContext dbContext = new EndophthalmitisDBDataContext()) { 
       Occurrence_Data occData = new Occurrence_Data 
       { 
        LastName = lastNameTB.Text, 
        FirstName = firstNameTB.Text, 
        MRN = int.Parse(mrnTB.Text), 
        DateOfOccurence = DateOfOccurenceCal.SelectedDate, 
        InterventionProcedureDone = int.Parse(InterventionDDL.SelectedValue), 
        PreOccurrencePhysician = int.Parse(InterventionSurgeonDDL.SelectedValue), 
        LabsSent = labsSentCB.Checked, 
        PrecipitatingCausePreviousSurgery = int.Parse(preCauseDDL.SelectedValue), 
        PostOccurrencePhysician = int.Parse(preSurgeonDDL.SelectedValue), 
        DateOfPreviousSurgery = datePrecipitatingCal.SelectedDate, 
        Hospital = int.Parse(hospitalDDL.SelectedValue), 
        AdditionalInformation = moreInfoTB.Text 
       }; 

       lastNameTB.Text = ""; 
       firstNameTB.Text = ""; 
       mrnTB.Text = ""; 
       labsSentCB.Checked = false; 
       moreInfoTB.Text = ""; 

       dbContext.Occurrence_Datas.InsertOnSubmit(occData); 
       dbContext.SubmitChanges(); 
      } 
     } 
    } 
} 

ASPX

<%@ Page Title="" Language="C#" MasterPageFile="~/MainSite.Master" AutoEventWireup="true" CodeBehind="DataEntry.aspx.cs" Inherits="EndophthalmitisDatabase.DataEntry" %> 
<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server"> 
</asp:Content> 

<asp:Content ID="Content2" ContentPlaceHolderID="mainContent" runat="server"> 
    <div class="formBox"> 
     <p style="text-align: center">Please use the area below to enter Data.</p> 
     <div class = "dataEntryForm"> 
      <form id = "occurrenceForm" runat = "server"> 
       <div class ="dataRow"> 
        <div class ="dataRowText">Last Name</div> 
        <div class ="dataRowEntrance"> 
         <asp:TextBox ID = "lastNameTB" runat = "server"></asp:TextBox> 
        </div> 
       </div> 
       <div class ="dataRow"> 
        <div class ="dataRowText">Last Name</div> 
        <div class ="dataRowEntrance"> 
         <asp:TextBox ID = "firstNameTB" runat = "server"></asp:TextBox> 
        </div> 
       </div> 
       <div class ="dataRow"> 
        <div class ="dataRowText">MRN</div> 
        <div class ="dataRowEntrance"> 
         <asp:TextBox ID = "mrnTB" runat = "server"></asp:TextBox> 
        </div> 
       </div> 
       <div class ="dataRow"> 
        <div class ="dataRowText">Date of Occurence</div> 
        <div class ="dataRowEntrance"> 
         <asp:Calendar ID="DateOfOccurenceCal" runat="server"></asp:Calendar> 
        </div> 
       </div> 
       <div class ="dataRow"> 
        <div class ="dataRowText">Intervention</div> 
        <div class ="dataRowEntrance"> 
         <asp:DropDownList ID="InterventionDDL" runat="server"> 
          <asp:ListItem Value ="1">Phaco</asp:ListItem> 
          <asp:ListItem Value ="2">Injection</asp:ListItem> 
          <asp:ListItem Value ="3">Retina Surgery</asp:ListItem> 
          <asp:ListItem Value ="4">Transplant</asp:ListItem> 
          <asp:ListItem Value ="5">Other</asp:ListItem> 
         </asp:DropDownList> 
        </div> 
       </div> 
       <div class ="dataRow"> 
        <div class ="dataRowText">Intervention Surgeon</div> 
        <div class ="dataRowEntrance"> 
         <asp:DropDownList ID="InterventionSurgeonDDL" runat="server"> 
          <asp:ListItem Value ="8">Tabin</asp:ListItem> 
          <asp:ListItem Value ="9">Crandal</asp:ListItem> 
         </asp:DropDownList> 
        </div> 
       </div> 
       <div class ="dataRow"> 
        <div class ="dataRowText">Labs sent</div> 
        <div class ="dataRowEntrance"> 
         <asp:CheckBox ID="labsSentCB" runat="server" /> 
        </div> 
       </div> 
       <div class ="dataRow"> 
        <div class ="dataRowText">Precipitating Cause</div> 
        <div class ="dataRowEntrance"> 
         <asp:DropDownList ID="preCauseDDL" runat="server"> 
          <asp:ListItem Value ="1">Phaco</asp:ListItem> 
          <asp:ListItem Value ="2">Injection</asp:ListItem> 
          <asp:ListItem Value ="3">Retina Surgery</asp:ListItem> 
          <asp:ListItem Value ="4">Transplant</asp:ListItem> 
          <asp:ListItem Value ="5">Other</asp:ListItem> 
         </asp:DropDownList> 
        </div> 
       </div> 
       <div class ="dataRow"> 
        <div class ="dataRowText">Precipitating Surgeon</div> 
        <div class ="dataRowEntrance"> 
         <asp:DropDownList ID="preSurgeonDDL" runat="server"> 
          <asp:ListItem Value ="8">Tabin</asp:ListItem> 
          <asp:ListItem Value ="9">Crandal</asp:ListItem> 
         </asp:DropDownList> 
        </div> 
       </div> 
       <div class ="dataRow"> 
        <div class ="dataRowText">Data of Precipitating Cause</div> 
        <div class ="dataRowEntrance"> 
         <asp:Calendar ID ="datePrecipitatingCal" runat="server"></asp:Calendar> 
        </div> 
       </div> 
       <div class ="dataRow"> 
        <div class ="dataRowText">Hospital</div> 
        <div class ="dataRowEntrance"> 
         <asp:DropDownList ID ="hospitalDDL" runat="server"> 
         </asp:DropDownList> 
        </div> 
       </div> 
       <div class ="dataRow"> 
        <div class ="dataRowText">Additional Information</div> 
        <div class ="dataRowEntrance"> 
         <asp:TextBox ID ="moreInfoTB" runat="server" Rows ="100"></asp:TextBox> 
        </div> 
       </div> 
       <div class ="dataRow"> 
        <div class ="dataRowText"> 
         <asp:Button ID ="submitEndoDataBtn" runat="server" Text="Submit" OnClick ="submitEndoDataBtn_Click"/> 
        </div> 
       </div> 
      </form> 
     </div> 
    </div> 
</asp:Content> 
+0

这是概念证明?或“真实”的代码?如果是后者,请阅读http://www.hanselman.com/blog/AReminderOnThreeMultiTierLayerArchitectureDesignBroughtToYouByMyLateNightFrustrations.aspx – granadaCoder

+0

您的代码结构的方式,最好从db上下文中完全实现列表,而不是始终引用DbSet。 – Igor

+0

它的“真实代码”林不知道你的意思是... – Darokrithia

回答

5

for循环条件是错误的,它需要是相反

for (int i=0; i < dbContext.Hospital_Datas.Count(); i++) 
+0

谢谢,有时它是我忽略的最简单的东西。 – Darokrithia

+1

没问题,它发生了:) – Mostafiz

1

OMG,这是非常糟糕的p ractice。每次进入循环时都会打电话给数据库。

protected void addListItemsToPage() { 
    EndophthalmitisDBDataContext dbContext = new EndophthalmitisDBDataContext(); 

    hospitalDDL.DataTextField = "Hospital_Name"; 
    hospitalDDL.DataValueField = "HospitalID" 

    hospitalDDL.DataSource = dbContext.Hospital_Datas.ToList(); 
    hospitalDDL.DataBind(); 

    } 
3
  1. 始终包您DbContext建立在using陈述或如果在类级别作用域在包含类的处置。你的方法的范围和你的代码abondons没有处置它(不良做法!)
  2. 您的for声明是错误的,但你真的不需要for,你可以使用foreach这将更容易阅读或使用Ashkan建议的数据绑定。
  3. 您也可以将其缩减为单个语句,请参阅代码中以下注释中的OR。这使用Lambda语句。

代码:

protected void addListItemsToPage() { 
    // wrap this in a using statement so the connection is closed and disposed 
    using(EndophthalmitisDBDataContext dbContext = new EndophthalmitisDBDataContext()) 
    { 
     // replaced your wrong for statement with a foreach because you do not need a for statement (you are not using the indexer in a way that added any benifit) 
     foreach(var hospital in dbContext.Hospital_Datas) 
      ListItem li = new ListItem(); 
      li.Text = hospital.Hospital_Name; 
      li.Value = hospital.HospitalID; 

      hospitalDDL.Items.Add(li); 
     } 


     // OR you could write it as a single statement 
     hospitalDDL.AddRange(dbContext.Hospital_Datas.Select(hospital => new ListItem(){Text = hospital.Hospital_Name, Value = hospital.HospitalID})); 
    } 
} 
+0

谢谢你的建议。我对Linq to SQL很新,为什么我应该处理dbcontext?我应该处理哪些其他物体?我会尝试添加你建议的内容。 – Darokrithia

+1

@Darokrithia - 任何实现了接口'System.IDisposable'的东西。这些通常是使用外部资源(如数据库连接或文件流或网络流等)的类型。如果在完成这些操作时不调用Dispose,则可能会使资源保持打开状态,直到发生垃圾回收为止(也许可能是晋升为gen2)。使用语句确保当块的范围被保留时,调用Dispose(您只能使用与一次性类型一起使用)。在你的情况下,你会打开数据库连接。 – Igor

相关问题