【问题标题】:Why does this method not add items to a dropdownlist?为什么此方法不将项目添加到下拉列表?
【发布时间】:2016-08-02 19:29:30
【问题描述】:

我正在尝试将数据库中的项目添加到列表中,而不是从 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>

【问题讨论】:

  • 这是概念证明吗?还是“真实”的代码?如果是后者,请阅读hanselman.com/blog/…
  • 代码的结构方式最好先完全从 db 上下文具体化列表,而不是始终引用 DbSet。
  • 它的“真实代码”我不确定你的意思......
  • 我该怎么做呢?我对 Linq to SQL 很陌生
  • 如果你不知道我所说的“真实代码”是什么意思,那么请阅读这篇文章并重构你的代码。 gui 层不应该知道您选择的 dataAccess 工具。

标签: c# sql asp.net visual-studio linq


【解决方案1】:

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

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

【讨论】:

  • 谢谢,有时这是我忽略的最简单的事情。
【解决方案2】:
  1. 始终将您的DbContext 创建包装在using 语句中,或者如果它的作用域在类级别,则将其丢弃在您的包含类中。你的范围在方法中,你的代码在没有处理它的情况下放弃它(不好的做法!)
  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}));
    }
}

【讨论】:

  • 感谢您的建议。我对 Linq to SQL 很陌生;我为什么要处理 dbcontext?我还应该处理哪些其他物品?我会尝试添加您的建议。
  • @Darokrithia - 任何实现接口 System.IDisposable 的东西。这些通常是使用外部资源的类型,例如数据库连接或文件流或网络流等。如果您在完成它们后不调用Dispose,那么您可能会在垃圾回收发生之前保持资源打开(也许,可能是升级到 gen2)。 using 语句确保在离开块的范围时调用 Dispose(您只能将 using 与一次性类型一起使用)。在您的情况下,您将使数据库连接保持打开状态。
【解决方案3】:

天哪,这是非常糟糕的做法。每次进入循环时都会调用数据库。

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

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

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

  }

【讨论】:

    猜你喜欢
    • 2010-11-09
    • 1970-01-01
    • 2015-06-24
    • 1970-01-01
    • 1970-01-01
    • 2010-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多