2

私はまだ Adob​​e Air/Flex の初心者であり、SQL についてはまだかなり新しいものです。

私はこの ( http://coenraets.org/blog/2008/11/using-the-sqlite-database-access-api-in-air …-part-1/) コードをダウンロードし、それを調べてきました。私は別のアイデアを実装しようとしています。

このフォームにはキャンバスを使用しています。

MaterialForm.mxml は、このフォームから保存された情報を含むデータグリッドも表示するパネル CadastroMaterial.mxml によって呼び出されます。

SQL ステートメントは、lib flexlib を使用して MaterialEvent.as によって作成されます。

データグリッドからコンボボックスにデータを取得する際に問題が発生しました。データを取得するためにこの方法を実行しています:

<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" xmlns="*" width="388" height="475"     creationComplete="init()" label="{_material.material_id > 0 ? _material.tipo : 'Novo Material'}">

<mx:Script>
    <![CDATA[
        import mx.controls.Alert;
        import mx.managers.PopUpManager;
        import Eventos.MaterialEvent;

        import Eventos.TMaterialEvent;
    import Formularios.TMaterialForm;
    import mx.collections.ArrayCollection;

    [Bindable] private var tMateriais:ArrayCollection;
    // Para criar a conexão com o banco de dados
    private function openDatabase():void
    {
        var file:File = File.applicationDirectory.resolvePath("bd/SISC.db");
        sqlConnection = new SQLConnection();
        sqlConnection.open(file);
        // Para verificar se o banco de dados já existe se sim utiliza-o senão cria um novo, não é útil se não cria a tabela
        //var isNewDB:Boolean = !file.exists;
        //if (isNewDB) createDatabase();

        findAll();
    }

    // Para selecionar a tabela do banco de dados desejada
    private function findAll():void
    {
        var stmt:SQLStatement = new SQLStatement();
        stmt.sqlConnection = sqlConnection;
        stmt.text = "SELECT tmaterial FROM TMATERIAL";
        stmt.execute();
        tMateriais = new ArrayCollection(stmt.getResult().data);
    }





        [Bindable] public var _material:Object;

        public var sqlConnection:SQLConnection;

        private var validators:Array;

        private function init():void
        {
            validators = [tipoValidator, responsavelValidator, compartimentoValidator];
            openDatabase();// colocado para abrir o banco de outro lugar
        }

        public function set material(material:Object):void
        {
            _material = material;
        }

        public function get material():Object
        {
            return _material;
        }

        private function save():void
        {
            if (Validator.validateAll(validators).length>0)
            {
                return;
            }

            _material.tipo = tipo.text;
            _material.num = num.text;
            _material.responsavel = responsavel.text;
            _material.compartimento = compartimento.text;
            _material.observacoes = observacoes.text;
            if (_material.material_id > 0)
            {
                update();
            }
            else
            {
                insert();
            }
        }

        private function insert():void
        {
            try 
            {
                var stmt:SQLStatement = new SQLStatement();
                stmt.sqlConnection = sqlConnection;
                stmt.text = 
                    "INSERT INTO material (tipo, num, responsavel, compartimento, observacoes) " +
                        "VALUES (:tipo, :num, :responsavel, :compartimento, :observacoes)"; 
                stmt.parameters[":tipo"] = _material.tipo; 
                stmt.parameters[":num"] = _material.num; 
                stmt.parameters[":responsavel"] = _material.responsavel; 
                stmt.parameters[":compartimento"] = _material.compartimento; 
                stmt.parameters[":observacoes"] = _material.observacoes;
                stmt.execute();
                _material.material_id = stmt.getResult().lastInsertRowID;
                label = _material.tipo;
                dispatchEvent(new MaterialEvent(MaterialEvent.CREATE, _material, true));
            }
            catch (error:SQLError)
            {
                Alert.show(error.details, "Erro");
            }
        }

        private function update():void
        {
            try
            {
                var stmt:SQLStatement = new SQLStatement();
                stmt.sqlConnection = sqlConnection;
                stmt.text = 
                    "UPDATE material set " + 
                        "tipo=:tipo, " + 
                        "num=:num, " +
                        "responsavel=:responsavel, " +
                        "compartimento=:compartimento, " +
                        "observacoes=:observacoes " +
                        "WHERE material_id=:materialId";
                stmt.parameters[":tipo"] = _material.tipo; 
                stmt.parameters[":num"] = _material.num; 
                stmt.parameters[":responsavel"] = _material.responsavel; 
                stmt.parameters[":compartimento"] = _material.compartimento; 
                stmt.parameters[":observacoes"] = _material.observacoes; 
                stmt.parameters[":materialId"] = _material.material_id; 
                stmt.execute();
                label = _material.tipo;
                dispatchEvent(new MaterialEvent(MaterialEvent.UPDATE, _material, true));
            }
            catch (error:SQLError)
            {
                Alert.show(error.details, "Error");
            }
        }

        private function deleteItem():void
        {
            try 
            {
                var stmt:SQLStatement = new SQLStatement();
                stmt.sqlConnection = sqlConnection;
                stmt.text = "DELETE FROM material WHERE material_id = :materialId";
                stmt.parameters[":materialId"] = _material.material_id; 
                stmt.execute();
                dispatchEvent(new MaterialEvent(MaterialEvent.DELETE, _material, true));
            }
            catch (error:SQLError)
            {
                Alert.show(error.details, "Erro");
            }
        }

    ]]>
</mx:Script>

<mx:Validator id="tipoValidator" required="true" source="{tipo}" property="text"/>
<mx:Validator id="responsavelValidator" required="true" source="{responsavel}" property="text"/>
<mx:Validator id="compartimentoValidator" required="true" source="{compartimento}" property="text"/>

<mx:Form width="381" height="466">
    <mx:FormItem label="Tipo:" required="true">
        <mx:ComboBox dataProvider="{tMateriais}" id="tipo" text="{_material.tipo}" width="200"/>
    </mx:FormItem>
    <mx:FormItem label="Número:">
        <mx:TextInput id="num" text="{_material.num}" width="200"/>
    </mx:FormItem>
    <mx:FormItem label="Responsavel:" required="true">
        <mx:TextInput id="responsavel" text="{_material.responsavel}" width="200"/>
    </mx:FormItem>
    <mx:FormItem label="Compartimento:" required="true">
        <mx:TextInput id="compartimento" text="{_material.compartimento}" width="200"/>
    </mx:FormItem>
    <mx:FormItem label="Observações:">
        <mx:TextInput id="observacoes" text="{_material.observacoes}" width="200"/>
    </mx:FormItem>

</mx:Form>  

<mx:Button label="Salvar" click="save()" left="16" bottom="20"/> 
<mx:Button label="Deletar" click="deleteItem()" left="87" bottom="20"/> 

しかし、結果としてコンボボックス [object Object] に表示され、テーブル TMATERIAL に挿入されたマテリアルのタイプの名前ではなく、テーブル tmaterial に別のフォームで 30 の値を挿入すると、30 は [object Object] としてコンボボックスに表示されます。 ] これをトレースしたところ、エラーはこのような形になっています。誰でも私を助けることができますか?英語で申し訳ありません(Google翻訳)。サンクス。

4

1 に答える 1

1

問題は、ComboBoxファイル内の各アイテムの名前をどのように表示するかについてのヒントが必要なことdataProviderです。デフォルトでは、多くの Flex コンポーネントは 内の要素を探して、dataProviderという名前のプロパティを持っていますlabel。そのようなプロパティが存在し、それが である場合StringComboBoxはそのプロパティの値を表示しlabelます。

の要素にプロパティdataProviderがない場合、Flex コンポーネントはオブジェクトをlabel呼び出します。この場合、出力は「[object Object]」になります。toString()dataProvider

dataProvider の要素にプロパティがない場合は、ComboBox のlabelFieldまたはlabelFunctionプロパティをlabel使用して、名前を表示する方法を ComboBox に指示できます。

プロパティを使用して、ラベルとして使用できるlabelFieldプロパティの名前を指定します(あなたの場合、これはまたはであると思います)dataProvidertipo:tipo

<mx:ComboBox dataProvider="{tMateriais}" id="tipo" labelField="tipo" />

または、labelFunctionプロパティを使用して、 内の各アイテムのラベルを生成するために使用される関数を指定しますdataProvider

<mx:ComboBox dataProvider="{tMateriais}" id="tipo" labelFunction="myLabelFunction" />

labelFunctionは、次のメソッド シグネチャがあります。

private function myLabelFunction(dataProviderItem : Object) : String
于 2013-04-30T02:42:33.720 に答える