Как назначить dataGrid другому dataGrid в Flex. a = b не работает

в Flex у меня есть что-то вроде этого:

  var dg:DataGrid = new DataGrid();    
  if (something) dg = dg1 else if (something_2) dg = dg2;
  dg.dataProvider.getItemAt(3).id;    

и dg ВСЕГДА указывает на DataGrid (даже если dg1 имеет имя DataGrid_test и dg2 = DataGrid_test2), и, наконец, действие выполняется с моим первым DataGrid (DataGrid_test). Почему? Как я могу передать dg1 или dg2 dg?

Вот вставлен практически полный код этой части приложения. Я отредактировал его, чтобы было понятнее.

    var dg:DataGrid = null; 
    if ( currentState == "state1" ) { //if this condition is true then app. go into if and
        dg = dataGrid_first; // make dg = DataGrid (1)
        test.text = "inco";  // shows "inco" in "test" label
    } else if ( currentState == "state2" ) { // if this is true then app. go..
        dg = dataGrid_second; //here and set dg as DataGrid (exactly!) (2)
        test.text = "outgo"; // and change test label into blank text (earlier text disapears)
    }
    search(dg);

Он изменен по совету «@splash». По-прежнему не работает.

РЕДАКТИРОВАТЬ: Я сделал это редактирование, чтобы ответить для всех, кто помогает мне в этом :) Я думаю, что это будет лучший способ. В кодовом блоке выше я добавил комментарии. (пожалуйста, прочтите сейчас комментарии, а после возвращайтесь сюда :)) Теперь я объясню, что именно происходит. Я отлаживаю его много раз, и вот результаты: dg указывает на DataGrid (как компонент в flex, а не как мой dataGrid_first), мне нужно было расширить DataGrid, поэтому теперь это компонент ColorColumn (я не знаю, правильно ли я его назвал) , а не DataGrid. И dg указывает на ColorColumn, а не на dataGrid_first или dataGrid_second. Я даже попробовал сегодня то же самое, что предлагает @splash:

if ( currentState == "state1" ) { 
    test.text = "inco"; 
    search(dataGrid_first); 
} else if ( currentState == "state2" ) {
    test.text = "outgo";
    search(dataGrid_second);
}

и поиск по-прежнему указывает на ColorColumn: / Моя проблема действительно проста - я просто хочу перейти к поиску разных dataGrid для каждого состояния. Если у вас есть другие идеи, как я могу сделать это правильно, я буду рад услышать об этом. :) Но все равно не понимаю, почему не работает. Моя функция поиска использует алгоритм Boyer-Moor для поиска некоторого текста в dataGrid.dataProvider. Если он что-то находит, он помещается в новый массив, и после передачи всего dataProvider я раскрашиваю строки искомым словом.


person Gut6    schedule 13.05.2011    source источник
comment
Я не уверен, что понимаю, о чем вы спрашиваете. Конечно, это указывает на «DataGrid», это класс ... Кроме того, я не понимаю вашу «логику». Зачем вам вообще создавать DataGrid, если вы все равно собираетесь его переключить? Чрезвычайно запутанный код.   -  person J_A_X    schedule 13.05.2011
comment
Я пишу приложение, которое имеет 2 разных состояния DataGrid. В первом состоянии DataGrid имеет id = dg1, во втором - id = dg2. У меня также есть кнопка с действием Поиск. Эта кнопка находится в обоих состояниях. Теперь я пытаюсь выполнить действие, при котором нажатие Search в первом состоянии переходит к функции поиска dg1, нажатие Search во втором состоянии передает dg2. Это легко, я уверен, но я кое-что упускаю ...: / Вы писали: Зачем вам вообще создавать DataGrid, если вы все равно собираетесь его переключить ?. Какой лучший способ вы предлагаете сделать это?   -  person Gut6    schedule 14.05.2011
comment
Я бы хотел предложить лучшее, но я не могу предложить такой технический вопрос. Чего вы этим пытаетесь достичь?   -  person J_A_X    schedule 14.05.2011
comment
Я отвечу на аналогичный вопрос после этого сообщения, поэтому я пропущу его здесь: Я хочу, чтобы функция поиска выполняла поиск по разным dataGrid.dataProvider в разных состояниях. В state1 функция поиска должна искать текст в dg1, а в state2 функция поиска должна искать в dg2.   -  person Gut6    schedule 15.05.2011
comment
Но зачем вам состояния? Что ищите? Почему их 2?   -  person J_A_X    schedule 15.05.2011
comment
1. Мне нужны состояния, потому что в "state1" у меня есть доходы, а в "state2" - расходы. 2. Поиск предназначен для поиска «таблиц» доходов / расходов по названию набранного текста (например, у меня есть 100 различных доходов в dataGrid, и я хочу найти тот, который имеет в названии «книги». Я ввожу поисковый запрос, нажимаю кнопку поиска и это вызовет функцию поиска. В состоянии 1 он должен искать через dataGrid_first.dataProvider в состоянии 2, он должен искать в dataGrid_second.dataProv .. 3. Есть еще больше состояний, но мне нужен поиск только в этих 2 :)   -  person Gut6    schedule 15.05.2011
comment
Что ж, вот несколько решений. Вы можете использовать состояния, но я не думаю, что это лучший вариант в данном случае. Во всяком случае, просто используйте для этого стек просмотра, чтобы вам не пришлось «переключать» dg vars. Будь проще. Возможно, было бы лучше выполнить поиск по каждой сетке данных, чем иметь 2 сетки данных с одним поиском.   -  person J_A_X    schedule 15.05.2011
comment
У меня есть некоторые другие состояния и некоторые функции в этих состояниях, поэтому мне нужно, чтобы они были в разных состояниях. Я также считаю, что это лучший способ иметь только одну функцию поиска, потому что в обоих случаях она одинакова. Просто dataGrid меняется. Итак, если у меня будет 2 запроса, это будет много почти одного и того же кода.   -  person Gut6    schedule 15.05.2011
comment
Что ж, честно говоря, у меня есть интуиция (каламбур), что вы неправильно проектируете свое приложение или, по крайней мере, не разбиваете большие куски на более мелкие, чтобы уменьшить сложность и увеличить возможность повторного использования. Но опять же, я не могу комментировать, так как я до сих пор не знаю общей картины того, чего вы пытаетесь достичь.   -  person J_A_X    schedule 15.05.2011
comment
Трудно написать о приложении в целом. Я уверен, что, как Вы писали, я не очень хорошо ее построил, потому что это моя первая программа на Flex. :) Я все еще учусь. Так что, возможно, давайте сосредоточимся только на этом факте - как я могу добиться, чтобы функция поиска получала данные от dg1.dataProvider (это массив) в состоянии1, а в состоянии2 функция поиска получала данные из dg2.dataProvider (также массив). Я только что протестировал его разными способами и выяснил, что независимо от того, какой объект я пропущу мимо: search (доход_arr) или поиск (доход_dataGrid), функция поиска получает класс, а не конкретный объект ...   -  person Gut6    schedule 15.05.2011
comment
Хм, это странно. Началось работать! Похоже, у меня invalidateDisplayList () не в том месте. Я добавил его в dataProvider, а не в dataGrid. По-прежнему немного странно, почему это сработало в одном состоянии, а в другом - нет, но я могу понять это сам. Могу ли я дать Вам как-нибудь баллы за то, что помогли мне? Это действительно помогло мне, и я благодарен за это.   -  person Gut6    schedule 15.05.2011
comment
Поскольку invalidateDisplayList () является актуальной проблемой, на самом деле это была проблема визуализации, а не внутрипрограммная структура данных. Пожалуйста, примите один или оба ответа.   -  person SteAp    schedule 15.05.2011
comment
Я думаю, что принятие одного или обоих - не очень хорошая идея, потому что это может ввести в заблуждение других людей, которые ищут в Интернете. И я могу принять только одно. Я хочу бросить Тебя, но для этого мне нужно заработать на 9 очков больше. Когда у меня будет 15 ранговых очков, я отдам все Вам :) Еще раз спасибо!   -  person Gut6    schedule 15.05.2011


Ответы (2)


Если dg никогда не указывает на dg1 и dg2, тогда ваши (something) выражения могут быть оценены как false. Проверьте значение ваших условий if - это должно быть легко отладить.

Это должно работать:

var dg:DataGrid = null;    
if (something) 
    dg = dg1;
else if (something_2) 
    dg = dg2;
if (dg)
{
    // do something with dg
}

[Обновление]

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

if ( currentState == "state1" ) { 
    test.text = "inco"; 
    search(dataGrid_first); 
} else if ( currentState == "state2" ) {
    test.text = "outgo";
    search(dataGrid_second);
}
person splash    schedule 13.05.2011
comment
У меня есть что-то подобное (сейчас я вставил код из приложения, раньше менял, чтобы он был короче). 'код' var dg: DataGrid = null; если (currentState == state1) {dg = dataGrid_first; test.text = inco; } иначе, если (currentState == state2) {dg = dataGrid_second; test.text = outgo; } 'code' В state1 все в порядке, но dg по-прежнему получает DataGrid, а не dataGrid_first. Даже в этом случае делаю то, что я хочу делать. Тест на этикетке показывает, что если все в порядке. В state2 ничего не работает. Ни dg не получает dataGrid_second, ни тест не показывает outgo; - person Gut6; 14.05.2011
comment
Спасибо за помощь мне. :) В разговоре с '@J_A_X' написал, что нашел решение. Я только что неправильно добавил invalidateDisplayList () и поэтому подумал, что это не работает. Он не раскрашивает строки, которые были результатом действий, выполненных этим кодом. Все вы, ребята, мне очень помогли, и я благодарен за это. И, к сожалению, мне не хватает рейтинговых баллов, чтобы проголосовать за Ваш ответ. Еще раз спасибо за помощь, я попробую заплатить вперед пользователям stackoverflow :) - person Gut6; 15.05.2011

Я предлагаю написать это - поскольку я предполагаю, что следует назначить либо dg1, либо dg2:

if (something) {

    dg = dg1;

} else {

    dg = dg2;

}

Могут быть случаи, когда if () {} else () {} не выполняет ни первый, ни второй условный блок.

Наконец, небольшая подсказка, которая структурно устраняет нежелательные присваивания в условиях if: всегда пишите литерал слева от операции сравнения: if ( "state1" == currentState ). Если вы случайно набрали = вместо ==, компилятор Flex выдаст ошибку. Другая нотация автоматически присваивает значение.

Дополнительно: проходили ли вы пошагово код и наблюдали за переменными dg1, dg2 и dg? Если нет, установите точку останова на несколько строк перед оператором if и выполните код шаг за шагом оттуда. Что ты видишь?

Вот еще один совет: используйте утверждения для проверки несоответствий:

package my.company.utilities {

  public function assert(expression:Boolean):void {

      // probably conditionally compile this statement
      if (!expression) {
          throw new Error("Assertion failed!");
      }

  } // assert

}

Используйте это, например, в начале такого метода:

public function doTransaction( fromAccount:int, toAccount:int ) {

  assert( 0 < fromAccount );
  assert( 0 < toAccount );

}

Обычно хорошее использование assert - проверка переменных на предмет их диапазона. Как и в приведенном выше примере, fromAccount и toAccount всегда должны быть положительными. Из-за ошибки в doTransaction () могут передаваться неверные значения. В этом случае утверждение вызывает ошибку.

person SteAp    schedule 14.05.2011
comment
Должен признать, что Ваше предложение «если» действительно интересно. Раньше я не видел ничего подобного, и мне нужно изучить это глубже. Вы писали, что, возможно, if не выполняет одно из тех if, но выполняет. В обоих if я вставил что-то вроде этого: 'test.text = inco;' и во-первых, если он работает, а во-вторых, он не работает. Я думаю, что лучший способ написать об этом - это отредактировать мой первый пост с отформатированным кодом и вставить в него несколько комментариев. Пожалуйста, посмотрите на этой странице мой пост. - person Gut6; 15.05.2011
comment
Да, я сейчас пишу об этом в первом посте, но мне нужно несколько минут :) Я все еще редактирую - person Gut6; 15.05.2011
comment
Я не совсем понимаю, что вы имеете в виду, говоря «установить dg как DataGrid (точно!)»: DataGrid - это класс, а не объект. Таким образом, тип dg может быть DataGrid, но не значением. - person SteAp; 15.05.2011
comment
Просто для ясности: вы говорите о проблеме со зрением? Визуальное представление dg не меняется? Или вы технически говорите о внутрипрограммной ценности? - person SteAp; 15.05.2011
comment
Я говорю о внутрипрограммной ценности. Я хочу, чтобы функция поиска просматривала разные dataGrid.dataProvider в разных состояниях. В state1 функция поиска должна искать текст в dg1, а в state2 функция поиска должна искать в dg2. - person Gut6; 15.05.2011
comment
Возможно, вы оставили мои комментарии в разговоре с '@J_A_X', так что вы, вероятно, теперь эта проблема была совсем в другом месте. Вы предложили мне отладить его точно, поэтому я, наконец, поставил точки останова почти в каждой строке и понял, что все в порядке. Я просто неправильно добавил invalidateDisplayList (), поэтому строки просмотра не были раскрашены. Я дам Вам стрелку вверх (этот ответ полезен), потому что Вы (ну, все Вы, написавшие в этой теме) действительно помогли мне разными идеями решения :) - person Gut6; 15.05.2011
comment
Ох, а также спасибо за утверждения. Раньше я задавался вопросом, как я могу сделать что-то подобное, поэтому в будущем я буду использовать это. Комментарии можно редактировать только в течение 5 минут (нажмите на это поле, чтобы закрыть). P.S - к сожалению, я не могу проголосовать за это, потому что у меня недостаточно ранговых очков. : / - person Gut6; 15.05.2011