2

テキストとインデックスの両方を格納する addItem(text,value) メソッドでリストボックスを埋めようとする次のコードがあり、リストボックスがクリックされたときに両方を取得したいと考えています。デフォルトでは、e.parameter.listObject はテキストを返します。値も取得する方法はありますか?

コードは次のとおりです。

function doGet() {
  var app = UiApp.createApplication().setTitle('New app');

  var listHandler = app.createServerKeyHandler('listSelect');
  var lb = app.createListBox(true).setId('lbColour').setName('lbColour').setVisibleItemCount(10).addClickHandler(listHandler);  

  lb.addItem("RED","100");
  lb.addItem("GREEN","010");
  lb.addItem("BLUE","001");

  // Create a vertical panel and add the grid to the panel
  var panel = app.createVerticalPanel();
  panel.setId('mainPanel');
  panel.add(lb);  
  panel.add(app.createLabel('Colour Code:'));
  panel.add(app.createTextBox().setName('colourCode').setId('colourCode'));
  panel.add(app.createLabel('Colour Name:'));
  panel.add(app.createTextBox().setName('colourName').setId('colourName'));
  app.add(panel);
  return app;
}

function listSelect(e){
  var app = UiApp.getActiveApplication();
  app.getElementById('colourName').setText(e.parameter.lbColour);
  app.getElementById('colourCode').setText(e.parameter['lbColour_Value']);
  return(app);
}

以下の回答のおかげで、これは上記の修正されたコードになります。

前述のように、有効な区切り文字を使用してテキスト プロパティにキーを格納できることに注意してください。ここでは "|" を使用しました。「、」のような文字列を見つけるのは通常とは異なります。

また、これが機能するための元のコードの問題の主な原因は、リスボックスを複数選択として作成できないことでした。つまり、

  1. 「createListBox(true)」の代わりに「createListBox()」を使用します。
  2. サーバー ハンドラは、「creteServerKeyHandler」の代わりに「createServerHandler」を使用して作成されます。

最終的なコードは次のようになります。

function doGet() {
  var app = UiApp.createApplication().setTitle('New app');

  var listHandler = app.createServerHandler('listSelect');
  var lb = app.createListBox().setId('lbColour').setName('lbColour').setVisibleItemCount(10).addClickHandler(listHandler);  

  lb.addItem("RED","RED|100");
  lb.addItem("GREEN","GREEN|010");
  lb.addItem("BLUE","BLUE|001");

  // Create a vertical panel and add the grid to the panel
  var panel = app.createVerticalPanel();
  panel.setId('mainPanel');
  panel.add(lb);  
  panel.add(app.createLabel('Colour Code:'));
  panel.add(app.createTextBox().setName('colourCode').setId('colourCode'));
  panel.add(app.createLabel('Colour Name:'));
  panel.add(app.createTextBox().setName('colourName').setId('colourName'));
  app.add(panel);
  return app;
}

function listSelect(e){
  var app = UiApp.getActiveApplication();
  var outpArr = e.parameter.lbColour.split('|');  
  app.getElementById('colourName').setText(outpArr[0]);
  app.getElementById('colourCode').setText(outpArr[1]);
  return(app);
}
4

2 に答える 2

3

リストボックスアイテムのテキストを取得することはできません。あなたにできることはこれです、

次のようにリストアイテムを再フォーマットします。

lb.addItem("BLUE","001,BLUE");

その後

e.parameter.lbColour.split(',')[0]

001を返しますそして

e.parameter.lbColour.split(',')[1]

BLUEを返します

幸運を

function doGet() {
  var app = UiApp.createApplication();
  var vp = app.createVerticalPanel().setId("vp");
  var lb = app.createListBox().setName("lb");
  lb.addItem("BLUE", "BLUE,001");
  vp.add(lb);

  var handler = app.createServerHandler('postFunc').addCallbackElement(vp);
  var button = app.createButton("Send").addClickHandler(handler);
  vp.add(button);

  app.add(vp);
  return app;
}

function postFunc(e){
  var app = UiApp.getActiveApplication();

  var vp = app.getElementById("vp");
  var outpArr = e.parameter.lb.split(',');
  var color = app.createLabel("color text: " + outpArr[0]);
  var number = app.createLabel("color number: " + outpArr[1]);

  vp.add(color);
  vp.add(number);

  return app;
}
于 2012-10-15T19:21:57.337 に答える
1

EDIT 2 : 結局、トーマスの答えは間違っていませんでした...元の質問で使用されたハンドラーが問題の原因であり、複数選択の有効化にも問題がありました-最後のコメントを参照してください(問題941 )。

したがって、最初の回答を削除して(短くするために)、listBoxで複数選択を使用するための可能な回避策を提案します(テスト済みで機能しています)

function doGet() {
  var app = UiApp.createApplication().setTitle('New app');

  var listHandler = app.createServerHandler('listSelect');
  var lb = app.createListBox(true).setWidth('200').setId('lbColour').setName('lbColour').setVisibleItemCount(5).addChangeHandler(listHandler);  
 var colorIndex = [];// this is the array that will hold item values values with 2 fields
  lb.addItem("RED");colorIndex.push("RED-100");// use a '-' separator to be able to split later First field-second field
  lb.addItem("GREEN");colorIndex.push("GREEN-010");
  lb.addItem("BLUE");colorIndex.push("BLUE-001");

  lb.setTag(colorIndex.toString());// store the array in the TAG
  var panel = app.createVerticalPanel();
  panel.setId('mainPanel');
  panel.add(lb);  
  panel.add(app.createLabel('Colour Code:'));
  panel.add(app.createTextBox().setWidth('500').setName('colourCode').setId('colourCode'));
  panel.add(app.createLabel('Colour Name:'));
  panel.add(app.createTextBox().setWidth('500').setName('colourName').setId('colourName'));
  app.add(panel);
  return app;
}

function listSelect(e){
  var app = UiApp.getActiveApplication();
  var codepos = [];//will get the index position of items in colorIndex
  var code = [];//array of first items found in colorIndex
  var color = [];// index of second items found in colorIndex
  var colorIndex = e.parameter.lbColour_tag.split(',');// recover the array
  for(n=0;n<colorIndex.length;++n){if(e.parameter.lbColour.match(colorIndex[n].split('-')[0]) == colorIndex[n].split('-')[0]){codepos.push(n)}};// get the position in the array
  for(n=0;n<codepos.length;++n){
  code[n] = colorIndex[codepos[n]].split('-')[1];// finally get the color code value
  color[n] = colorIndex[codepos[n]].split('-')[0];// get the color value
}  
  app.getElementById('colourName').setText(color.toString());// show the result second field
  app.getElementById('colourCode').setText(code.toString()); // show the result first field
  return(app);
}
于 2012-10-16T10:56:44.417 に答える