【问题标题】:Drop Down list null value not working for selected text c#?下拉列表空值不适用于选定的文本c#?
【发布时间】:2011-02-11 01:50:08
【问题描述】:

基本上,我有一个下拉列表,其中填充了文本和值,具体取决于单选按钮列表的选定索引。代码如下:

protected void RBLGender_SelectedIndexChanged(object sender, EventArgs e)
    {
        DDLTrous.Items.Clear();
        DDLShoes.Items.Clear();
        if (RBLGender.SelectedValue.Equals("Male"))
        {

            String[] MaleTrouserText = {"[N/A]", "28\"", "30\"", "32\"", "34\"", "36\"", "38\"", "40\"", "42\"", "44\"", "48\""};
            String[] MaleTrouserValue = { null, "28\"", "30\"", "32\"", "34\"", "36\"", "38\"", "40\"", "42\"", "44\"", "48\"" };
            String[] MaleShoeText = { "[N/A]", "38M", "39M", "40M", "41M", "42M", "43M", "44M", "45M", "46M", "47M" };
            String[] MaleShoeValue = { null, "38M", "39M", "40M", "41M", "42M", "43M", "44M", "45M", "46M", "47M" };
            for (int i = 0; i < MaleTrouserText.Length; i++)
            {
                ListItem MaleList = new ListItem(MaleTrouserText[i], MaleTrouserValue[i]);
                DDLTrous.Items.Add(MaleList);

            }
            for (int i = 0; i < MaleShoeText.Length; i++)
            {
                ListItem MaleShoeList = new ListItem(MaleShoeText[i], MaleShoeValue[i]);
                DDLShoes.Items.Add(MaleShoeList);

            }

        }

            else if (RBLGender.SelectedValue.Equals("Female"))`

选择文本'[n / a]'时,我希望将空值插入数据库中。 At present when '[N/A]' is selected the value entered into the database is [N/A] does anyone know why?

这是我的数据库插入代码:

protected void UpdateWorkWear()
    {



        try
        {

            string connectionString = Common.GetConnectionString("w34to4tmConnectionString");

            SqlConnection conn = new SqlConnection(connectionString);

            StringBuilder sbSQL = new StringBuilder();


            string str = DDLSurname.SelectedValue;

            if (str.Contains("'"))
            {
                str = str.Replace("'", " ");

            }

            sbSQL.Append("IF EXISTS (select * from TO4_WORKWEAR_DISTRIBUTION where EmpID = @EmpID)");
            sbSQL.Append(" UPDATE TO4_WORKWEAR_DISTRIBUTION SET ");
            sbSQL.Append("costCentre = coalesce(@Cost_Centre, CostCentre), EmployeeType = coalesce(@EmployeeType, EmployeeType), Initials = coalesce(@Initials, Initials), Surname = coalesce(@Surname, Surname), ");
            sbSQL.Append("IssueQuarter = coalesce(@IssueQuarter, IssueQuarter), TrouserSize = coalesce(@Trouser_S, TrouserSize), TrouserLength = coalesce(@Trouser_L, TrouserLength), ");
            sbSQL.Append("PoloSize = coalesce(@Polo_S, PoloSize),  SweatSize = coalesce(@Sweat_S,SweatSize), ShortSize = coalesce(@Short_S, ShortSize), ShoeSize = coalesce(@Shoe_S, ShoeSize) WHERE EmpID = @EmpID ");
            sbSQL.Append(" else INSERT INTO TO4_WORKWEAR_DISTRIBUTION (EmpID,CostCentre, EmployeeType, Initials, Surname, IssueQuarter, TrouserSize, TrouserLength, PoloSize, SweatSize, ShortSize, ShoeSize) ");
            sbSQL.Append("VALUES (@EmpID, @Cost_Centre, @EmployeeType, @Initials, @Surname, @IssueQuarter, @Trouser_S, @Trouser_L, @Polo_S, @Sweat_S, @Short_S, @Shoe_S)");




            sbSQL.Replace("@EmpID", "'" + DDLEmpID.SelectedValue + "'");
            sbSQL.Replace("@Cost_Centre", "'" + DDLCostCentre.SelectedValue + "'");
            sbSQL.Replace("@EmployeeType", "'" + RBLAssociate.SelectedValue + "'");
            sbSQL.Replace("@Initials", "'" + DDLInitials.SelectedValue + "'");
            sbSQL.Replace("@Surname", "'" + str + "'");
            sbSQL.Replace("@Trouser_S", "'" + DDLTrous.SelectedValue + "'");
            sbSQL.Replace("@Trouser_L", "'" + DDLTrouserLnh.SelectedValue + "'");
            sbSQL.Replace("@Trouser_Q", "'" + DDLTrouserQty.SelectedValue + "'");
            sbSQL.Replace("@Polo_S", "'" + DDLPolo.SelectedValue + "'");
            sbSQL.Replace("@Polo_Q", "'" + DDLPoloQty.SelectedValue + "'");
            sbSQL.Replace("@Sweat_S", "'" + DDLSweat.SelectedValue + "'");
            sbSQL.Replace("@Sweat_Q", "'" + DDLSweatQty.SelectedValue + "'");
            sbSQL.Replace("@Shoe_S", "'" + DDLShoes.SelectedValue + "'");
            sbSQL.Replace("@Short_S", "'" + DDLShor.SelectedValue + "'");
            sbSQL.Replace("@InputDate", "'" + System.DateTime.Now.Date.ToString("MM/dd/yyyy") + "'");
            sbSQL.Replace("@IssueQuarter", "'" + RBLQuarter.SelectedValue + "'");

            SqlCommand cmd = new SqlCommand(sbSQL.ToString(), conn);
            cmd.CommandType = CommandType.Text;

            conn.Open();

            int result = cmd.ExecuteNonQuery(); //execute the SQL command on the database   
            LiteralControl lit = new LiteralControl();
            lit.Text = String.Format("Data Uploaded Successfully.");

感谢大家的帮助。 我决定现在将空白字符串 "" 插入数据库而不是 null,因为当我从中运行报告时,它让我的生活稍微轻松一些。

【问题讨论】:

  • 你是传递 null 到数据库还是传递 N/A?
  • 传递空值(很好地尝试)数据库应该获取下拉列表值而不是下拉列表文本。但是我在代码中将值定义为 null 的地方是取而代之的是文本。

标签: c# database drop-down-menu null


【解决方案1】:

问题是如果ListItem 的值设置为null,它将使用Text 属性作为值。例如这段代码:

ListItem l = new ListItem("Cats", null);

string s = l.Value;

s 的值为“Cats”。

解决办法不是存储null,而是存储一个空字符串,或者-1,或者类似的东西,然后在你的代码中检查这个。

【讨论】:

  • 好吧,我也在使用其他一些下拉列表,但我已经在 Web 应用程序中定义了它们的所有文本和值。当我将 Text 设置为 [N/A] 并将值设置为 '' 时,它的作用完全相同。它仍然只看到 [N/A] 文本并将其写入。而如果我将值设置为 null在同一情况下,它会将其识别为一个字符串,这是有道理的,因为我完成了数据库插入的方式。
  • 如果您将值设置为“”,它将插入一个空白字符串,而不是 [N/A]。我已经用上面的代码对其进行了测试,将 null 替换为 "" 并且 s 的值是一个空字符串。另一个问题可能是您构建 SQL 查询的奇怪(和潜在危险)方式。请参阅此答案stackoverflow.com/questions/293254/… 并以这种方式设置参数,而不是使用字符串。
  • 好的,我会检查并实施。我一直这样做是因为这是企业教我这样做的方式。
  • 问题是如果有人试图将恶意代码注入您的 SQL。如果有人将他们的名字输入为“Robert'); DROP TABLE Students;--”那么你会发现你的数据库被完全删除了。使用我链接到的方法,C# 将意识到有人正在尝试做一些顽皮的事情,要么抛出异常,要么将数据作为字符串插入,而不是作为命令执行。
  • 根本没有人需要在应用程序中输入任何内容。这一切都来自另一个数据库的预定义下拉列表。这会让它变得更好吗?
【解决方案2】:

C# null 与数据库 NULL 不同。

在您的插入代码中,您可能需要确定该值为“N/A”/null,然后插入一个 DBNull。你的数据库插入代码是什么样的?

【讨论】:

  • 我现在把它放在问题部分了,有帮助吗?
  • 是的,JDMX 已经编写了您可以在他的答案中使用的代码。但是,我建议可能值得考虑使用 SqlParameters 而不是替代品。
【解决方案3】:

使用 DBNull.Value 代替 null。

【讨论】:

    【解决方案4】:

    根据我对 C# ListItems 的解释,如果未定义值,那么当您查找值时,您将获得文本。这可能是一个简单的if (Value == null) return Text; 检查,所以如果你故意将 Value 设置为 null,那么它就会返回 Text 而不是你的 null 值。

    另一种看待它的方式是,您正在调用new ListItem(string, string) 构造函数,但为第二个参数传递了一个空值。这基本上调用了new ListItem(string),它同样将值设置为文本。也许不是字面意思,但最终结果是一样的。

    编辑

    我在一个简单的情况下对此进行了一些测试。如果您使用 null 值作为其值初始化 ListItem 对象,则 ListItem.Value 和 DropDownList.SelectedValue(当指向该列表项时)将获得与您的文本相同的值。因此,可以推断使用null 值初始化 ListItem 会将值设置为与文本相同。即使稍后通过ListItem.Value = null; 将其设置为null,仍会将其设置为文本。

    您必须将值设置为某个值,而不是直接输入 SelectedValue,而是运行检查 SelectedValue 是否等于此预设值。我个人使用_|NULL|_

    代码片段

    ListItem li;
    li = new ListItem("Test", null);
    Console.WriteLine(li.Value.ToString());
    li.Value = null;
    Console.WriteLine(li.Value.ToString());
    DropDownList ddl = new DropDownList();
    ddl.Items.Add(li);
    ddl.SelectedIndex = 0;
    Console.WriteLine(ddl.SelectedValue);
    Console.ReadLine();
    

    输出

    Test
    Test
    Test
    

    【讨论】:

      【解决方案5】:

      你可以这样做:

      sbSQL.Replace("@Trouser_S", (DDLTrous.SelectedValue == "[N/A]" ? "NULL" : "'" + DDLTrous.SelectedValue + "'"));
      

      【讨论】:

        【解决方案6】:

        您需要展示如何从下拉列表中提取数据并将其放入数据库中。使用 SelectedItem 属性获取 ListItem(您可能必须强制转换它),然后显式调用 ListItem.Value 进行数据库插入/更新。

        编辑...为代码做事

        而不是

         sbSQL.Replace("@Trouser_S", "'" + DDLTrous.SelectedValue + "'");
        

        ItemList il = (ItemList)DDLTrous.SelectedItem;
        string s = il.Value;
        if ( s != null )
          s = "'" + s + "'";
        else
          s = "null";
        
        sbSQL.Replace("@Trouser_S", s);
        

        您也可以尝试在值中将 null 替换为“null”。但关键是你不能在 null 值周围加上 "'" + x + "'" 否则它会作为字符串输入。

        再次编辑..

        如果 ItemList.Value 不能为 null,则将该值设为“null”并更改 if 语句。

        ItemList il = (ItemList)DDLTrous.SelectedItem;
        string s = il.Value;
        if ( s != "null" )
          s = "'" + s + "'";
        
        sbSQL.Replace("@Trouser_S", s);
        

        【讨论】:

        • 如果设置为null,则您的 if 分支将只跟随顶部路径,因为 ListItem 的值会自动设置为与其 Text 相同的值。这通过构造函数和手动赋值发生。
        • 这不是正确答案,因为您不会得到 null 值。
        • 我试过但没用。我不确定我是否对我的问题和 cmets 模棱两可。但我希望将 NULL 插入到数据库中。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多