Нулевое значение выпадающего списка не работает для выделенного текста c #? - PullRequest
0 голосов
/ 22 апреля 2010

В основном у меня есть выпадающий список, который заполняется текстом и значениями в зависимости от выбранного индекса списка переключателей.Код выглядит следующим образом:

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]', я хочу, чтобы значение NULL было вставлено в базу данных.В настоящее время, когда выбрано «[N / A]», в базу данных вводится значение [N / A], кто-нибудь знает почему?

Это мой код вставки в БД:

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.");

Спасибо за вашу помощь, ребята.Я решил вставить пустые строки "" в базу данных вместо нуля сейчас, поскольку это немного облегчает мою жизнь, когда я запускаю отчеты из нее.

Ответы [ 6 ]

3 голосов
/ 22 апреля 2010

Проблема заключается в том, что если для ListItem установлено значение null, оно будет использовать свойство Text в качестве значения.Например, этот код:

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

string s = l.Value;

Значение s равно "Cats".

Решение не хранить ноль, а хранить пустую строку, или -1, или что-то подобное, а затем проверьте это в своем коде.

0 голосов
/ 22 апреля 2010

Вы можете просто сделать это:

sbSQL.Replace("@Trouser_S", (DDLTrous.SelectedValue == "[N/A]" ? "NULL" : "'" + DDLTrous.SelectedValue + "'"));
0 голосов
/ 22 апреля 2010

Вам нужно показать, как вы извлекаете данные из выпадающего списка и помещаете их в базу данных. Используйте свойство 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);

Вы также можете попробовать заменить ноль на «ноль» в значении. Но главное в том, что вы не можете иметь "'" + 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);
0 голосов
/ 22 апреля 2010

Использовать DBNull.Value вместо нуля.

0 голосов
/ 22 апреля 2010

Из моей интерпретации C # ListItems, если значение не определено, то при поиске значения вы получите текст.Это, вероятно, простая проверка if (Value == null) return Text;, поэтому, естественно, если вы намеренно установите значение в качестве нулевого значения, оно затем вернет текст вместо вашего нулевого значения.

Еще один способ взглянуть на это состоит в том, что вы вызываетеnew ListItem(string, string) конструктор, но передающий нулевое значение для второго аргумента.Это в основном вызывает new ListItem(string), что также устанавливает значение в текст.Возможно, не в буквальном смысле, но конечный результат тот же.

РЕДАКТИРОВАТЬ

Я провел некоторое тестирование этого в простой ситуации.Если вы инициализируете объект ListItem значением null для его значения, то и ListItem.Value, и DropDownList.SelectedValue (при указании на этот элемент списка) получат то же значение, что и ваш текст.Таким образом, можно сделать вывод, что инициализация ListItem значением null устанавливает значение в значение Text.Даже если позже установить его на null через ListItem.Value = 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
0 голосов
/ 22 апреля 2010

C # null не совпадает с NULL базы данных.

В вашем коде вставки вам, вероятно, нужно подобрать значение «N / A» / null, а затем вместо него вставить DBNull. Как выглядит код вставки вашей БД?

...