У меня есть 14 полей, которые принимают одни и те же типы данных для использования с определенной функцией. Я хочу, чтобы содержимое моего текущего цикла for не использовалось 14 раз. Мне нужно найти способ получить объект текстового поля, используя значение элемента массива в качестве ссылки на текстовое поле. НАПРИМЕР. array [i] .Text. Как я могу сделать что-то подобное?

В качестве краткого примера используйте следующее:

if(grades[0] != assignmentEarnedTB[i].Text && grades[1] != assignmentPossTB[i].Text){

Как и ожидалось, приведенный выше код дает строку с ошибкой, не содержащую определения для текста.

Вам нужно настроить XPath, чтобы отфильтровать элементы, которые вы ищете, а затем подсчитать, что осталось. Ваше текущее выражение оценивает, равен ли какой-либо из узлов {{X0}} {{X1}}, который будет либо {{X2}}, либо {{X3}}, а затем вы подсчитываете логическое значение.

string[] assignmentNames = {"Assignment 1", "Assignment 2", "Assignment 3", "Assignment 4", "Assignment 5", "Assignment 6", "Assignment 7", "Assignment 8", "Assignment 9", "Assignment 10", "Quiz 1", "Quiz 2", "Midterm Project", "Final Project"};
string[] assignmentEarnedTB = {"txtAsmt1Earned", "txtAsmt2Earned", "txtAsmt3Earned", "txtAsmt4Earned", "txtAsmt5Earned", "txtAsmt6Earned", "txtAsmt8Earned", "txtAsmt9Earned", "txtAsmt10Earned", "txtQuiz1Earned", "txtQuiz2Earned", "txtMidtermEarned", "txtFinalEarned"};
string[] assignmentPossTB = {"txtAsmt1Poss","txtAsmt2Poss", "txtAsmt3Poss", "txtAsmt4Poss", "txtAsmt5Poss", "txtAsmt6Poss", "txtAsmt7Poss", "txtAsmt8Poss", "txtAsmt9Poss", "txtAsmt10Poss", "txtQuiz1Poss", "txtQuiz2Poss", "txtMidtermPoss", "txtFinalPoss"};

for(int i = 0; i < assignmentNames.Length; i++){

    string gradeString = proxy.GetAssignmentScore(Convert.ToInt32(Request.QueryString["id"]), assignmentNames[i]);
    string[] grades = gradeString.Split("/");

    if(grades[0] != assignmentEarnedTB[i].Text && grades[1] != assignmentPossTB[i].Text){
        if(txtAsmt1Earned.Text != "" && txtAsmt1Poss.Text != "" && ){
            if (Convert.ToInt32(txtAsmt1Earned.Text) < Convert.ToInt32(txtAsmt1Poss.Text))
            {
                proxy.UpdateAssignmentScore(Convert.ToInt32(Request.QueryString["id"]), "Assignment 1", Convert.ToInt32(txtAsmt1Earned.Text), Convert.ToInt32(txtAsmt1Poss.Text));
            }
            else
            {
                proxy.AddAssignmentScore(Convert.ToInt32(Request.QueryString["id"]), "Assignment 1", Convert.ToInt32(txtAsmt1Earned.Text), Convert.ToInt32(txtAsmt1Poss.Text));
            }
        }
    }

}
c#
0
ShoeLace1291 10 Май 2016 в 17:42

2 ответа

Лучший ответ

Вместо того, чтобы хранить имена ваших TextBoxes в assignmentEarnedTB и assignmentPossTB, оставьте сами ссылки TextBox.

TextBox[] assignmentEarnedTB = new [] { txtAsmt1Earned, txtAsmt2Earned, ... }

Ваша текущая реализация сохраняет только объекты string, значение которых совпадает с именами ваших объектов TextBox. У вас нет логики, чтобы диктовать, что вы хотите получить доступ к элементу управления с именем assignmentEarnedTB[i]. Делать это правильно таким образом немного громоздко, поэтому лучше сделать шаг вперед и вместо этого сохранить коллекцию ваших объектов TextBox, а не их имена.

0
AntiTcb 10 Май 2016 в 14:48

Я не совсем уверен, что могу полностью вспомнить имена объектов для этого материала, но характера этого подхода было бы достаточно:

Control[] assignmentEarnedTB = { txtAsmt1Earned, txtAsmt2Earned, txtAsmt3Earned, ... };
Control[] assignmentPossTB = { txtAsmt1Poss, txtAsmt2Poss, txtAsmt3Poss, ... };

Таким образом, выстраивая массив реальных ссылок на объекты, ваш код, использующий целочисленный индекс, начинает работать.

0
Mark Rabjohn 10 Май 2016 в 14:50