Событие Itemclick в сетке данных

Проблему можно резюмировать следующим образом: при щелчке элемента в сетке данных в текстовой области отображается значение элемента, но здесь компоненты разделены, и, следовательно, необходимо отправлять события.

My mxml component file :

<?xml version="1.0" encoding="utf-8"?>
<mx:DataGrid xmlns:mx="http://www.adobe.com/2006/mxml" itemClick="itemClickEvent(event);"  creationComplete="init()">

<mx:Metadata>
  [Event(name="IdSelected", type="one.IdEvent")]
</mx:Metadata>

<mx:Script>
<![CDATA[     import genericReport.*;
              import crewUtilization.*;
              import utils.*;
              import studies.*;
              import mx.rpc.events.FaultEvent;
              import mx.rpc.events.ResultEvent;
              import mx.controls.Alert;
              import mx.events.ListEvent;


      private function itemClickEvent(event:ListEvent):void 
      {
          var _study:Object=event.currentTarget.selectedItem.study;
          dispatchEvent(new IDEvent(_ID));     
      }


]]>

</mx:Script>

<mx:columns>

 <mx:DataGridColumn dataField="name" />
 <mx:DataGridColumn dataField="userId" />
</mx:columns>
</mx:DataGrid>

///////////////////////////////////////////////////////////////

Это мой основной файл приложения MXML:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:custom="*">
<mx:TitleWindow label="Scenario Creation" xmlns:mx="http://www.adobe.com/2006/mxml"
 xmlns:ns1="ccCreation.*">

<mx:Label text="CC CREATION" width="100%" />
<mx:VBox width="100 %" styleName="scenariovboxStyle">

<custom:studySelector id="dg" />
</mx:VBox>
</mx:TitleWindow>   
</mx:Application>

person user120118    schedule 09.06.2009    source источник


Ответы (1)


Я думаю, что для StudyId было бы лучше ссылаться на dataGrid, а не dataGrid, ссылающийся на StudyId. Вы можете добавить это в свой основной mxml:

<mx:TextArea id="studyId" text="{dataGrid.selectedItem.Study}"/>

Это должно работать, потому что TextArea.text будет реагировать на событие изменения свойства DataGrid.selectedItem, поэтому оно будет меняться при каждом изменении выбора.

РЕДАКТИРОВАТЬ: Отправка событий:

Вы можете отправить событие из любого места в вашем коде, и слушатели смогут прослушать это событие. Например:

<mypackage:MyComponent>
...
private function foo():void
{
    dispatchEvent(new MouseEvent(MouseEvent.CLICK)); // Dispatches a mouse event whenever foo is called.
}

Теперь вы можете прослушать это событие:

<mypackage:MyComponent id="myComponent"/>
...
myComponent.addEventListener(MouseEvent.CLICK, mouseClickHandler);

private function mouseClickHandler(event:MouseEvent):void
{
    ... // code to handle that event here.
}

Надеюсь это поможет!

<mx:MainComponent creationComplete="init()" ...>
    ...
    private function init(event:Event):void
    {
        ...
        customComponent.addEventListener(StudyEvent.STUDYSELECTED, studySelectedListener);
        ...
    }

    private function studySelectedListener(event:StudyEvent):void
    {
        studyid.text = event.study.studyId; // or wherever you store your studyId value
        ...
    }
    ...
<mx:MainComponent/>

Что происходит, так это то, что всякий раз, когда событие StudyEvent.STUDYSELECTED запускается из вашего customComponent, оно будет перехватываться вашей основной функцией, и будет вызываться StudySelectedListener.

person CookieOfFortune    schedule 09.06.2009
comment
эй ... Спасибо за предложение .... Но как насчет «Исследования», являющегося объектом, состоящим из StudyId, имени и идентификатора пользователя. Я должен показать только StudyId. Кроме того, правильно ли мое событие ItemClick ?? то есть, если я внесу изменения в свой основной файл mxml и оставлю событие itemclick как есть, будет ли код работать?? - person user120118; 10.06.2009
comment
Если ваш объект имеет StudyId и UserId в качестве членов, вы можете заменить selectedItem.Study на selectedItem.StudyId, поскольку selectedItem будет ссылаться на ваш объект (исследование). Ваш itemClickHandler верен, за исключением того, что у вас нет доступа к textArea. Что вы можете сделать, если хотите придерживаться своего обработчика событий, так это отправить событие из вашего itemClickHandler. Ваш main должен поймать это событие и ответить, установив свойство textArea. Это похоже на то, что я предложил, обработчики просто скрыты с помощью связываемых свойств. - person CookieOfFortune; 10.06.2009
comment
Другой вариант — расширить DataGrid подклассом, который принимает ваш основной класс в качестве свойства. Тогда он может иметь доступ ко всем компонентам, содержащимся в main. - person CookieOfFortune; 10.06.2009
comment
Привет... Я также показал основной файл приложения MXML сейчас... Как вы сказали, я должен отправить событие из itemClickHandler.... Я не знаю, как отправить событие и отобразить текст на главном экране.ie поймать вывод .... Я буду очень признателен, если вы поможете мне с кодом события отправки и модификациями для него в основном приложении ..... Я предоставил все коды файлов в вопросе сейчас ..... Пожалуйста .. Я прошу вас помочь мне с тем же самым ... Спасибо ... - person user120118; 10.06.2009
comment
Причиной кода события отправки является то, что меня просят использовать код события отправки.... - person user120118; 10.06.2009
comment
Отформатируйте свой код с 4 пробелами. В любом случае text={dataGrid.selectedItem.StudyId} сделает все за вас. Что происходит, так это то, что каждый раз, когда selectedItem в dataGrid изменяется, текст будет меняться вместе с ним. Дополнительные сведения о привязываемых свойствах: livedocs.adobe.com/flex /3/html/ - person CookieOfFortune; 10.06.2009
comment
Я отформатировал код ... Мне нужно использовать события отправки ... Можете ли вы написать код для событий отправки ... Кроме того, я могу взять полный объект исследования ... нет необходимости разделять внутренние детали ... Пожалуйста, помогите ... .Спасибо.. - person user120118; 10.06.2009
comment
Не могли бы вы помочь мне с кодом, пожалуйста... Я не знаю, как отправить событие..... Я буду вам очень благодарен.. - person user120118; 10.06.2009
comment
о, ваш код показывает, что вы уже отправляете StudyEvent. - person CookieOfFortune; 10.06.2009
comment
также нет, ваш код не отформатирован. Посмотрите, как он отображается на странице. - person CookieOfFortune; 10.06.2009
comment
Можете ли вы помочь мне с частью события отправки, относящейся к моему вопросу... например, как отобразить исследование в текстовой области? - person user120118; 10.06.2009
comment
Могу ли я написать: частная функция itemClickEvent(event:ListEvent):void { var study:Object=event.currentTarget.selectedItem.Study; dispatchEvent(новый StudyEvent(исследование)); } - person user120118; 10.06.2009
comment
да, форматировать в комментариях нельзя, да, можно написать что-то подобное. - person CookieOfFortune; 10.06.2009
comment
но в этом случае вы можете просто прослушивать это событие непосредственно из main. - person CookieOfFortune; 10.06.2009
comment
Я написал рассылку, как показано выше.... как написать слушателю, чтобы показать детали исследования в текстовой области ?? Обработчик общедоступных функций(): недействительным {studyid.addEventListener(MouseEvent.CLICK, StudyEvent); } Здесь StudyEvent — это событие в теге метаданных. Как сделать так, чтобы детали исследования отображались в текстовой области?? Пожалуйста... Я думаю, что это последняя часть ответа... - person user120118; 10.06.2009
comment
Как добавить данные исследования в мою текстовую область... после того, как слушатель будет написан, как показано выше.. - person user120118; 10.06.2009
comment
Кроме того,... studyid.addEventListener(MouseEvent.CLICK, StudyEvent); ....это правильно..потому что..здесь..StudyEvent - это событие, а не функция?? - person user120118; 10.06.2009
comment
Ну, я думаю, у вас, вероятно, будет функция addEventListener() в вашем событии init() для вашего основного компонента, поэтому она будет присоединена при запуске. Подпись для addEventListener — это addEventListener (eventType: String, listener: function). Таким образом, прослушиватель должен быть именем функции, которую вы хотите вызвать при обнаружении события. Я предпочитаю называть свои слушатели событий как [EventName]Listener, поэтому для этого будет приватная функция studyEventListener(event:StudyEvent):void {...}. Затем в основном есть Studyid.addEventListener(StudyEvent.EVENT_TYPE, studyEventListener); - person CookieOfFortune; 10.06.2009
comment
упс, я имел в виду изучениеSelectedListener. В любом случае, я снова отформатировал ваш код для вас. - person CookieOfFortune; 10.06.2009
comment
... Взгляните на мои правки к моему ответу, это лучше объясняет. - person CookieOfFortune; 10.06.2009
comment
Спасибо... за это объяснение.....1> StudyEvent.STUDYSELECTED .. к чему здесь относится 'STUDYSELECTED'? Относится ли это к событию, упомянутому в метатеге, т.е. ‹mx:Metadata›[Event(name=studySelected, type=one.StudyEvent)]‹/mx:Metadata› ...2› И если мне нужно извлечь отдельные данные, т.е. userId, имя и т. д. из объекта Study, как мне разделить это в моем event.value? - person user120118; 10.06.2009
comment
Также: я отправляю событие следующим образом: dispatchEvent(new StudyEvent(_study)); .... Разве мне не нужно ПОЛУЧАТЬ значение _study в моем основном компоненте. Могу ли я напрямую получить к нему доступ, как вы показали? - person user120118; 10.06.2009
comment
Вы использовали StudySelected в качестве имени события, обычно создается общедоступная статическая строка, равная этому значению. Таким образом, вам просто понадобится общедоступная статическая переменная STUDYSELECTED = studySelected в вашем классе StudyEvent. Я изменил способ получения ценности обучения, чтобы отразить то, что вы сделали в своем коде, ознакомьтесь с правкой. - person CookieOfFortune; 10.06.2009
comment
Ошибка: тип не найден или не является константой времени компиляции: StudySelectedEvent. частная функция StudySelectedListener (событие: StudySelectedEvent): недействительно - person user120118; 10.06.2009
comment
Предупреждение: переменная STUDYSELECTED не имеет объявления типа. общедоступный статический var STUDYSELECTED = StudySelected; - person user120118; 10.06.2009
comment
И это предупреждение для объявления в классе StudyEvent.... Кстати, класс StudyEvent был назван StudySelectedEvent в основном пакете..... - person user120118; 10.06.2009
comment
? Откуда вы взяли StudySelectedEvent, если вы его переименовали, то нужно переименовать объявленный вами класс. STUDYSELECTED — это строка, которую я забыл указать в объявлении типа, должно быть STUDYSELECTED:String = StudySelected. - person CookieOfFortune; 10.06.2009
comment
Хорошо...предупреждение было удалено..Но ошибка.. : Ошибка: Тип не найден или не является константой времени компиляции: studySelected. частная функция StudySelectedListener(event:studySelected):void Все еще существует.... что должно событие: ?? быть ... перепробовал все возможные комбинации..... И да, я переименовал классы... с StudySelectedEvent - person user120118; 10.06.2009
comment
событие: StudyEvent. Я думаю, поскольку вы переименовали ii, это должно быть событие: StudySelectedEvent. Я думаю, вам следует прочитать больше руководств по основам программирования Flex и Actionscript в целом, поскольку вы запрашиваете здесь довольно простые концепции. - person CookieOfFortune; 10.06.2009
comment
Хорошо... Я проверю это... Я скомпилировал код... он построен... в текстовой области, выбранная строка сетки данных не добавляется... - person user120118; 10.06.2009
comment
Установите точки останова в обработчиках событий, чтобы убедиться, что сообщение передается правильно. - person CookieOfFortune; 10.06.2009
comment
Эй... есть некоторая проблема... Первая строка сетки данных, если она выбрана по элементу, не отображается в текстовой области.... Все остальные строки могут быть выбраны и отображены соответствующим образом... Можете ли вы сказать об ошибке? - person user120118; 11.06.2009
comment
Возникла ли проблема со строкой с индексом 0... т.е. с первой строкой.... Но я не использую какие-либо настройки индекса в своем коде... в идеале это должно быть правильно... - person user120118; 11.06.2009
comment
Я думаю, что строка заголовка может иметь индекс -1, вам придется обрабатывать это в ваших прослушивателях событий. - person CookieOfFortune; 11.06.2009
comment
Не удается получить доступ к свойству или методу нулевой ссылки на объект. - Это ошибка, которую я получаю в фоновом режиме, но она показывает данные всех потоков, кроме первого .... Любые изменения в коде ?? - person user120118; 12.06.2009
comment
Может быть, вы не вставили данные для строки 0? - person CookieOfFortune; 12.06.2009
comment
Вставить...заполняю данные из файла...Данные также отображаются в сетке данных..Проблема с первой строкой..Кроме того, другие строки отображаются, но в фоновом режиме выдается эта ошибка ... - person user120118; 12.06.2009
comment
При нажатии на первую строку данные не отображаются в текстовой области, что не относится к другим строкам. - person user120118; 12.06.2009
comment
Есть некоторая проблема в том, как объект был реализован.. Можете ли вы помочь разобраться и решить это... - person user120118; 12.06.2009