2016-08-02 55 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

相關問題