Datagrid выбирает неправильную пользовательскую ячейку в моей таблице данных - PullRequest
0 голосов
/ 15 марта 2010

Я работаю над проблемой с ближайшей недели, но все еще не могу заставить ее работать, как ожидалось. У меня есть DataGrid, который имеет HBox с CheckBox и Label в качестве itemRenderer (см. Код ниже). Когда я подключаюсь к ячейке, появляется стандартный itemEditor, позволяющий ввести содержимое метки. Это стандартное поведение. У меня нормально работает кроме 2х проблем:

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

  2. Когда я заполнил более одной строки, происходит другая ошибка. Если я коснусь строки, сетка данных выберет ту, которая находится под этой строкой. Это только если одна строка уже выбрана. Если я коснусь за пределами сетки данных, а затем коснусь в любой строке, покажется itemEditor из правой строки ... Есть ли что-нибудь правильное в настройке моего метода данных?

__

package components
{
 import mx.containers.HBox;
 import mx.controls.CheckBox;
 import mx.controls.Label;

 public class ChoiceRenderer extends HBox
 {

  private var correctAnswer:CheckBox;
  private var choiceLabel:Label;

  public function ChoiceRenderer()
  {
   super();
   paint();
  }

  private function paint():void{
   percentHeight = 100;
   percentWidth = 100;
   setStyle("horizontalScrollPolicy", "off");
   super.setStyle("horizontalScrollPolicy", "off");

   correctAnswer = new CheckBox;
   correctAnswer.setStyle("horizontalScrollPolicy", "off");  
   addChild(correctAnswer);

   choiceLabel = new Label;
   choiceLabel.setStyle("horizontalScrollPolicy", "off");   
   addChild(choiceLabel);  


  }

     override public function set data(xmldata:Object):void{
      if(xmldata.name() == "BackSide"){
       var xmlText:Object = xmldata.TextElements.TextElement.(@position == position)[0];
       super.data = xmlText;
       choiceLabel.text = xmlText.toString();
       correctAnswer.selected = xmlText.@correct_answer;

      }               
 }
}

Заранее спасибо! Markus

Ответы [ 2 ]

0 голосов
/ 15 марта 2010
  • чтобы избежать полосы прокрутки, необходимо, чтобы сетка данных имела переменную высоту

<mx:DataGrid id="dg"
 dataProvider="{dp}"
 variableRowHeight="true" 
 creationComplete="dg.height=dg.measureHeightOfItems(0,dp.length)+dg.headerHeight+2"/>
0 голосов
/ 15 марта 2010
  • Я не уверен, является ли это причиной ваших проблем, но стандартный способ создания детей - переопределить метод createChildren.

  • Кроме того, вы пропускаете оператор else - вы не вызываете super.data, когда условие if не выполняется. Это тоже не очень хорошо выглядит.

Попробуйте:

package components
{
 public class ChoiceRenderer extends HBox  {
  private var correctAnswer:CheckBox;
  private var choiceLabel:Label;

  public function ChoiceRenderer() {
    super();
    percentHeight = 100;
    percentWidth = 100;
    setStyle("horizontalScrollPolicy", "off");
  }
  override protected function createChildren():void {
    super.createChildren();
    correctAnswer = new CheckBox();
    addChild(correctAnswer);
    choiceLabel = new Label();
    choiceLabel.setStyle("horizontalScrollPolicy", "off");   
    addChild(choiceLabel);  
  }
  override public function set data(xmldata:Object):void {
    if(xmldata.name() == "BackSide") {
       var xmlText:Object = xmldata.TextElements.TextElement.(@position == position)[0];
       super.data = xmlText;
       choiceLabel.text = xmlText.toString();
       correctAnswer.selected = xmlText.@correct_answer;
    }
    else {
      //what if xmldata.name() is not "BackSide"?
      //you are not calling super.data in that case
    }
  }
}
...