Перезапись переменной в цикле SqlDataReader - PullRequest
0 голосов
/ 08 января 2020

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

У меня есть время oop с использованием SqlDataReader, который извлекает информацию из БД и помещает ее в список запросов на разработку, как показано ниже

public ListOfDevelopmentRequestsModel GetDevRequests(List<SelectListItem> evaluators)
        {
            SqlCommand cmd = new SqlCommand(StoredProcedures.DevRequests.GetDevRequests, Conn);
            cmd.CommandType = CommandType.StoredProcedure;
            ListOfDevelopmentRequestsModel ListOfDevRequests = new ListOfDevelopmentRequestsModel();
            Conn.Open();
            SqlDataReader reader = cmd.ExecuteReader();

            while (reader.Read())
            {
                DateTime requestDate = Convert.ToDateTime(reader["DateCreated"].ToString());
                string requestorFirstName = reader["Staff First Name"].ToString();
                string requestorLastName = reader["Staff Last Name"].ToString();
                string requestorEmailAddress = reader["Staff Email"].ToString();
                string solutionName = reader["SolutionName"].ToString();
                string solutionDescription = reader["SoultionDescription"].ToString();
                string solutionElementName = reader["SolutionElementName"].ToString();
                string solutionElementDescription = reader["SolutionElementDescription"].ToString();
                string itemToChange = reader["ItemChange"].ToString();
                string changeDetails = reader["ChangeDetail"].ToString();

                List<SelectListItem> evaluatorList = new List<SelectListItem>(DisplayCurrentEvaluator(evaluators, evaluator));

                DevelopmentRequestModel DevRequest = new DevelopmentRequestModel
                {
                    RequestDate = requestDate,
                    RequestorName = $"{requestorFirstName} {requestorLastName}",
                    RequestorEmailAddress = requestorEmailAddress,
                    SolutionName = solutionName,
                    SolutionDescription = solutionDescription,
                    SolutionElementName = solutionElementName,
                    SolutionElementDescription = solutionElementDescription,
                    ItemToChange = itemToChange,
                    ChangeDetails = changeDetails,
                    AccordionHeading = $"{(changeID.PadLeft(4, '0'))} - {requestorFirstName} {requestorLastName} - {itemToChange}"
                };

                ListOfDevRequests.DevelopmentRequests.Add(DevRequest);
            }
            Conn.Close();

            return ListOfDevRequests;
        }

У меня также есть список для получения оценщиков запросов

        public static List<SelectListItem> GetEvaluators()
        {
            List<SelectListItem> evaluators = new List<SelectListItem>();
            SqlCommand cmd = new SqlCommand(StoredProcedures.DevRequests.GetEvaluators, Conn);
            cmd.CommandType = CommandType.StoredProcedure;
            Conn.Open();
            SqlDataReader reader = cmd.ExecuteReader();
            while (reader.Read())
            {
                evaluators.Add(
                    new SelectListItem
                    {
                        Text = reader["Staff Name"].ToString(),
                        Value = reader["Staff Code"].ToString(),
                    });
            }
            Conn.Close();
            return evaluators;
        }

Наконец, у меня есть список, который передаст вышеупомянутый список оценщиков и оценщик, извлеченный из БД: string evaluator = reader["Evaluator"].ToString(); и установит значение по умолчанию для списка выбора в зависимости от того, соответствует ли имя оценщика текстовому значению, и установите его как выбранный элемент списка выбора.

        public List<SelectListItem> DisplayCurrentEvaluator(List<SelectListItem> evaluators, string evaluator)
        {
            foreach (var item in evaluators)
            {
                if (item.Text == evaluator)
                {
                    item.Selected = true;
                }
                else
                {
                    item.Selected = false;
                }
            }

            return evaluators;

        }

Проблема заключается в том, что первый элемент в l oop имеет оценщик "Билл" и "Билл", выбранный и работает нормально, однако второй элемент в l oop - это «Джон», и когда он устанавливает «Джон» в качестве выбранного, он заменяет «Билл» в качестве выбранного значения в первом элементе на «Джон»

Код имеет е Я нашел беспорядок, потому что я пытался исправить это разными способами, но я озадачен и был бы признателен за помощь.

Извините, если сообщение плохо отформатировано для чтения, я могу попытаться переформатировать и предоставить дополнительную информацию, если потребуется .

Приветствия

РЕДАКТИРОВАННЫЙ КОД:

GetDevRequests ()

 public ListOfDevelopmentRequestsModel GetDevRequests(List<SelectListItem> evaluators)
        {
            SqlCommand cmd = new SqlCommand(StoredProcedures.DevRequests.GetDevRequests, Conn);
            cmd.CommandType = CommandType.StoredProcedure;
            ListOfDevelopmentRequestsModel ListOfDevRequests = new ListOfDevelopmentRequestsModel();
            Conn.Open();
            SqlDataReader reader = cmd.ExecuteReader();
            List<SelectListItem> evaluatorList = new List<SelectListItem>();

            while (reader.Read())
            {
                string changeID = reader["ChangeID"].ToString();
                string evaluator = reader["Evaluator"].ToString();
                string status = reader["Status"].ToString();
                string priority = reader["Priority"].ToString();
                string eliteID = reader["RequestorID"].ToString();
                DateTime requestDate = Convert.ToDateTime(reader["DateCreated"].ToString());
                string requestorFirstName = reader["Staff First Name"].ToString();
                string requestorLastName = reader["Staff Last Name"].ToString();
                string requestorEmailAddress = reader["Staff Email"].ToString();
                string solutionName = reader["SolutionName"].ToString();
                string solutionDescription = reader["SoultionDescription"].ToString();
                string solutionElementName = reader["SolutionElementName"].ToString();
                string solutionElementDescription = reader["SolutionElementDescription"].ToString();
                string itemToChange = reader["ItemChange"].ToString();
                string changeDetails = reader["ChangeDetail"].ToString();

                evaluatorList = DisplayCurrentEvaluator(evaluators, evaluator);

                DevelopmentRequestModel DevRequest = new DevelopmentRequestModel
                {
                    ChangeID = (changeID.PadLeft(4, '0')),
                    Evaluator = evaluator,
                    Evaluators = evaluatorList,
                    Status = status,
                    Priority = priority,
                    EliteID = eliteID,
                    RequestDate = requestDate,
                    RequestorName = $"{requestorFirstName} {requestorLastName}",
                    RequestorEmailAddress = requestorEmailAddress,
                    SolutionName = solutionName,
                    SolutionDescription = solutionDescription,
                    SolutionElementName = solutionElementName,
                    SolutionElementDescription = solutionElementDescription,
                    ItemToChange = itemToChange,
                    ChangeDetails = changeDetails,
                    AccordionHeading = $"{(changeID.PadLeft(4, '0'))} - {requestorFirstName} {requestorLastName} - {itemToChange}"
                };

                ListOfDevRequests.DevelopmentRequests.Add(DevRequest);
            }
            Conn.Close();

            return ListOfDevRequests;
        }

DisplayCurrentEvaluator ()

        public List<SelectListItem> DisplayCurrentEvaluator(List<SelectListItem> selectListItems, string selectListDefaultItem)
        {
            foreach (var item in selectListItems)
            {
                item.Selected = item.Text == selectListDefaultItem;
            }

            return selectListItems;

        }

1 Ответ

0 голосов
/ 08 января 2020

Проблема в этой строке:

List<SelectListItem> evaluatorList = new List<SelectListItem>(DisplayCurrentEvaluator(evaluators, evaluator));

Во-первых, это также можно записать как

List<SelectListItem> evaluatorList = DisplayCurrentEvaluator(evaluators, evaluator);

Ваш DisplayCurrentEvaluator уже возвращает правильный список, поэтому нет нужно скопировать его в новый файл.

Но это второстепенный вопрос, поскольку вы не используете тот оценщикList, насколько я вижу. В каждой итерации этого while-l oop вы создаете новый (что, вероятно, не то, что вам нужно), а затем вы об этом забываете. Я также не вижу, где установлен evaluator, но это, вероятно, в коде, который вы не показывали.

Так что вам нужно будет сгенерировать этот список один раз за пределами l oop и сохранить его (вероятно, в поле или свойстве уровня класса).

И дополнительный совет, этот метод DisplayCurrentEvaluator также может быть записан как

public List<SelectListItem> DisplayCurrentEvaluator(List<SelectListItem> evaluators, string evaluator)
{
    foreach (var item in evaluators)
    {
        item.Selected = item.Text == evaluator;
    }

    return evaluators;
}

EDIT после того, как код был показано, что установлено evaluator и использовано полученное значение evaluatorList

Ваш DisplayCurrentEvaluator обновляет исходный список оценщиков и возвращает его. Это фактически приводит к тому, что каждый оценочный список указывает на один и тот же список, где побеждает последнее обновление. Поэтому убедитесь, что вы возвращаете новый список.

public List<SelectListItem> DisplayCurrentEvaluator(List<SelectListItem> evaluators, string evaluator)
{
    var result = new List<SelectListItem>(evaluators.Count);

    foreach (var item in evaluators)
    {
        result.Add(new SelectListItem { Text = item.Text, Value = item.Value, Selected= item.Text == evaluator};      
    }

    return result;
}

Кроме того, объявите в списке оценки (только) внутри l oop.

 var evaluatorList = DisplayCurrentEvaluator(evaluators, evaluator);
...