Member 13041059 Ответов: 1

Логическая ошибка в коде


ScriptManager.RegisterStartupScript(Page, Page.GetType(), "myModalEditStandType", "$('#myModalEditStandType').modal();", true);
        using (con)
        {
            using (SqlCommand cmd = new SqlCommand())
            {
                cmd.CommandText = "select formid,formName from FormDetails where Edition_Id=" + Session["Edition_ID"].ToString() + " ";
                cmd.Connection = con;
                con.Open();
                using (SqlDataReader sdr = cmd.ExecuteReader())
                {
                    chkFormNames.Items.Clear();
                    while (sdr.Read())
                    {
                       
                        ListItem item = new ListItem();
                        //string StandTypeID =sdr["StandTypeID"].ToString();

                        item.Text = sdr["formName"].ToString();
                        item.Value = sdr["FormId"].ToString();

                        // item.Selected = Convert.ToBoolean(sdr["IsSelected"]);

                        standName = e.CommandName.ToString();
                        txtStandType.Text = standName.ToString();
                        txtStandTypeEdit_ModalBox.Text = standName.ToString();
                        
                        string[] commandArgs = e.CommandArgument.ToString().Split(new char[] { ',' });
                        
                        chkFormNames.Items.Add(item);
                        foreach (var ca in commandArgs)
                        {
                            if(ca != null || ca != string.Empty ||ca != "")
                            {
                                FormDetails_ID =ca;
                                if (item.Value == FormDetails_ID)
                                {
                                    item.Selected = true;
                                }
                            }
                        }
                    }
                }
                con.Close();
            }
        }
        grdManageStandType.DataBind();


ошибка в строке ниже:-
if (item.Value == FormDetails_ID)
{
  item.Selected = true;
}



на приведенном выше условии if есть логическая ошибка.

проблема только в этом коде
я отладил код и проверил. позвольте мне объяснить на примере ошибки
Напр.:-
StandTypeName         Forms      Edit Stand Type                                               
Co-Exhibitor         1, 2, 4         Edit

Существует множество форм. Пользователь нажимает на кнопку edit, затем открывается модальное всплывающее окно, и пользователь пишет имя StandTypeName и выбирает несколько чекбоксов из нескольких, а затем сохраняет его. После этого, когда пользователь снова открывает модальное всплывающее окно для одного из StandTypeName, скажем, здесь пользователь проверяет наличие соэкспонента, в столбце формы для соэкспонента есть 3 значения, но когда пользователь нажимает на кнопку редактирования, открывается модальное всплывающее окно и проверяется только первое значение, а остальные 2 значения не проверяются. Когда я отлаживаю код для первой формы, которая здесь 1, работает нормально, но для второй и третьей формы, которая здесь 2, 4 дает проблему

Здесь
if (item.Value == FormDetails_ID)
 {
  item.Selected = true;
 }


во время отладки, когда он проверяет наличие форм 2, item. value и FormDetails.ID обоих содержит значение =2, но не входит внутрь, если цикл непосредственно выходит из цикла

Что я уже пробовал:

ScriptManager.RegisterStartupScript(Page, Page.GetType(), "myModalEditStandType", "$('#myModalEditStandType').modal();", true);
        using (con)
        {
            using (SqlCommand cmd = new SqlCommand())
            {
                cmd.CommandText = "select formid,formName from FormDetails where Edition_Id=" + Session["Edition_ID"].ToString() + " ";
                cmd.Connection = con;
                con.Open();
                using (SqlDataReader sdr = cmd.ExecuteReader())
                {
                    
                    while (sdr.Read())
                    {
                       
                        ListItem item = new ListItem();
                        //string StandTypeID =sdr["StandTypeID"].ToString();

                        item.Text = sdr["formName"].ToString();
                        item.Value = sdr["FormId"].ToString();

                        // item.Selected = Convert.ToBoolean(sdr["IsSelected"]);

                        
                    }
                }
                con.Close();
            }
        }

chkFormNames.Items.Clear();
standName = e.CommandName.ToString();
                        txtStandType.Text = standName.ToString();
                        txtStandTypeEdit_ModalBox.Text = standName.ToString();
                        
                        string[] commandArgs = e.CommandArgument.ToString().Split(new char[] { ',' });
                        
                        chkFormNames.Items.Add(item);
                        foreach (var ca in commandArgs)
                        {
                            if(ca != null || ca != string.Empty ||ca != "")
                            {
                                FormDetails_ID =ca;
                                if (item.Value == FormDetails_ID)
                                {
                                    item.Selected = true;
                                }
                            }
                        }


        grdManageStandType.DataBind();

Kornfeld Eliyahu Peter

Ты хочешь сказать, что во время отладки линии 'если (элемент.Значение == FormDetails_ID)', можно увидеть, что с обеих сторон имеет значение '2', но вы никогда не вводить свои верные части "если"?
Вы уверены, что значения отображаются правильно? Иногда (в зависимости от потока) отладчик отображает значения серым цветом, чтобы указать, что то, что вы видите, является старым, и вы должны вручную обновить их...

Member 13041059

да, я уверен, что я также сделал снимок ошибки, но я не знаю, как поместить его здесь, чтобы вы могли легко понять

Kornfeld Eliyahu Peter

Скопируйте сообщение об ошибке сюда? С линейным индикатором в вашем коде, например / / < - ошибка здесь: Сообщение об ошибке

Member 13041059

Он не отображает никаких сообщений об ошибках

в ниже код продукта.Значение == FormDetails_ID показывает верно по форме 1, когда эти 2 равны, но по форме 2,4, когда товар.Значение == FormDetails_ID равно то же пункт.выбранные показывает ложные

if (item. Value == FormDetails_ID) / / ошибка здесь
{
пункт.Selected = true;
}

1 Ответов

Рейтинг:
0

Al_Brown

Из вашего описания и кода кажется, что у вас есть пробел в одном значении, которое вы сравниваете, но не в другом - этот пробел может быть не очевиден при просмотре его в отладчике, поэтому вы думаете, что он не работает.

Вы показываете пример использования "1, 2, 4" и разделяете строку аргумента команды разделителем-запятой. Это приведет к значениям "1", "2" и " 4 " в ca (и, следовательно, FormDetails_ID). Сравнение с "1" будет работать для первой формы, но сравнение" 2 "с" 2 " не будет работать так, как предполагалось.

Если это так, то потенциальное решение довольно простое - просто обрезайте строку, когда вы назначаете ее FormDetails_ID:

FormDetails_ID = ca.Trim();

Примечание - Я бы также предложил вам проверить логическое сравнение, которое вы делаете ca. т. е. " if (ca != null || ca != строка.Пустой || ca != "") " позволит проверить пустую строку, так как она не будет нулевой. Простое изменение состояло бы в том, чтобы использовать логическое И, а не логическое или:
if(ca != null & ca != string.Empty & ca != "")
{
   FormDetails_ID = ca.Trim();
   if (item.Value == FormDetails_ID)
   {
      item.Selected = true;
   }
}

Вместо этого вы также можете использовать встроенную функцию проверки статической строки IsNullOrEmpty:
foreach (var ca in commandArgs)
{
    if(false == string.IsNullOrEmpty(ca))
    {
        FormDetails_ID = ca.Trim();
        if (item.Value == FormDetails_ID)
        {
            item.Selected = true;
        }
    }
}

Если вы хотите пройти весь путь, то вы можете упростить его еще больше и даже не иметь пустых элементов, возвращаемых функцией split, и убедиться, что каждый элемент выбран или не выбран явно назначением:
chkFormNames.Items.Add(item);

string[] commandArgs = e.CommandArgument.ToString().Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
foreach (var ca in commandArgs)
{
   item.Selected = (item.Value == ca.Trim());
}


Member 13041059

FormDetails_ID = ca.Trim();


Выше код работает для меня большое спасибо.

Al_Brown

Всегда пожалуйста!