Quantcast
Channel: Infragistics Blogs
Viewing all 218 articles
Browse latest View live

igGrid 編集内容をデータベースに更新する

$
0
0

igGrid 上で編集を行い、編集内容をデータベースに更新するサンプルのご紹介です。Entity Framework と連携することで SQL 文を明示的に記述する必要なく、データベースへのコミットまでを行います。今回紹介するコードを反映したサンプルはこちらからダウンロードできますので、サンプルと比較しながら記事をご覧下さい。

ポイントは2点で、UpdateUrl オプションの指定と saveChanges メソッドの呼び出しです。

 

データについて

データの生成は CodeFirst で行います。データのモデルは Customer.cs、コンテキストは DataContext.cs、イニシャライザは DataInitializer.cs です。CustomersController.cs の下記アクション呼び出し時に実データが生成されます。

public ActionResult Index()
{
    return View(db.Customers.ToList());
}

 

igGrid の定義

編集機能の有効化

igGrid の編集機能(Updating)を有効化します。ColumnSettings では必要に応じて入力検証を行っています。

.Features(feature =>
{
    feature
        .Updating()
        .EditMode(GridEditMode.Row)
        .EnableAddRow(false)
        .ColumnSettings(settings =>
        {
            settings.ColumnSetting().ColumnKey("ID").ReadOnly(true);
            settings.ColumnSetting().ColumnKey("Name").Required(true);
            settings.ColumnSetting().ColumnKey("Age").Required(true)
                .NumericEditorOptions(neo =>
                {
                    neo.MinValue(0).MaxValue(130).ValidatorOptions(validation =>
                    {
                        validation.OnChange(true);
                    });
                });
            settings.ColumnSetting().ColumnKey("Address").Required(true);
            settings.ColumnSetting().ColumnKey("RegisteredDate").Required(true);
        });
})

 

UpdateUrl オプションの指定

UpdateUrl に SaveData アクションを指定します。

@(Html.Infragistics().Grid<igGrid_updating.Models.Customer>(Model.AsQueryable())
    .ID("grid1")
    .PrimaryKey("ID")
    .AutoGenerateColumns(false)
    .Columns(column =>
    {
        ...省略...
    })
    .Features(feature =>
    {
        ...省略...
    })
    .UpdateUrl(Url.Action("SaveData"))
    .DataBind()
    .Render())

 

saveChanges メソッドの呼び出し

ランタイムで igGrid に編集を行った後、ボタンクリックのタイミングで saveChanges メソッドを呼び出します。

$("#updateButton").click(function () {
    $("#grid1").igGrid("saveChanges", function (data) {
        writeLog("更新されました。");
    },
    function (jqXHR, textStatus, errorThrown) {
        writeLog("更新に失敗しました。");
    });
});

 

更新処理

SaveData アクションでのデータベース更新

saveChanges メソッドを呼び出すと、UpdateUrl に指定されたアクションが呼び出されます。フォームデータの ig_transactions には igGrid 上での変更内容が格納されていますので、変更内容を読み取り、適宜データベースへの変更を行っています。今回のサンプルでは行の削除と更新を行います。

public ActionResult SaveData()
{
    GridModel gridModel = new GridModel();
    List<Transaction<Customer>> transactions = gridModel.LoadTransactions<Customer>(HttpContext.Request.Form["ig_transactions"]);

    ...省略...

    foreach (Transaction<Customer> t in transactions)
    {
        // 行の削除
        if (t.type == "deleterow")
        {
            Customer row = db.Customers.Find(Int32.Parse(t.rowId));
            db.Customers.Remove(row);
        }
        // 行の更新
        else if (t.type == "row")
        {
            Customer row = db.Customers.Find(Int32.Parse(t.rowId));

            db.Entry(row).State = EntityState.Modified;

            if (t.row.Name != null)
            {
                row.Name = t.row.Name;
            }
            if (t.row.Address != null)
            {
                row.Address = t.row.Address;
            }

            if (t.row.Age > 0)
            {
                row.Age = t.row.Age;
            }
            else if (t.row.Age <= 0)
            {
                response.Add("Failure", false);
                result.Data = response;
                return result;
            }

            if (t.row.RegisteredDate != null)
            {
                row.RegisteredDate = t.row.RegisteredDate;
            }
        }
    }
    // データソースの更新
    db.SaveChanges();

    ...省略...
}

 

 

アプリケーションの実行

アプリケーションを実行し、セルの編集や行の削除を行います。その後、画面左下にある「更新ボタン」をクリックすると saveChanges メソッドの呼び出し、SaveData アクションの呼び出しが行なわれデータベースへの更新が行なわれます。

 

サンプル
igGrid_updating.zip

オンラインサンプル
http://jp.igniteui.com/grid/basic-editing

オンラインヘルプ
http://jp.igniteui.com/help/iggrid-updating


ASP.NET Web API & AngularJS ステップバイステップ ガイド

$
0
0

Big-Bannar-IgniteUI

原文 - A Step-by-Step Guide to Working with the ASP.NET Web API and AngularJS

このブログでは、AngularJS と ASP.NET Web API を使用する方法を手順に従ってご説明します。ここでは AngularJS および Web API の基礎知識が必要となります。以下を使用してハンズオン形式でデータベースからデータをフェッチし、AngularJS アプリケーションに表示します。

  • SQL Server のデータベース
  • Entity Framework データベース - ファーストアプローチのデータ モデル
  • ASP.NET の Web API
  • アプリケーションに Web API を使用

基本的にデータは SQL Server にあり、ASP.NET の Web API を使用し、JSON のデータとして公開されます。その後、ASP.NET の Web API の JSON のデータを AngularJS アプリケーションで使用します。

データベースのセットアップ

以下は city というテーブルで列を持ちます:

clip_image001

以下のデータでテーブルが生成されました:

clip_image003

このテーブルは SQL Server にあり、Entity Framework データベース First アプローチを使用して SQL Server に接続します。

ASP.NET の Web API

まず Visual Studio で Web API プロジェクトを作成します。下の画像のように、ファイル -> 新規プロジェクト -> Web API を選択します。

clip_image005

[OK] をクリックし、ソリューション エクスプローラーで Web API プロジェクトが作成されたことを確認できます。

データ モデルの作成

データモデルを作成するにあたり、Entity Framework Database First アプローチを採用します。まず、プロジェクトのモデル フォルダーを右クリックして [新しい項目の追加] を選択します。

clip_image007

次の画面で [EF Designer from database] を選択します。

clip_image009

次の画面で [New Connection option] をクリックします。データベースの新規接続を作成するために、データベース サーバー名を指定し、ドロップダウンでデータベースを選択します。「Masterjee」データベースで作業しているため、ドロップダウンからこのデータベースを選択して、djpc のデータベース サーバー名を指定しています。

clip_image011

次の画面で接続文字列は既定値のままで、[Next] をクリックします。次の画面でテーブルを選択します。データベースに 1 つのテーブルのみありますのでテーブルのチェックボックスをクリックし、city のテーブルを選択します。

clip_image013

ここまででデータモデルを作成しプロジェクトに追加しました。プロジェクトにモデルの一部として追加された EDMX ファイルがあります。次にプロジェクトをビルドし、問題ないことを確認しましょう。

Web API のスキャフォールディング

さてデータモデルの作成が終わりました。Web API の作成にはコントローラーを右クリックし新規コントローラーを追加します。次の画像のように、インストール済みのコントローラーテンプレートから, [Web API 2 controller with actions, using Entity Framework (Entity Framework を使用したアクションがある Web API 2 コントローラー) ] を選択します。

clip_image015

モデルクラスとして City クラスを選択し、データ コンテキストのクラスに masterjeeEntities を選択します。データベースの名前は masterjee ですべてをデフォルトのままに置く場合、作成されたコンテキスト クラスの名前は [databasename]Entities になります。

clip_image017

[Add] をクリックし、スキャフォールディングを使用し Cities Web API を作成できます。作成されたコントローラー クラスは city テーブル上のすべての CRUD 操作のため Web API があります。

プロジェクトをビルドし、アプリケーションを実行してみましょう。以下の画像のように、作成された API の XML レスポンスがブラウザーに表示されます。

clip_image019

City テーブル上の CRUD 操作のための ASP.NET の Web API を正しく作成できました。

AngularJS アプリケーションの作成

次に API から返されたデータを使用するため AngularJS アプリケーションを作成する必要があります。基本的に作成の必要があるものは以下の通りです:

  1. Web API からデータをフェッチするサービス
  2. $scope オブジェクトを使用しビューへデータを渡すこと及びサービスを使用するコントローラー
  3. データを描画するビュー

サービス

Web API を使用するため AngularJS のサービスを作成しましょう。サービス ファクトリは以下のように作成します:

MyApp.factory('CityService', ['$http', function($http) {
    var urlBase = 'http://localhost:19098/api';
    var CityService = {};
    CityService.getCities = function() {
        return $http.get(urlBase + '/Cities');
    };
    return CityService;
}]);

AngularJS サービスを使用し、$http が HTTP get 処理を行います。AngularJS は使用時にサービスのインスタンスを作成します。そのため、コントローラーにデータが必要でない場合、AngularJS は ASP.NET Web API を呼び出しません。

コントローラー

サービスを作成した後、コントローラーを作成し、$scope オブジェクトに cities を取得するにはサービスを使用します。以下のようにコントローラーを作成します:

MyApp.controller('UpdateController', function($scope, CityService) {
    getCities();
    function getCities() {
        CityService.getCities()
        .success(function(cities) {
            $scope.cities = cities;
        })
        .error(function(error) {
            $scope.status = 'Unable to load customer data: ' + error.message;
        });
    }
});

上記で CityService をコントローラーに注入し、$http.get が成功した場合、$scope の cities のプロパティに返されたデータを割り当てます。

ビュー

ビューで $scope オブジェクトを使用しデータがコントローラーから渡されます。ビューで以下のようにデータを描画します:

<div ng-controller="UpdateController"><table class="table"><tr><th>Id</th><th>Name</th><th>Country</th></tr><tr ng-repeat="a in cities"><td>{{a.Id}}</td><td>{{a.Name}}</td><td>{{a.Country}}</td></tr></table></div>

アプリケーションの実行

以下の画像のようにビューにアプリケーションを実行する際、データがテーブルに描画されます。

clip_image021

まとめ

このブログで ASP.NET の Web API および AngularJS を使用する方法を説明しました。このブログを最後までお読みいただき、ありがとうございました!

WebDataGrid 新規追加行に EditorProvider を利用する

$
0
0

WebDataGrid ではセル編集時にデフォルトで提供されるエディタ以外に EditorProviderという高機能エディタを提供しています。

過去にいくつかの記事で EditorProvider の利用方法をご紹介しておりました。今回は、新規追加行に DropDownProvider という EditorProvider を利用し、行の初期値を規定値の中から選択できるようにします。

 

EditorProvider の準備

EditorProvider は WebDataGrid 配下の EditorProviders コレクションに追加します。EditorProvider の定義方法は下記ブログ記事が参考になります。

WebDataGrid コンボボックスによるセル編集
http://blogs.jp.infragistics.com/blogs/yuki-mita/archive/2014/05/01/26520.aspx

WebDataGrid でカスケードのドロップダウンを作成する
http://blogs.jp.infragistics.com/blogs/mikam/archive/2016/07/19/26757.aspx

 

DropDownProvider を下記のように定義します。

<ig:WebDataGrid ID="WebDataGrid1" runat="server" Height="550px" Width="670px"
    AutoGenerateColumns="False" DataSourceID="SqlDataSource1"><Columns>
        ...省略...
    </Columns><EditorProviders><ig:DropDownProvider ID="WebDataGrid1_DropDownProvider1"><EditorControl ClientIDMode="Predictable" Width="115px"
                DropDownContainerMaxHeight="200px"
                EnableAnimations="False" EnableDropDownAsChild="False"
                DataSourceID="SqlDataSource2"
                DataKeyFields="ID" ValueField="ID" TextField="ColorName"><DropDownItemBinding TextField="ColorName" ValueField="ID"></DropDownItemBinding></EditorControl></ig:DropDownProvider></EditorProviders><Behaviors>
        ...省略...
    </Behaviors></ig:WebDataGrid>

 

EditorProvider の参照

EditorProvider を定義した後、データを表示する明細行と新規追加行それぞれの「Color」列で EditorProvider を参照します。ここでは1つの EditorProvider を明細行と新規追加行で参照していますが、明細行と新規追加行で別々のエディタプロバイダーを参照することもできます。

<ig:WebDataGrid ID="WebDataGrid1" runat="server" Height="550px" Width="812px"
    AutoGenerateColumns="False" DataSourceID="SqlDataSource1">
    ...省略...
    <Behaviors><ig:EditingCore><Behaviors><ig:CellEditing><ColumnSettings><%--明細行で利用するエディタプロバイダー--%><ig:EditingColumnSetting
                            ColumnKey="Color"
                            EditorID="WebDataGrid1_DropDownProvider1" /></ColumnSettings></ig:CellEditing><ig:RowAdding><ColumnSettings><%--新規追加行で利用するエディタプロバイダー--%><ig:RowAddingColumnSetting
                            ColumnKey="Color"
                            EditorID="WebDataGrid1_DropDownProvider1" /></ColumnSettings></ig:RowAdding></Behaviors></ig:EditingCore></Behaviors></ig:WebDataGrid>

 

実行結果

新規追加行の「Color」列で入力を開始すると DropDownProvider が表示されました。新規追加行においても、項目の値を規定値の中から選択することで、入力ミスを抑止することができますので非常に有用です。

image

 

サンプル

サンプルはこちらからどうぞ。
WebDataGrid_EditorProvider_AddNew_CS.zip

 

リファレンス

WebDataGrid でカスケードのドロップダウンを作成する
http://blogs.jp.infragistics.com/blogs/mikam/archive/2016/07/19/26757.aspx

WebDataGrid コンボボックスによるセル編集
http://blogs.jp.infragistics.com/blogs/yuki-mita/archive/2014/05/01/26520.aspx

WebDataGrid JavaScript からエディタプロバイダにアクセスする方法
http://blogs.jp.infragistics.com/blogs/yuki-mita/archive/2014/05/13/26540.aspx

WebDataGrid 入力文字数を制限する方法(EditorProvider)
http://blogs.jp.infragistics.com/blogs/yuki-mita/archive/2014/08/14/26573.aspx

WebDataGrid 利用方法一覧
http://blogs.jp.infragistics.com/blogs/yuki-mita/archive/2013/08/15/26213.aspx

XamDataGrid 複数行表示・複数行入力

$
0
0

XamDataGrid で折り返し表示と複数行入力の設定方法をご紹介します。

XamDataGrid では編集時に表示されるエディタとして、XamTextEditor や XamNumericEditor などの弊社エディタコントロールを利用しております。今回の例では string を扱うセルの折り返し表示と複数行の入力ができるようにしますので、string 列に対応する XamTextEditor へスタイリングを行うことになります。


実装方法

XamDataGrid の編集エディタには、Field.Settings.EditorStyle からスタイル設定を行うことができます。折り返し表示では、TextWrapping プロパティに Wrap を指定します。また、AcceptsReturn プロパティを有効にすることで、編集時に Enter 押下で改行を挿入できるようにします。

<igWPF:Field Name="note"><igWPF:Field.Settings><igWPF:FieldSettings ><igWPF:FieldSettings.EditorStyle><Style TargetType="{x:Type igWPF:XamTextEditor}"><!--折り返し表示--><Setter Property="TextWrapping" Value="Wrap" /><!--Enter による改行挿入--><Setter Property="AcceptsReturn" Value="True"/></Style></igWPF:FieldSettings.EditorStyle></igWPF:FieldSettings></igWPF:Field.Settings></igWPF:Field>

 

実行結果

XamDataGrid 複数行表示・複数行編集


サンプルはこちら
XamDataGrid_Multiline_CS.zip

 

オンラインリソース

フィールドのエディター構成
http://help.jp.infragistics.com/doc/WPF/2016.1/CLR4.0/?page=xamDataGrid_Fields_Editors_Configuration%20.html

英語を使ってコミュニケーションするコミュニティ「en-jp」を発足します!

$
0
0

20160919日の夜、こんな書き込みを Twitter Facebook に書き込みました。

 

ーーーーーーーーーーーーーーーーーーーーーー

 

英語縛りのゆるいコミュニティを立ち上げようと計画しています。LT的にいつもの自分のネタを英語で発表して、懇親会も英語縛りにする会です。流暢に話す必要は全くなくて、とにかく喋ることに慣れることが目的です。月1渋谷、夜開催を考えてますがどうでしょう?

 

私は日本の技術者のレベルが海外に通用しないとは思っていません。しかし、圧倒的にコミュニケーション、特に発信をしていないことは事実です。であれば、そのきっかけになるような会を始めようと思いました。

 

私自身、なんとか英語を喋れるようになった理由は、ある時「喋ると決めたから」の一点に尽きます。間違っていようが、とにかく伝える意思でしゃべることが大事です。同じ戦略の海外の方が日本語を喋ったとして、熱意で通じるな、と思った実感はありませんか?

 

IGJPのセミナールームで集まれるだけ集まって、がやがや英語を喋ってみる、というだけの会です。懇親会があるとすればそこでも英語縛りです。自分が日頃扱っていることならば話しやすいと思いませんか?LTがメインになりますかね。それ自体も皆さんのアイデアがあれば聞いてみたいです。

 

どんな会だったら参加できそうですか?こんなことやってほしい/やってみたい/また思い付きでアホなこと言い始めたな、などなどご意見お待ちしております。

 

会の名前だけ決めてまして、「en-jp」です。いつかロケール設定に、「en-jp」と指定できたらいいなと思いまして。

 

ーーーーーーーーーーーーーーーーーーーーーー

 

Twitter / Facebook ともに予想以上の反響があり、是非この会を始めたいと思います。ちょうど1010日週であれば弊社の本社メンバーも来ているので、参加してもらって進めようと思います。

 

このコミュニティ以外にも、英語を話す機会を提供してくれている場所はたくさんあると思います。こちらでは、日本のIT業界にいるたくさんの優秀な皆さんが、もっと国際発信できるようになるきっかけづくりを目的としています。とはいえ、喋るネタが必ず技術ネタじゃないといけないというわけではなくて、身近にあるもの何でもいいので、この話題ならいくらでも喋れる!という話をぜひ英語で話していきましょう。

 

形式としては、1~5分のLTを基本として、つながりも含めてゆるく進めたいと思います。平日19:30開始で2時間といったところかなと思っています。回によってはゲストを招いてまとまった内容を聞けるようにもしたいと思います。

 

ルールはほとんどありませんが、とにかく英語縛りであることです。せっかくの場ですから英語で話をして、英語でお互いを高めあう会にしたいですね。

 

また、相手の英語や、発表内容を「評論」することを禁止します。前向きに発表者のためになる「意見を伝える」のであれば大歓迎です。この場合も、英語でお願いします。

 

ひとまず、第一回はインフラジスティックス・ジャパンのセミナールームを利用して、10月13日の木曜日、19:30より2時間程度でやりたいとおもいます。ちょうどその時弊社の本社メンバーが来ていますので、ネイティブもいるし、喋ったり意見を聞いたり(私の英語通じてますか?など)ということでやりましょう。

 

現在詳細を準備中です。ぜひ下記コミュニティにご参加いただき、詳細情報をお待ちください。うれしいことに大変著名なスピーカーの皆様、業界を超えた皆様からの賛同の声をいただいており、感激しております。ぜひ皆さんと活発なコミュニケーションができることを楽しみにしております!

 

 https://www.meetup.com/ja-JP/meetup-group-en-jp/

XamDataGrid 列をコードビハインドで明示的に生成する

$
0
0

XamDataGrid の列をコードビハインドで生成する例をご紹介します。データソースには DataTable を利用しています。


XamDataGrid の定義(XAML)

表示する列は動的に変わることを想定し、XAML 側での定義は行っていません。XamDataGrid ではバインドデータから自動的にデータ型に応じた列を生成するようになっています。ここではバインドするデータのうち、表示しないフィールドもあるため AutoGenerateFields に False を指定し、列の自動生成を無効化します。

<igWPF:XamDataGrid DataSource="{Binding}"
                   FieldLayoutInitialized="XamDataGrid_FieldLayoutInitialized"><igWPF:XamDataGrid.FieldLayoutSettings><!--列の自動生成を抑止--><igWPF:FieldLayoutSettings AutoGenerateFields="False"/></igWPF:XamDataGrid.FieldLayoutSettings></igWPF:XamDataGrid>



バインドデータ

データは ID 列、Name 列、Age 列、HomeTown 列を持つ DataTable です。


C#

DataTable dt = new DataTable();
PrimaryColumn[0] = dt.Columns.Add("ID", typeof(int));
dt.Columns.Add("Name", typeof(string));
dt.Columns.Add("Age", typeof(int));
dt.Columns.Add("HomeTown", typeof(string));

// データの行追加
dt.Rows.Add(1, "たかし", 28, "静岡");
...


VB.NET

Dim dt As New DataTable()
PrimaryColumn(0) = dt.Columns.Add("ID", GetType(Integer))
dt.Columns.Add("Name", GetType(String))
dt.Columns.Add("Age", GetType(Integer))
dt.Columns.Add("HomeTown", GetType(String))
' データ行の追加
dt.Rows.Add(1, "たかし", 28, "静岡")
...



列の生成

バインドデータのうち、ID 列は不要とし、Name 列、Age 列、HomeTown 列を生成します。FieldLayoutInitialized イベントをハンドルし、列を FieldLayout.Fields コレクションに追加します。


C#

private void XamDataGrid_FieldLayoutInitialized(object sender, Infragistics.Windows.DataPresenter.Events.FieldLayoutInitializedEventArgs e)
{
    //明示的に列(Field)を生成します。
    //Field.Name プロパティには DataTable の対応する列名を指定します。
    Field nameField = new Field { Name = "Name", Label="名前" };
    e.FieldLayout.Fields.Add(nameField);

    Field ageField = new Field { Name = "Age", Label = "年齢" };
    e.FieldLayout.Fields.Add(ageField);

    Field hometownField = new Field { Name = "HomeTown", Label = "出身地" };
    e.FieldLayout.Fields.Add(hometownField);
}


VB.NET

Private Sub XamDataGrid_FieldLayoutInitialized(sender As Object, e As Infragistics.Windows.DataPresenter.Events.FieldLayoutInitializedEventArgs)
    '明示的に列(Field)を生成します。
    'Field.Name プロパティには DataTable の対応する列名を指定します。
    Dim nameField As New Field() With {
        .Name = "Name",
        .Label = "名前"
    }
    e.FieldLayout.Fields.Add(nameField)

    Dim ageField As New Field() With {
        .Name = "Age",
        .Label = "年齢"
    }
    e.FieldLayout.Fields.Add(ageField)

    Dim hometownField As New Field() With {
        .Name = "HomeTown",
        .Label = "出身地"
    }
    e.FieldLayout.Fields.Add(hometownField)
End Sub



実行結果

データソースの列の内、ID 列以外を表示することができました。

XamDataGrid DataTable バインド

 

サンプル

サンプルはこちらからどうぞ
XamDataGrid_DataTable_Fields_CS.zip
XamDataGrid_DataTable_Fields_VB.zip

 

リファレンス

DataPresenter コントロールを DataSet にバインド
http://help.jp.infragistics.com/doc/WPF/2016.1/CLR4.0/?page=xamDataPresenter_Binding_a_DataPresenter_Control_to_a_DataSet.html

フィールド レイアウトの定義
http://help.jp.infragistics.com/doc/WPF/2016.1/CLR4.0/?page=xamDataPresenter_Define_a_Field_Layout.html

[無料 UI セミナー] 10 周年記念セミナー Infragistics Day 2016 Fall

$
0
0
インフラジスティックス・ジャパン株式会社は 2006 年の日本法人設立から日本における開発生産性の向上に向けて様々な製品、サービス、サポートを提供して参りました。 今回弊社の 10 年の歩みを振り返るとともに次の 10 年に向けた弊社のビジョン、製品ロードマップをお伝えさせていただくセミナーを企画いたしました。デスクトップ、Web に加えモバイルと様々なプラットフォームへの対応、開発スピードの向上など開発組織が直面する課題をぜひ解決させていただければと考えております。 セミナー概要 Infragistics Day 2016 Fall インフラジスティックス・ジャパン株式会社 10 周年記念セミナー 日時: 2016 年 10 月 12 日 (水) 13:15 - 18:30 (12:45 開場) 場所: 日本マイクロソフト株式会社 31F セミナールーム C+D...(read more)

WebDataGrid で複数列のドロップダウンを作成する

$
0
0

 

以前のブログにて WebDataGrid でカスケードのドロップダウン列を作成する方法をご紹介しました。今回は、一つの列のドロップダウンで複数列を持つリストを表示させる方法をご紹介します。

下の図は完成後の WebDataGrid です。DropDownCol 列のドロップダウンに WebDataGrid を表示することにより、複数列表示を行っています。このサンプルではドロップダウン内のグリッドで選択された行のうち、 col2 列の値がドロップダウンの選択値( = WebDataGrid のセルの値)となります。

 

clip_image002

 

コーディングを始めます。

まずは aspx 上での WebDataGrid の定義、およびコードビハインド側でデータソース用に定義したDataTableです。

 

<ig:WebDataGrid ID="WebDataGrid1" runat="server" Height="350px" 
								Width="400px" DataKeyFields="ID" AutoGenerateColumns="False"><Columns><ig:BoundDataField DataFieldName="ID" Key="ID"><Header Text="ID"></Header></ig:BoundDataField><ig:BoundDataField DataFieldName="DropDownCol" Key="DropDownCol"><Header Text="DropDownCol"></Header></ig:BoundDataField><ig:BoundDataField DataFieldName="TextCol" Key="TextCol"><Header Text="TextCol"></Header></ig:BoundDataField></Columns><EditorProviders><ig:DropDownProvider ID="DropDownProvider1"><EditorControl runat="server" ID="WebDropDown1" 
										DisplayMode="DropDownList"></EditorControl></ig:DropDownProvider></EditorProviders><Behaviors><ig:EditingCore><Behaviors><ig:CellEditing><ColumnSettings><ig:EditingColumnSetting ColumnKey="DropDownCol" 
													EditorID="DropDownProvider1" /></ColumnSettings></ig:CellEditing></Behaviors></ig:EditingCore></Behaviors></ig:WebDataGrid>
    private DataTable getGridData()
    {
        DataTable table = new DataTable();

        table.Columns.Add("ID", typeof(Int32));
        table.Columns.Add("DropDownCol", typeof(string));
        table.Columns.Add("TextCol", typeof(string));

        table.Rows.Add(new object[] { 0, "test2", "Kanagawa" });
        table.Rows.Add(new object[] { 1, "test3", "Tokyo" });
        table.Rows.Add(new object[] { 2, "test1", "Chiba" });
        table.Rows.Add(new object[] { 3, "test4", "Saitama" });

        table.PrimaryKey = new DataColumn[] { table.Columns["ID"] };

        return table;
    }

 

列は <Columns> 以下に「 ID 」、「 DropDownCol 」、「 TextCol 」の3列を定義しました。 DropDownCol をドロップダウンを表示させる列として使用します。ID はプライマリーキー列です。

エディタとしてドロップダウンを使用するため、 DropDownProvider を <EditorProviders> に追加しました。また、セル編集を有効にするため、 <Behaviors> に EditingCore.CellEditing を定義しました。 EditingColumnSetting 設定により、 DropDownCol 列に DropDownProvider が紐づけられています。

 

このままでは DropDownProvider のエディタコントロールである WebDropDown1 はまだ空の状態です。 ドロップダウンに WebDataGrid を表示させるための ItemTemplate を実装します。

コードビハインドにて ITemplate インターフェイスを実装したクラスの定義を行います。

 

private class MultiColumnTemplate : ITemplate
{
	public void InstantiateIn(Control container)
	{
		//WebDataGridを生成します
		WebDataGrid myGrid = new WebDataGrid();

		myGrid.ID = "TemplateGrid";
		myGrid.DataSource = GetDropDownData();
		myGrid.DataBind();
		myGrid.Width = new Unit("100%");

		//WebDataGridの選択機能を有効にします
		myGrid.Behaviors.CreateBehavior<Selection>();
		myGrid.Behaviors.Selection.CellClickAction = CellClickAction.Row;
		myGrid.Behaviors.Selection.RowSelectType = SelectType.Single;

		//RowSelectionChangedクライアントサイドイベントをフックアップします
		myGrid.Behaviors.Selection.SelectionClientEvents.RowSelectionChanged = "TemplateGrid_RowSelectionChanged";

		container.Controls.Add(myGrid);
	}

	private DataTable GetDropDownData()
	{
		DataSet ds = new DataSet();

		DataTable table = new DataTable();

		table.Columns.Add("col1", typeof(Int32));
		table.Columns.Add("col2", typeof(string));
		table.Columns.Add("col3", typeof(string));

		for (int i = 0; i < 5; i++)
		{
			table.Rows.Add(new object[] { i, "test" + i.ToString(), "TEST" });
		}

		table.PrimaryKey = new DataColumn[] { table.Columns["col1"] };

		ds.Tables.Add(table);

		return table;
	}
}

 

InstantiateIn() メソッドでテンプレートに使用する WebDataGrid を生成しています。ここではデータのバインドを行い、選択機能を有効にしておきます。行選択が行われた際に発生する RowSelectionChanged イベントがフックアップされていますが、内容は後ほど説明します。

 

次に、同じくコードビハインドにて DropDownProvider の設定を行います。

以下の記述をコードビハインドの Page_Load() に追加します。上で作成した MultiColumnTemplate クラスの割り当てもここで行います。

 

//ドロップダウンの幅を設定します
DropDownProvider1.EditorControl.DropDownContainerWidth = 400;

//DropDownItemを作成し、WebDropDownに追加します
DropDownItem ddItem = new DropDownItem();
DropDownProvider1.EditorControl.Items.Add(ddItem);

//WebDropDownのドロップダウンで使用するItemTemplate(WebDataGrid)を割り当てます
DropDownProvider1.EditorControl.ItemTemplate = new MultiColumnTemplate();

 

続いて、ドロップダウンの動作を補足するためのクライアントサイドイベントの実装を行います。先ほどのコードに以下を追加してクライアントサイドイベントのフックアップを行います。

 

//DropDownProviderのクライアントサイドイベントをフックアップします
DropDownProvider1.EditorControl.ClientEvents.ValueChanging = "DropDownProvider1_ValueChanging";
DropDownProvider1.EditorControl.ClientEvents.DropDownOpening = "DropDownProvider1_DropDownOpening";
DropDownProvider1.EditorControl.ClientEvents.DropDownOpened = "DropDownProvider1_DropDownOpened";

 

ここからはこれまでにフックアップしておいたクライアントサイドイベントを javascript で定義していきます。

まず、 ItemTemplate の WebDataGrid で選択行が変わった際に発生する RowSelectionChanged イベントです。ここでは、選択されたグリッド行からドロップダウンの選択値として表示したいセルの値を取得し、 WebDropDown1 の値として設定する処理を実装します。

 

function TemplateGrid_RowSelectionChanged(sender, e) {
	//WebDataGrid の選択された行コレクションを取得します
	var selectedRows = e.getSelectedRows();

	//選択された行コレクションから選択されている行を取得します
	var row = selectedRows.getItem(0);

	//行の 2 番目のセル オブジェクトを取得します
	var cell = row.get_cell(1);

	//セルのテキストを取得します
	var text = cell.get_text();

	//WebDropDownに選択された行の値を設定します
	ig_controls.WebDataGrid1_WebDropDown1.set_currentValue(text, true);
}

 

次に、 DropDownProvider1 の ValueChanging イベントではデフォルトのイベント処理をキャンセルするため、falseを返します。

 

    function DropDownProvider1_ValueChanging(sender, eventArgs) {
        //デフォルトのValueChangingイベントをキャンセルします
        eventArgs.set_cancel(true);
    }

 

DropDownProvider1 のドロップダウンが開く直前に発生する DropDownOpening イベントでは、現在選択されている WebDropDown1 の値を ItemTemplate 内の WebDataGrid の行データから探し、該当する行を選択状態にする処理を行います。

 

    function DropDownProvider1_DropDownOpening(sender, eventArgs) {
        var grid = ig_controls.WebDataGrid1_WebDropDown1_0_TemplateGrid;
        var curentValue = ig_controls.WebDataGrid1_WebDropDown1.get_currentValue();
        var selectedIndex = -1;
        //グリッドの行コレクションをループして選択行を探します
        for (var i = 0; i < grid.get_rows().get_length() ; i++)
        {
            if (grid.get_rows().get_row(i).get_cell(1).get_value() == curentValue)
            {
                selectedIndex = i;
                break;
            }
        }
        //現在の選択をクリアします
        grid.get_behaviors().get_selection().get_selectedRows().clear();
        if (selectedIndex != -1)
        {
            //グリッドの行を選択します
            grid.get_behaviors().get_selection().get_selectedRows().add(grid.get_rows().get_row(selectedIndex));
        }
    }

 

最後に、 ItemTemplate の WebDataGrid がクリックされたタイミングでドロップダウンが閉じるようにするため、ドロップダウンが開いた直後に発生する DropDownOpened イベントで WebDataGrid のエレメントに focus イベントを設定し、 colseDropDown() を実行します。ここでは jQuery を使用しています。

 

function DropDownProvider1_DropDownOpened(sender, eventArgs) {
        //グリッドの行が選択された(グリッドがフォーカスを受けた)タイミングでドロップダウンをクローズする(jQueryを使用)
        $("#WebDataGrid1_WebDropDown1_0_TemplateGrid")
        .focus(function () {
            sender.closeDropDown();
        });
    }

以上で複数列のドロップダウンは完成です。

 

今回のサンプルはこちらからダウンロードいただけます。

 

最後までお読みくださり、ありがとうございました。


WPF XamDataGrid セルの値に応じてセルの色を変える

$
0
0

XamDataGridでよく頂くお問い合わせとして、セルの値に応じてセルの色を変えたい、というものがあります。今回は、その方法についてご紹介したいと思います。

こちらが今回使用するデータです。Score列が80以上のセルの色(背景色)を薄い青色に変えてみましょう。

 

手順は、

  1. IValueConverterインターフェイスを実装するクラスを作成し、クラスのインスタンスをResourcesに追加する。
  2. CellValuePresenterをターゲットとするStyleを作成し、背景色のプロパティに対して1のインスタンスをバインドし、StyleのインスタンスをResourcesに追加する。
  3. XamDataGridのFieldSettingsのCellValuePresenterStyleを2のスタイルにバインドする。

です。

 

では、順に見ていきましょう。

 

1. IValueConverterインターフェイスを実装するクラスを作成し、クラスのインスタンスをResourcesに追加する。

プロジェクトにクラスを追加し、IValueConverterインターフェースを実装します。今回は、MyScoreCellStyleValueConverterという名前で作成することにします。

Convertメソッドで、引数valueで渡されてきた値をint型に変換し、値が80以上であれば、Colors.LightBlueを返します。それ以外はColors.Whiteを返します。

// MyScoreCellStyleValueConverter.cs
public class MyScoreCellStyleValueConverter : IValueConverter
{
    // ソース(=Score値)からターゲット(=セルの背景色)への変換処理
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        // Score値をscoreに代入する
        int score;
        if(Int32.TryParse(value.ToString(), out score)){
            // Score値が80以上の場合
            if(score >= 80)
            {
                // LightBlueを返す
                return Colors.LightBlue;
            }
        }
        // ここまでの条件に当てはまらなかった場合は、Whiteを返す
        return Colors.White;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

MainWindow.xamlで、MyScoreCellStyleValueConverterクラスのインスタンスをResourcesに追加します。KeyはmyScoreCellStyleValueConverterとしておきます。

<!-- MainWindow.xaml --><Window.Resources><local:MyScoreCellStyleValueConverter x:Key="myScoreCellStyleValueConverter" /></Window.Resources>

 

2. CellValuePresenterをターゲットとするStyleを作成し、背景色のプロパティに対して1のインスタンスをバインドし、StyleのインスタンスをResourcesに追加する。

セルのStyleを設定する際に使用するTargetTypeはCellValuePresenterです。背景色のプロパティはBackground、ValueにはSolidColorBrushのインスタンスを設定します。SolidColorBrushのColorプロパティには、1で作成したMyScoreCellStyleValueConverterクラスのインスタンスをConverterとしてバインドし、パスにはDataItem.Scoreを指定します。

ここでのポイントは、

  • TargetTypeはCellValuePresenterである。
  • CellValuePresenterのDataContextはDataRecordクラスである。よって、あるセルの値をPathに指定したい場合は、DataItem.<プロパティ名>やCells[<列名>].Valueでできる。

の2点です。

では、このStyleをResourcesに追加します。KeyはmyScoreCellStyleとしておきます。1とまとめると以下のようなXAMLになります。

<!-- MainWindow.xaml --><Window.Resources><local:MyScoreCellStyleValueConverter x:Key="myScoreCellStyleValueConverter" /><Style TargetType="{x:Type igDP:CellValuePresenter}" x:Key="myScoreCellStyle"><Setter Property="Background"><Setter.Value><SolidColorBrush Color="{Binding Path=DataItem.Score, Converter={StaticResource myScoreCellStyleValueConverter}, Mode=OneWay}"/></Setter.Value></Setter></Style></Window.Resources>

 

3. XamDataGridのFieldSettingsのCellValuePresenterStyleを2のスタイルにバインドする。

2で作成したStyleを列に紐づけるには、FieldSettingsクラスのCellValuePresenterStyleプロパティを使います。

<!-- MainWindow.xaml --><igDP:XamDataGrid.FieldLayouts><igDP:FieldLayout><igDP:FieldLayout.Fields><igDP:Field Name="Score"><igDP:Field.Settings><igDP:FieldSettings CellValuePresenterStyle="{StaticResource myScoreCellStyle}"></igDP:FieldSettings></igDP:Field.Settings></igDP:Field></igDP:FieldLayout.Fields></igDP:FieldLayout></igDP:XamDataGrid.FieldLayouts>

 

以上で出来上がりです。Score列が80以上のセルが薄い青色になりました!

 

今回のサンプルはこちらからダウンロードできます。

サービスリリースのお知らせ 2016年 9月 - Infragistics Windows Forms

$
0
0
インフラジスティックス・ジャパンでは 2016 年 10 月 3 日付で下記製品のサービスリリースを提供開始致しました。 Windows Form9 Infragistics Windows Forms 2016 Volume 1 Service Release (Build 2088) Infragistics Windows Forms 2015 Volume 2 Service Release (Build 2118) Infragistcs Windows Forms 修正一覧16.1 Infragistcs Windows Forms 修正一覧15.2 ダウンロード: ホットフィックスダウンロードは弊社サイト登録者情報-キーとダウンロードより可能です。 ダウンロードの際はバージョン番号をお確かめ下さい。 アップデート方法: Visual Studioを起動している場合は終了させて下さい。 今回リリースされたインストーラーを起動させ、インストールを開始して下さい。 インストール終了後、Visual Studioを起動させ、ツールボックスに以前のビルドバージョンでのコン ポーネントが表示されている場合は該当する全てのツールコンポーネントを削除してください。...(read more)

サービスリリースのお知らせ 2016年9月 - Infragistics Ignite UI

$
0
0
インフラジスティックス・ジャパンでは 2016 年 10 月 3 日付で下記製品のサービスリリースを提供開始致しました。 Ignite UI Infragistics Ignite UI 2016 Volume 1 Service Release (Build 2145) Infragistics Ignite UI 2015 Volume 2 Service Release (Build 2323) Infragistics Ignite UI 修正一覧16.1 Infragistics Ignite UI 修正一覧15.2 ダウンロード: ホットフィックスダウンロードは弊社サイト登録者情報-キーとダウンロードより可能です。 ダウンロード ダウンロードの際はバージョン番号をお確かめ下さい。 アップデート方法 Visual Studioを起動している場合は終了させて下さい。 今回リリースされたインストーラーを起動させ、インストールを開始して下さい。 インストール終了後、Visual Studioを起動させ、ツールボックスに以前のビルドバージョンでのコン ポーネントが表示されている場合は該当する全てのツールコンポーネントを削除してください。...(read more)

サービスリリースのお知らせ 2016年9月 - Infragistics ASP.NET

$
0
0
インフラジスティックス・ジャパンでは 2016 年 10 月 3 日付で下記製品のサービスリリースを提供開始致しました。 ASP.NET Infragistics ASP.NET 2016 Volume 1 Service Release (Build 2117) Infragistics ASP.NET 2015 Volume 2 Service Release (Build 2273) Infragistics ASP.NET 修正一覧16.1 Infragistics ASP.NET 修正一覧15.2 ダウンロード: ホットフィックスダウンロードは弊社サイト登録者情報-キーとダウンロードより可能です。 ダウンロード ダウンロードの際はバージョン番号をお確かめ下さい。 アップデート方法 Visual Studioを起動している場合は終了させて下さい。 今回リリースされたインストーラーを起動させ、インストールを開始して下さい。 インストール終了後、Visual Studioを起動させ、ツールボックスに以前のビルドバージョンでのコン ポーネントが表示されている場合は該当する全てのツールコンポーネントを削除してください。...(read more)

サービスリリースのお知らせ 2016年9月 : Infragistics WPF

$
0
0
インフラジスティックス・ジャパンでは 2016 年 10 月 14 日付で下記製品に対しましてのサービスリリースを提供開始致しました。 WPF Infragistics WPF 2016 Volume 1 (Build 2134) Infragistics WPF 2015 Volume 2 (Build 2212) Infragistics WPF 修正一覧16.1 Infragistics WPF 修正一覧15.2 ダウンロード: ホットフィックスダウンロードは弊社サイト登録者情報-キーとダウンロードより可能です。 ダウンロードの際はバージョン番号をお確かめ下さい。 アップデート方法 Visual Studioを起動している場合は終了させて下さい。 今回リリースされたインストーラーを起動させ、インストールを開始して下さい。 インストール終了後、Visual Studioを起動させ、ツールボックスに以前のビルドバージョンでのコン ポーネントが表示されている場合は該当する全てのツールコンポーネントを削除してください。 削除後、一旦、VisualStudioを終了し、Windowsのスタートメニューから、...(read more)

サービスリリースのお知らせ 2016年9月 : Infragistics Silverlight

$
0
0
インフラジスティックス・ジャパンでは 2016 年 10 月 17 日付で下記製品に対しましてのサービスリリースを提供開始致しました。 Silverlight Infragistics Silverlight 2016 Volume 1 (Build 2107) Infragistics Silverlight 2015 Volume 2 (Build 2193) Infragistcs Silverlight 修正一覧16.1 Infragistcs Silverlight 修正一覧15.2 ダウンロード: ホットフィックスダウンロードは弊社サイト登録者情報-キーとダウンロードより可能です。 ダウンロードの際はバージョン番号をお確かめ下さい。 アップデート方法 Visual Studioを起動している場合は終了させて下さい。 今回リリースされたインストーラーを起動させ、インストールを開始して下さい。 インストール終了後、Visual Studioを起動させ、ツールボックスに以前のビルドバージョンでのコン ポーネントが表示されている場合は該当する全てのツールコンポーネントを削除してください。...(read more)

AngularJS での Custom Directives

$
0
0

原文 - Understanding scopes in AngularJS custom Directives

このブログでは、AngularJS カスタムディレクティブのスコープの種類について学びます。はじめにディレクティブの概要、そしてスコープについてご紹介します。

ディレクティブ

最も重要なコンポーネントの 1 つです。

  1. 既存の要素に特別な意味を与えます。
  2. 新しい要素を作成します。
  3. DOM の操作します。

ng-app、ng-controller, そして ng-repeat 以外にも以下の AngularJS に含まれる多くのビルトイン ディレクティブがあります。

  • ng-maxlength
  • ng-minlength
  • ng-pattern
  • ng-required
  • ng-submit
  • ng-blur
  • ng-change
  • ng-checked
  • ng-click
  • ng-mouse
  • ng-bind
  • ng-href
  • ng-init
  • ng-model
  • ng-src
  • ng-style
  • ng-app
  • ng-controller
  • ng-disabled
  • ng-cloak
  • ng-hide
  • ng-if
  • ng-repeat
  • ng-show
  • ng-switch
  • ng-view

主にディレクティブは以下のいずれかのタスクを実行します。

  • DOM の操作
  • データの繰り返し
  • イベントの処理
  • CSS の変更
  • データの検証
  • データ バインディング

Angular チームによって提供されたビルトイン ディレクティブが多くある場合も、カスタムディレクティブの作成が必要な場合があるかもしれません。カスタム ディレクティブは、要素、属性、コメント、またはクラスとして作成できます。このブログでは、以下のようにカスタムディレクティブを簡単に作成します。

MyApp.directive('helloWorld', function () {
    return {
    template: "Hello IG"
    };
});

以下は、カスタム ディレクティブを作成する際の重要事項です。

  • ディレクティブ名は camel ケースである必要があります。
  • ビューでは、ディレクティブが camel ケース名をダッシュ、コロン、アンダースコア、またはその組み合わせで区切って使用できます。

カスタム ディレクティブのスコープ

スコープは、データをカスタム ディレクティブに渡すときにシーンに入ります。スコープは 3 タイプあります:

  1. 共有スコープ
  2. 継承スコープ
  3. 分離スコープ

image

以下のようにスコープ プロパティを true に設定し、継承スコープでカスタムディレクティブを作成できます。

MyApp.directive('studentDirective', function () {
    return {
        template: "
        {{student.name}} is {{student.age}} years old !!",
        replace: true,
        restrict: 'E',
        scope : true ,
        controller: function ($scope) {
            console.log($scope);
}
    }
});

共有スコープと継承スコープ

共有スコープと継承スコープは、簡単に理解できます。共有スコープでディレクティブは囲まれたコントローラーでスコープを共有します。

たとえば、以下のようにコントローラーがあるとします。

MyApp.controller('StudentController', ['$scope', function ($scope) {
    console.log($scope);
    $scope.student = {
        name: "dj",
        age: 32,
        subject: [
            "math",
            "geography"
        ]
    }
    $scope.setGrade = function (student) {
        student.grade = "A+"
    }
}]);

以下で示すようにカスタム ディレクティブを作成しましょう。

MyApp.directive('studentDirective', function () {
    return {
        template: "{{student.name}} is {{student.age}} years old !!",
        replace: true,
        restrict: 'E',
        controller: function ($scope) {
            console.log($scope);
        }
    }
});

以下で示すようにビューで studentdirective を使用できます。

<div ng-controller="StudentController"><student-directive> student-directive></div>

上記のスニペットでは、ディレクティブを div の中で使用しています。 ng-controller ディレクティブは StudentsController に設定しています。スコープ プロパティの値は設定していませんが、デフォルトで共有スコープモードで動作します。ディレクティブは、コントローラースコープにアタッチされるプロパティにアクセスできます。ディレクティブのプロパティの変更はコントローラーに影響します。またその逆の場合も同様です。おそらくスコープ id をコントローラーとディレクティブの両方にプリントしていることにお気づきでしょう。そしてこの両方は同じである必要があります。

image

ただし共有スコープに 1 つ問題があります。ディレクティブにデータを明示的に渡せないということです。

継承スコープでディレクティブはコントローラーのスコープを継承します。ここでは、継承スコープでディレクティブを作成する方法をみていきましょう。

MyApp.directive('studentDirective', function () {
     return {
        template: "{{student.name}} is {{student.age}} years old !!",
        replace: true,
        restrict: 'E',
        scope : true ,
        controller: function ($scope) {
            console.log($scope);
        }
    }
});

継承スコープはネスト カスタム ディレクティブでとても便利です。

分離スコープ

分離スコープでは、ディレクティブはスコープをコントローラーと共有しません。ディレクティブとコントローラーの両方は自身のスコープを持ちます。ただし、データをディレクティブスコープに渡す方法が 3 つあります。

  1. データは @ string literal を使用して文字列として渡すことができます。
  2. データは = string literal を使用して文字列として渡すことができます。
  3. データは & string literal を使用して文字列として渡すことができます。

 

image

分離スコープはコントローラーに他のデータを渡せるため、大変重要です。より理解を深めるために以下のようなコントローラーがあると仮定してみましょう。

MyApp.controller("ProductController", function ($scope) {
    $scope.product1 = {
        name: 'Phone',
        price: '100',
        stock: true
    };
    $scope.product2 = {
        name: 'TV',
        price: '1000',
        stock: false
    };
    $scope.product3 = {
        name: 'Laptop',
        price: '800',
        stock: false
    };
    $scope.ShowData = function () {
        alert("Display Data");
    }
});

ご覧のとおり 3 つの製品がありますが、それらを個別に渡します。

データを文字列として渡す

分離スコープでは、@ string literalを使用してデータを文字列として渡すことができます。以下のように入力パラメーターとして文字列を許可するカスタムディレクティブを作成できます。

MyApp.directive('inventoryProduct', function () {
    return {
        restrict: 'E',
        scope: {
            name: '@',
            price:'@'
        },
        template: '{{name}} costs {{price}} $Change name'
    };
});

上記の例では、@ literal を使用して文字列パラメーターを渡しています。つまり、文字列が名前と価格の変数で渡されます。以下のようにディレクティブはビューで使用できます。ディレクティブで名前と価格の文字列を渡しています。

<div ng-controller="ProductController"><h1>{{product1.name}}</h1><inventory-product name="{{product1.name}}" price="{{product1.price}}">inventory-product></div>

アプリケーションの実行時、product1 の名前と格が表示されます。

 

image

Change name ボタンをクリックした際に、ディレクティブの名前のみが変更されて、ProductController product1 オブジェクトは分離スコープに影響を受けません。

image

分離スコープを文字列としてパスした場合は一方向で渡されるため、コントローラースコープの変更はディレクティブに反映されます。ただしディレクティブの変更はコントローラーに反映されません。

データをオブジェクトとして渡す

分離スコープでは、= string literalを使用してオブジェクトとしてデータを渡すことができます。以下のように入力パラメーターとしてオブジェクトを許可するカスタムディレクティブを作成できます。

MyApp.directive('inventoryProduct', function () {
    return {
        restrict: 'E',
        scope: {
            data: '='
        },
        template: '{{data.name}} costs {{data.price}} $Change name'
    };
});

上記では = literal を使用して 1 つのオブジェクト パラメーターを渡しています。オブジェクトがデータ変数を渡します。ディレクティブは以下のようにビューで使用できます。オブジェクティブ変数のオブジェクト値を渡します。

<div ng-controller="ProductController"><h1>{{product1.name}}</h1><inventory-product data="product1">inventory-product><h1>{{product2.name}}</h1><inventory-product data="product2">inventory-product><h1>{{product3.name}}</h1><inventory-product data="product3">inventory-product></div>

上記ではディレクティブを 3 回使用しており、3 つのオブジェクトを入力として渡します。実行時に以下が出力されます。

image

分離スコープのでオブジェクトを渡すとたとえば、以下に示すように product1 を 2 回渡すと仮定しましょう。

<div ng-controller="ProductController"><inventory-product data="product1">inventory-product><inventory-product data="product1">inventory-product></div>

アプリケーションを実行する際、同じオブジェクトがディレクティブの両方のインスタンスに渡されます。

image

 

Change name ボタンのいずれかをクリックすると、同じオブジェクトが渡されて、ディレクティブの両方のインスタンスの名前を変更します。これは同じオブジェクトが渡され、two-way モードでオブジェクトを渡せるためです。ディレクティブの変更はコントローラーに影響します。またその逆の場合も同様です。

 

image

外部関数の呼び出し

外部関数ProductController でご覧いただいたように ShowData() 関数があります。この関数は、以下のようにディレクティブを変更してカスタム ディレクティブで呼び出せます。

MyApp.directive('inventoryProduct', function () {
    return {
        restrict: 'E',
        scope: {
            data: '&',         
        },
        template: '{{data.name}} costs {{data.price}} $Change name'
    };
});

ディレクティブは以下のようにビューで使用できます。

<div ng-controller="ProductController"><inventory-product data="ShowData()">inventory-product></div>

まとめ

このブログでは、ディレクティブの基本的な概要についてご紹介しました。

  1. 共有スコープ: ディレクティブとコントローラー共有ディレクティブに明示的にデータを渡すことはできません。
  2. 継承スコープでディレクティブはコントローラーのスコープを継承します。ディレクティブに明示的にデータを渡すことはできません。
  3. 分離スコープ: ディレクティブとコントローラーはデータとスコープを共有しません。文字列またはオブジェクトとしてデータを渡すことができます。

このブログが少しでも皆様のお役に立てれば幸いです!最後までお読みいただきありがとうございました!


チャートと時間サイクル – Part 1

$
0
0

原文 - Tim Brock - Charts and Cycles of Time - Part 1

チャートと時間サイクル - 前編

私たちの日々の生活はすべて時間に対する予測に依存しています。朝の準備にかかる時間を予測し、アラームを設定します。歩いているときは道路の反対側まで歩くにはどれぐらいの時間がかかるかを判断するとともに、近づいてくる車が横断地点に到達するまでの時間も考えます。このように、さまざまな場面が考えられます。

「道路を渡るのに車の半分の時間がかかる」など、予測は実際には相対的で、「朝の支度に 45 分かかる」などの特定の単位に基づいている場合もあるでしょう。後者の単位の選択、もしくはより形式的な計測をする場合、コンテキストとスケールに基づいて異なります。期間においては世界標準の長さとして秒が使用されます。ミリセカンド (1000 分の 1 秒) も極めて短時間に対しては使用できます。日々の生活では、より短い時間の尺度について考えさせられることはあまり多くありませんが、科学の世界ではマイクロ秒 (100万分の 1 秒)、ナノ秒 (10億分の 1 秒) などがあります。

短い期間に対して標準となっている計測は、10 進数によくフィットしますが、長い期間用の計測システムはあまり洗練されていません。1 分は 60 秒、1 時間は 60 秒、1 日は 24 時間、そして 1 年は 365 日ですね。更に 1 週間は 7 日、1 か月は 28 日から 31 日、1 年は 52 週と 1 日となります。日や年の概念は天文学的な考察からきています(自身の軸と太陽それぞれの地球の回転期間)。月に関しては、もともとは太陰周期のサイクルに関連しています。週に 7 日というのは、おそらくバビロニア暦の astronomical mysticismに由来するものでしょう。日から時間、分から秒はより難解で、ancient Babylonians, Greeks and Egyptiansに遡ります。また 18 世紀後期のフランス人によって試みられた十進化時間の導入は成功しませんでした。

既に接続散布プロット、アニメーション (GIFs形式ですが他の形式も可能です)、スモール マルチプルについては、時間コンポーネントでデータセットを表示する方法としてすでに説明しています。ただし最も一般的な方法は、折れ線チャートです。折れ線チャートは、トレンドや異常を強調するには最適です。これを説明するには、35 日分の売り上げ "Product A" データを示す折れ線チャートをご覧ください。

image

5 分毎の目盛りがより定着していますが、7 日毎に置き換えるとより明確になります。

image

上記チャートから何がわかるでしょうか。急上昇のある通常の上昇トレンド、そして曜日に関連した兆候がみえますか?35 日の場合は、月曜 5 回、5 火曜 5 回 ... と続きます。データを 5 週間に分割し (1 日目は月曜日であると見なします)、各週での変化を観察できます。

image

売り上げは常に日曜日に下がり、平日より土曜日の売り上げが上がります。曜日の比較は少々明確さに欠けますが、すべての週の曜日の平均を組み合わせると分かりやすいかもしれません。

image

このチャートからは、平日の売り上げが他の変動に比べて小さいことがわかります。週 7 日と関係のない天気の方がより影響があるのでは?

このデータを使用して、各データポイントからその曜日の平均を引いて、上記の元の折れ線チャートを変更できます。

image

完全に上向きトレンドですが、15 日目あたりでトレンドがなくなっているように見えます。

日依存をなくすための代替案として、各データポインから 7 日移動平均のプロットがあります。生データを適所に保ちながら、短期間の変動を取り除くことができます。

image

やはり、早い時期に上昇し、期間の半分程いったところで平らになっています。

Part 2 では、時間データを修正して短期間の影響を削除する他の方法があります (こちらを参照)が、代わりに線グラフの確率変数、すなわち長期間のパターンを示しながら短期間のサイクルも視覚化するサイクルプロットについてご紹介予定です。

[16.2] Ignite UI 2016 Vol.2 の新機能

$
0
0
Ignite UI 2016 Vol.2 がリリースされました!! 今回のリリースでは日本のお客様の声から実装された データグリッドでの複数行レイアウト インライン編集のサポートを含む機能拡張、チャートの機能拡張、オープンソース化など非常に多岐に渡る拡張を行いました。 オープンソース化とAngular 2、React への対応 データ グリッドの機能向上 新チャートの追加と機能向上 ASP.NET Core サポート その他の新機能 オープンソース化と Angular 2、React への対応 JavaScript は長い間、「Web の言語」として利用いましたが、近年はより大規模な開発にも用いられるようになってきました。また、ブラウザーだけでなく、サーバー側、あるいは IoT の高まりに合わせデバイス上で動作するソリューションも存在します。そして、そこには多くのオープンソース ライブラリーが存在します。 今回、Ignite UI 2016 Vol.2 の大きなトピックとして Ignite UI の多くのコントロール、コンポーネント、テーマ―をオープンソース化すると共に Angular...(read more)

[無料オンラインセミナー] 2016 Vol.2 最新情報セミナー開催

$
0
0
先日発表させていただきました Infragistics Ultimate 2016 Vol.2 の最新情報をお届けするオンラインセミナーを 2016 年 11 月 17 日 (木) に開催させていただきます。多くの新機能をデモを交えてご紹介いたします! 開催概要 名称: Infragistics Ultimate 2016 Vol.2 最新情報セミナー 日時: 2016 年 11 月 16 日 (木) 15:30 - 17:00 会場: オンライン開催 費用: 無料 定員: 無制限 概要: Infragistics Ultimate 2016 Vol.2 の新機能 をベースに新機能のご説明をデモを交えて行います。 皆様のご参加をお待ちいたしております。...(read more)

[16.2] Infragistics Windows Forms 2016 Vol.2 の新機能

$
0
0
Infragistics Windows Forms 2016 Vol.2 の新機能をご紹介します。今回のリリースでもお客様のご要望を基にこのプラットフォームへの投資を継続しています! UltraOfficeNavBar UltraZoomPanel UltraColorPicker, UltraColorPalette UltraPaletteInfo UltraPieChart UltraOfficeNavBar Outlook で提供されているナビゲーション バーの動作と同じナビゲーションを提供する UltraOfficeNavBar コントロールが追加されました。このコントロールは Outlook 2013 以降において「メール」「予定表」「連絡先」「タスク」などの各画面の情報の一部をポップアップで表示する機能をご提供します。マウスをホバーさせることでポップアップが表示されます。 Outlook 2016 での表示: UltraOfficeNavBar を使った表示 UltraZoomPanel このコントロールはコンテナ コントロールとして提供され、内部コンテンツの拡大や縮小機能を提供します。タッチ環境や高解像度モニター使用時においても既存の...(read more)

igDataChart 積層グラフ(DataChartModel)

$
0
0

igDataChart の積層型シリーズを用いたグラフを作成します。ここでは DataChartModel を利用して、Controller 側で igDataChart を生成していきます。

DataChartModel で生成したオブジェクトは、クライアントに JavaScript として返されます。このため JavaScript の代わりに C# や VB.NET を利用して実装することができます。

 

データモデル

public class CarData
{
    public int Year { get; set; }
    public int BMW { get; set; }
    public int Audi { get; set; }
    public int Honda { get; set; }
}

 



ダミーデータの生成

private IEnumerable<CarData> GetCars()
{
    var Data = new List<CarData>();
    Random rd = new Random();
    for (int i = 0; i < 9; i++)
    {
        Data.Add(new CarData()
        {
            Year = 2000 + (i + 1),
            BMW = (int)Math.Round((double)rd.Next(300), 2),
            Audi = (int)Math.Round((double)rd.Next(300), 2),
            Honda = (int)Math.Round((double)rd.Next(300), 2)
        });
    }
    return Data;
}

 



DataChartModel の生成

// DataChartModel の生成
// DataChartModel に軸、シリーズ、データソースを割り当てます。
DataChartModel model = new DataChartModel();

 



軸の生成

// X 軸、Y 軸の生成
NumericYAxisModel yAxis = new NumericYAxisModel { Name = "Volume" };
CategoryXAxisModel xAxis = new CategoryXAxisModel { Name = "Year", Label = "Year" };
model.Axes.Add(yAxis);
model.Axes.Add(xAxis);

 



シリーズ生成(積層型シリーズ )

// igDataChart(DataChartModel)に割り当てるシリーズリスト
var series = new List<SeriesModel>();

// 積層型柱状シリーズに fragment を割り当て
var colSeries = new StackedColumnSeriesModel();
colSeries.Name = "parent";
colSeries.XAxis = "Year";
colSeries.YAxis = "Volume";
colSeries.Series.Add(fragment1);
colSeries.Series.Add(fragment2);
colSeries.Series.Add(fragment3);
series.Add(colSeries);

// データソースの割り当て
model.DataSource = GetCars();

// 積層型柱状シリーズを igDataChart(DataChartModel)に割り当て
model.Series = series;

// 凡例の生成
model.Legend = new LegendModel { ID = "legend", LegendType = LegendType.Legend };

 



実行結果
igDataChart



サンプル


サンプルはこちらから
igDataChart_StackedColumn_MVC.zip

 

リソース

オンラインヘルプ
http://jp.igniteui.com/help/infragistics.web.mvc~infragistics.web.mvc.datachartmodel

オンラインサンプル
http://jp.igniteui.com/data-chart/stacked-series

Viewing all 218 articles
Browse latest View live