5

我在同一个 Radio 组中的 Ui 中有 3 个单选按钮。他们是,

var rbutton1 = app.createRadioButton('dist','5 miles');

var rbutton2 = app.createRadioButton('dist','10 miles');

var rbutton3 = app.createRadioButton('dist','25 miles');

在事件处理函数中,变量e.parameter.dist仅根据 rbutton3(最后一个单选按钮)是否被选中而给出 true 或 false。有什么方法可以确定准确选择了哪个单选按钮?

4

4 回答 4

2

使单选按钮组像这样(按照设计意图)工作的唯一方法是在 a 中使用它们FormPanel并从表单的提交操作中查看 doPost 上的名称(在您的情况下为“dist”)。

不过,有一些解决方法,使用新的客户端处理程序,使其在任何面板上的单选按钮使用与从上大致相同。请在跟踪器上查看此问题。您可能还想为这个问题加注标,以跟踪更新并为它投票。

于 2012-07-12T04:29:56.717 回答
0

我用:

eventData.parameter.source

并使用 addClickHandler 获取更改。

您需要将其存储在某个地方

于 2012-07-12T08:06:04.100 回答
0

与此同时,我也想出了一个解决方法来设置单选按钮,在这个例子中,我使用了一个 listBox,但可以使用任何其他数据。

这是完整的代码:(在电子表格容器中测试)

function radiotest() {
  var app = UiApp.createApplication();
  var panel = app.createVerticalPanel();
  var radioValue = app.createTextBox().setId('radioValue');
      radioValue.setId("radioValue").setName("radioValue");
  var listhandler = app.createServerHandler('listhandler').addCallbackElement(panel); 
  var list = app.createListBox().addChangeHandler(listhandler).setName('list');    
  for(var i = 1; i < 10; i++){
    var name = 'choice '+i;
    list.addItem('Activate '+name,name)
    var handler = app.createClientHandler().forTargets(radioValue).setText(name);
    panel.add(app.createRadioButton('radioButtonGroup',name).addValueChangeHandler(handler).setId(name));
  }
  panel.add(radioValue);
  var getit=app.createButton("Valide").setId("val");
  panel.add(getit).add(list)                   
  var handler = app.createServerHandler("valide")
  handler.addCallbackElement(panel)
  getit.addClickHandler(handler);
  app.add(panel);
SpreadsheetApp.getActiveSpreadsheet().show(app);// show app 
}
//
function valide(e){ ;// This function is called when key "validate" is pressed 
  var sh = SpreadsheetApp.getActiveSheet();
  var RadioButton = e.parameter.radioValue;               
  sh.getRange('A1').setValue(RadioButton);
  var app = UiApp.getActiveApplication();
  return app;
}​

function listhandler(e){ ;// This function is called when listBox is changed
  var sh = SpreadsheetApp.getActiveSheet();
  var app = UiApp.getActiveApplication();
  var listvalue = e.parameter.list
  var radioValue = app.getElementById('radioValue').setValue(listvalue)
  sh.getRange('A2').setValue(listvalue);
  var radiobutton = app.getElementById(listvalue)
  radiobutton.setValue(true)
return app;
}​

选定的单选按钮值来自文本框值,列表框允许选择激活哪个单选按钮......它显示如下

在此处输入图像描述

还有另一种方法,如eddyparkinson所述,即使用 e.parameter.source 但这在处理程序直接分配给 radioButton 而不是使用“提交”按钮时才有效。在许多情况下,它可以使用并使代码(一点)更轻。这是此代码的测试

function radiotest2() {
  var app = UiApp.createApplication();
  var panel = app.createVerticalPanel();
  var listhandler = app.createServerHandler('listhandler2').addCallbackElement(panel); 
  var list = app.createListBox().addChangeHandler(listhandler).setName('list');    
  var handler = app.createServerHandler("valide2")
  handler.addCallbackElement(panel)
  for(var i = 1; i < 10; i++){
    var name = 'choice '+i;
    list.addItem('Activate '+name,name)
    panel.add(app.createRadioButton('radioButtonGroup',name).setId(name).addClickHandler(handler));
  }
  panel.add(list)                   
  app.add(panel);
SpreadsheetApp.getActiveSpreadsheet().show(app);// show app 
}


function valide2(e){ ;// This function is called when a radioButton is selected
  var sh = SpreadsheetApp.getActiveSheet();
  var source = e.parameter.source;
  var radioValue = '';
  if(source.match('choice')=='choice'){radioValue=source}
  sh.getRange('A1').setValue(radioValue);
  var app = UiApp.getActiveApplication();
  return app;
}​

function listhandler2(e){ ;// This function is called when listBox is changed
  var sh = SpreadsheetApp.getActiveSheet();
  var app = UiApp.getActiveApplication();
  var listvalue = e.parameter.list
  sh.getRange('A2').setValue(listvalue);
  var radiobutton = app.getElementById(listvalue)
  radiobutton.setValue(true)
return app;
}​
于 2012-08-10T23:01:14.713 回答
0

这些按钮是否假设处于异或模式。如果是这样,它们需要具有相同的名称。查看 Serge 的答案以获得详细的解释和示例代码。

于 2012-08-10T21:42:34.403 回答