XMLからformのDataGridViewへ値をセットして更新

やってることー
1)xmlからsymbolを読み込み、TokenList mySymbolTokenList に格納する
2)mySymbolTokenListを使って、
	a)QuotesProviderをインスタンス生成しupdateイベントハンドラをセットする
	b)GridDataViewに必要分のGridDataViewRowを生成する
	c)symbolと、生成したGridDataViewRowを格納したDictionary SymbolRowDictionaryを生成する
3)前述(2)で生成したQuotesProviderのupdateイベントのハンドラにおいて更新されたsymbolとSymbolRowDictionaryを紐付けて
GridDataViewRowのセル内容を更新する


```easylanguage

{
updates

//2019/3/15
ListView1の更新データを０行目にinsertRowするように変更

}

using elsystem;			//datetime
using tsdata.common;    //TokenList
using tsdata.marketdata;//QuotesProvider
using elsystem.xml;     //xml
using elsystem.collections; //Vector;
using elsystem.windows.forms; //form

//const
const:
    //Dropboxディレクトリにあるxmlファイルを開く
    string FILE_URL("E:\チーム Dropbox\kamo tsuyoshi\TradeStation\project_0314\sourceSymbol.xml");
//var
var:TokenList mySymbolTokenList(null);
var:Vector QuotesProvidersVector(null);

var:Dictionary SymbolRowDictionary(null);
var:Dictionary SymbolQuotesProviderDictionary(null);

method void AT_initialized( elsystem.Object sender, elsystem.InitializedEventArgs args ) 
begin
    //--------------------------------
    //環境セットアップ
    //--------------------------------

    //Dictionaryインスタンス生成
    SymbolRowDictionary = Dictionary.Create();
    SymbolQuotesProviderDictionary = Dictionary.create();
    //Vectorインスタンス生成
    QuotesProvidersVector = Vector.Create();


    //mySymbolTokenListを指定のxmlファイルから生成し、TokenList mySymbolTokenListに格納
    //**関数からの戻り値はobjectを戻せない、stringで受取ってからTokenListを作る。二度手間
    mySymbolTokenList = TokenList.create($getStringFromXML(FILE_URL)); 

    //GUI作成のformを表示する
    form1.show();
    //formをセットアップ
    fillListView();
    fillGrid();


    createQuotesProvider();


end;


//--------------------------------------------
// provider 初期化
//--------------------------------------------
method void createQuotesProvider()
var:TokenList list ,QuotesProvider QP , int n;
begin
    list = TokenList.Create();
    list.add("SymbolRoot");
    list.Add("vwap");
    list.Add("description");
    list.Add("Ask");
    list.Add("Bid");
    list.add("asksize");
    list.Add("bidsize");
    list.Add("PreviousClose");
    list.Add("last");
	list.add("ExchangeListed");	//銘柄が上場している取引所



    for n=0 to mySymbolTokenList.Count-1 begin

        QP = new QuotesProvider;
        QuotesProvidersVector.push_back(QP);    //インスタンスを動的配列にセットしておく

        QP.Fields = list;
        QP.Updated += QP_updated;
        QP.Symbol = mySymbolTokenList[n];
        QP.LoadProvider();
    end;
end;




method void fillListView()
var:ListViewItem lvItem , ListViewItem newItem , int n;
begin

    ListView1.AddColumns("symbol");
    ListView1.AddColumns("銘柄名");

    ListView1.AddColumns("ASK");
    ListView1.AddColumns("Bid");

    ListView1.AddColumns("AskSize");
    ListView1.AddColumns("BidSize");
	ListView1.AddColumns("市場");

end;    


method void fillGrid()
var:DataGridViewColumn col , DataGridViewRow myRow, int n ;  
begin
    // add a string column
    col = DataGridViewColumn.Create("symbol");  
    DataGridView1.columns.Add(col);
    col = dataGridViewColumn.Create("銘柄");
    DataGridView1.Columns.Add(col);
    col = dataGridViewColumn.Create("終値");
    DataGridView1.Columns.Add(col);
    col = dataGridViewColumn.Create("前日終値");
    DataGridView1.Columns.Add(col);
    col = dataGridViewColumn.Create("前日比");
    DataGridView1.Columns.Add(col); 

    //add row
    for n = 0 to mySymbolTokenList.Count-1 begin

        myRow = datagridviewrow.Create("");

        DataGridView1.Rows.Add(myRow);

        myRow.Cells[0].Value = mySymbolTokenList[n];

        setDictionaryObj(mySymbolTokenList[n] ,myRow);

    end;
end;

//---------------------------------------
//symbolをkeyにしたDictionaryに値としてdataGridViewRowをセットする
//---------------------------------------
method void setDictionaryObj(string strSymbol , DataGridViewRow row)
var: string strSymbolRoot;
begin
    //===========!!!!重要!!!!=========
    //updateイベントで取得できるsymbolRootが４桁の文字データなのでそれに合わせて、４桁部分のみ切り取って格納する
    //例："8798-TS" ==>  "8798" で格納。そのため、leftstr()を使う。
    strSymbolRoot = leftStr(strSymbol , 4);
    if SymbolRowDictionary.Contains(strSymbolRoot) = false then begin
        SymbolRowDictionary.add(strSymbolRoot , row);   //Dictionary.add("keyname",初期値)
    end;

end;

//---------------------------------------
//symbolをkeyにしたDictionaryからvalueであるDataGridViewRowを取得しうりう
//---------------------------------------
method DataGridViewRow getDataGridViewRowFromDictionary(string strSymbolRoot)
var : DataGridViewRow row;
begin
    if SymbolRowDictionary.Contains(strSymbolRoot)=false then begin
        row = null;
    end else begin
        row = SymbolRowDictionary.Items[strSymbolRoot] astype DataGridViewRow;
    end;
return row;
end;





method void QP_updated( elsystem.Object sender, tsdata.marketdata.QuoteUpdatedEventArgs args ) 
begin
    updateRow(sender);
    updateDataList(sender);

end;

method void updateRow(elsystem.object sender)
var:QuotesProvider objQP ,DataGridViewRow row ,string strsymbolRoot, double zenjituhi;
begin
    objQP = sender astype QuotesProvider;
    strsymbolRoot = objQP.Quote["symbolRoot"].stringvalue;

    //DataGridの値を更新する、この方法が一番効率的で簡単
    row = getDataGridViewRowFromDictionary(strsymbolRoot);
    row.SetCell(1,objQP.Quote["description"].stringvalue);
    row.SetCell(2,numtostr(objQP.Quote["last"].doublevalue , 0));   //小数点以下を指定できるのでtoString()ではなくnumtostrを使う
    row.SetCell(3,numtostr(objQP.Quote["PreviousClose"].doublevalue , 0));
    zenjituhi = (objQP.Quote["last"].doublevalue / objQP.Quote["PreviousClose"].doublevalue) * 100;
    row.SetCell(4,numtostr(zenjituhi,3));
end;

method void updateDataList(elsystem.Object sender)
var:string strsymbolRoot , ListViewItem newItem , QuotesProvider objQP ;
begin
    objQP = sender astype QuotesProvider;
    strsymbolRoot = objQP.Quote["symbolRoot"].stringvalue;
    

    //listItemを作成する
    
    newItem = ListViewItem.Create(strsymbolRoot);
    newItem.AddColumns(objQP.Quote["description"].stringvalue);
     
    newItem.AddColumns(objQP.Quote["ASK"].doublevalue);
    newItem.AddColumns(objQP.Quote["BID"].doublevalue);
    newItem.AddColumns(objQP.Quote["asksize"].integervalue);
    newItem.AddColumns(objQP.Quote["bidsize"].integervalue);    
	newItem.AddColumns(objQP.Quote["ExchangeListed"].stringvalue);
	
    //ListView1.addRow(newItem);
	ListView1.InsertRow(0,newItem.SubItems[0],newItem.SubItems[1],newItem.SubItems[2],newItem.SubItems[3],newItem.SubItems[4],newItem.SubItems[5],newItem.SubItems[6]);

end;


```