2013-07-06 2 views
1

У меня есть вектор баллов для тестов, как свойство моего класса Assignment.Привязка элемента управления редактированием к определенному элементу вектора в управляемом компоненте?

У меня есть окно редактирования на xpage, где я хочу изменить значение и записать обратно в вектор в управляемом компоненте. Связывание значений поля редактирования: <xp:this.value><![CDATA[#{rpt.scores[rowIndex]}]]></xp:this.value> Где rpt - объект назначения из моего компонента. Блок редактирования находится в режиме повторного управления, потому что я не знаю, сколько учеников будет проходить тест каждый раз. Поэтому я использую rowIndex элемента управления повтора, чтобы определить, к какому элементу вектора баллов я хочу привязать.

Он правильно считывает значение из вектора баллов, но я не могу изменить значение и вернуть его в вектор.

Как его получить, чтобы записать значение обратно в элемент Scores [n] класса Assignment?

здесь является присвоение класса от моего боба:

package com.logickey.gradebook; 

import java.io.Serializable; 
import java.util.Vector; 


public class Assignment implements Serializable { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = -1500382996574385949L; 
    private String Name; 
    private String Teacher; 
    private String AssignNum; 
    private String AssignDate; 
    private Vector<String> Scores; 

    public Assignment() { 
     Name = ""; 
     Teacher = ""; 
     AssignNum = ""; 
     AssignDate = ""; 
     Scores = new Vector<String>(); 
    } 
    public Assignment(String name, String teacher, String assignNum, String assignDate, Vector<String> scores){ 
     Name = name; 
     Teacher = teacher; 
     AssignNum = assignNum; 
     AssignDate = assignDate; 
     Scores = scores; 
    } 


    public String getName() { 
     return Name; 
    } 

    public void setName(String name) { 
     Name = name; 
    } 

    public String getTeacher() { 
     return Teacher; 
    } 

    public void setTeacher(String teacher) { 
     Teacher = teacher; 
    } 

    public String getAssignNum() { 
     return AssignNum; 
    } 

    public void setAssignNum(String assignNum) { 
     AssignNum = assignNum; 
    } 

    public String getAssignDate() { 
     return AssignDate; 
    } 

    public void setAssignDate(String assignDate) { 
     AssignDate = assignDate; 
    } 


    public Vector<String> getScores() { 
     return Scores; 
    } 

    public void addScore(String input) { 
     if (Scores==null) { 
      Scores = new Vector<String>(); 
     } 
     Scores.add(input); 
    } 


} 

ответ

2

Per является правильным. Однако я бы предложил сделать это еще на один шаг. Ваши баллы Vector могут быть самим классом, включая имя и оценку ученика.

Вам нужен метод getScores() и setScores (Vector newValues). Регулятор повтора позаботится о вставке в нужное положение.

Если вы используете пользовательский класс, вам нужны методы get/set на нем. то вы можете связать поля e. г. RPT. Студент

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

  • Вектор держит вставку, заказать
  • Комплект: обеспечивает нет дубликатов (реализации Comparble)
  • Дерево Набор: сохраняет данные отсортированными автоматически

Есть еще, получайте удовольствие!

Дайте нам знать, как она идет

+0

Регулятор повтора должен быть связан не с вашим объектом rpt, а с rpt.Scores – stwissel

+1

Стефан прав: термин «bean» относится к классу Java, который придерживается набора соглашений, два из которых вы уже выполните: конструктор без аргументов и реализующий Serializable. Третья оболочка включает все свойства в «getters» и «seters». Если у вас нет геттеров и сеттеров, это не боб, это POJO («простой старый Java-объект»). Термин «управляемый компонент» просто означает, что Domino управляет именем переменной и областью действия для вас, но регистрация его как управляемого компонента не делает его компонентом ... придерживаясь соглашения о компоненте, это делает его bean-компонентом. :) –

+0

Спасибо, Стефан, ваше предложение было очень полезно. Я написал многоязычный навсегда, я все еще изучаю Java-часть разработки Domino/XPages. – tylernaas

1

Попробуйте с помощью метода setScores вместо метода addScores. Вам нужен геттер и сеттер для редактируемого элемента управления.

0

Благодаря stwissel, я создал public class Score {} со свойствами studentID и value, а затем сделал мой SCORES Вектор коллекции Score объектов вместо String значений. Затем я привязал свой блок редактирования к #{rpt.scores[rowIndex].value} Теперь я могу получить и установить значение через геттеры и сеттеры класса Score!

Вот некоторые подробности о том, как я это сделал:

У меня есть контроль повтор var="rowData" indexVar="rowIndex" и вложенный контроль повтора с var="rpt" indexVar="rptIndex" и источником данных является моим объектом Assignment. Тогда для значения моего окна редактирования я использовал свойство value моего нового класса Score.

Короткие-короткая версия будет выглядеть примерно так:

<xp:repeat... var="rowData" indexVar="rowIndex" ...> 
    <xp:repeat... var="rpt" indexVar="rptIndex" value="#{gbPage.assignments}" ...> 
     <xp:inputText id="Input12" value="#{rpt.scores[rowIndex].value}" ...> 
     </xp:inputText> 
    </xp:repeat> 
</xp:repeat> 

мне пришлось поменять пару методов в моем Assignment классе:

package com.logickey.gradebook; 

import java.io.Serializable; 
import com.logickey.gradebook.Score; 
import java.util.Arrays; 
import java.util.Vector; 


public class Assignment implements Serializable { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = -1500382996574385949L; 
    private String Name; 
    private String Teacher; 
    private String AssignNum; 
    private String AssignDate; 
    private **Vector<Score> Scores;** 
    private String Category; 
    private String TotalPoints; 
    private Arrays Standards; 

    public Assignment() { 
     Name = ""; 
     Teacher = ""; 
     AssignNum = ""; 
     AssignDate = ""; 
     **Scores = new Vector<Score>();** 
    } 
    public Assignment(String name, String teacher, String assignNum, String assignDate, **Vector<Score> scores**){ 
     Name = name; 
     Teacher = teacher; 
     AssignNum = assignNum; 
     AssignDate = assignDate; 
     Scores = scores; 
    } 

    /* 
    * 
    * some code removed from here.... 
    * */ 

    public void setScores(Vector<Score> scores) { 
     Scores = scores; 
    } 
    public Vector<Score> getScores() { 
     return Scores; 
    } 
    /** 
    * custom methods 
    */ 

//added two parameters to the addScore method 
public void addScore(String studentID, String value) { 
    if (Scores==null) { 
     Scores = new Vector<Score>(); 
    } 
    **Scores.add(new Score(studentID, value));** 
} 
} 

Вот Score класса я добавил:

package com.logickey.gradebook; 

import java.io.Serializable; 

public class Score implements Serializable { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 3888467323290005584L; 
    private String StudentID; 
    private String Value; 

    public Score() { 
     StudentID = ""; 
     Value = ""; 
    } 

    public Score(String studentID, String value) { 
     StudentID = studentID; 
     Value = value; 
    } 

    public String getStudentID() { 
     return StudentID; 
    } 

    public void setStudentID(String studentID) { 
     StudentID = studentID; 
    } 

    public String getValue() { 
     return Value; 
    } 

    public void setValue(String value) { 
     Value = value; 
    } 

} 
+0

Хороший, я хотел бы, чтобы вы попробовали одну небольшую модификацию. Вместо привязки к привязке «присваивания» к «assign.scores», а затем «# {rpt.value}» -> тоже нужно работать и удаляет необходимость читать 2 переменные – stwissel