动态创建RadioGroups oracle APEX

时间:2012-01-19 17:37:13

标签: oracle oracle-apex

我目前正在使用oracle APEX 4.1,并且在动态创建无线电组时存在问题。

我有一个简单的要求(!)来显示表格中的问题列表,并在每个问题旁边显示是/否放射组按钮。问题清单可能会有所不同,因此不是一成不变的。

为此,我决定创建一个plsql匿名块,代码示例如下:

For c1 IN (select * from question)
LOOP
v_row:=v_row+1;
v_rowName:='F'||v_row;
v_radioYes:='<input type="radio" name='||v_rowName||'  value="yes" />Yes';
v_radioNo:='<input type="radio" name='||v_rowName||'  value="no" />No';
v_radio:=v_radioYes||' '||v_radioNo;
htp.p('<tr><td>'||v_row||'. '||c1.Question_text||'</td><td>'||v_type||'</tr>');
END LOOP;

因此,问题正在显示,并且每个问题旁边也会显示无线电组。

我的问题是,在提交时,我需要找出用户为每个问题选择的选项并保存到数据库。很容易,但我不能参考每个问题的radiobuttons来找出用户检查的内容。 理想情况下,这些单选按钮应该是使用APEX工具创建的,但我无法动态地在循环中执行此操作。有没有办法引用动态创建的这些无线电组?我采取了错误的做法吗?

2 个答案:

答案 0 :(得分:1)

我最近遇到了几乎同样的问题。我找到所选选项的解决方案是将p_onchange参数添加到APEX_ITEM.RADIOGROUP函数调用(请参阅Apex 4.1 API参考)。你可以在那里放置任何JavaScript代码。我编写了一个简单的函数来将选定的值分配给隐藏的输入字段。

这是js函数:

function put_selected_value(sel_value) { 
  $x('P66_SELECTED_VALUE').value=sel_value;
}

和RADIOGROUP

apex_item.RADIOGROUP(10, wrk_id, null, null, null, null, 
                     'javascript:put_selected_value(this.value);')

答案 1 :(得分:0)

Pfew。起初我觉得这会有点容易,但是经过一段时间的捣乱后,我发现放射线组很像牙齿。 (这是在顺便说一下4.1 btw)

通常我会回答说使用apex_item将是动态创建项目的方法。然而,放射性基团以扭曲反应。

如果您使用例如:

for r in(select level l, 'question '||level q, 'Y' a
           from dual 
        connect by level < 6)
loop
   htp.p('<div>'||r.q);
   htp.p(
      APEX_ITEM.TEXT(
       p_idx         => 1,
       p_value       => r.a,
       p_size        => 3,
       p_maxlength   => 1)
   );
   htp.p('</div>');
end loop;

输出结果为:

<div>question 1
<input type="text" name="f01" size="3" maxlength="1" value="Y"  />
</div>
<div>question 2
<input type="text" name="f01" size="3" maxlength="1" value="Y"  />
</div>
<div>question 3
<input type="text" name="f01" size="3" maxlength="1" value="Y"  />
</div>
<div>question 4
<input type="text" name="f01" size="3" maxlength="1" value="Y"  />
</div>
<div>question 5
<input type="text" name="f01" size="3" maxlength="1" value="Y"  />
</div>

大!生成了5个字段,可使用apex_application.g_F01数组访问,其中字段1为apex_application.g_f01(1)

然而,放射性组合反应不同。 APEX_ITEM.RADIOGROUP所做的并不是创建一个无线电组,而是创建一个无线电按钮。然后该组将是f01阵列。 哇!我不喜欢那个! F ##数组只从1到50开始,所以如果你生成一些项目,这并不理想。 此外,你的逻辑被搞砸了:突然你不再需要遍历数组,而是通过数组。

例如,如果您将apex_item.text替换为apex_item.radiogroup

,则输出将如下所示
<div>question 1
<input type="radio" name="f01" value="Y"   />Yes?
</div>
<div>question 2
<input type="radio" name="f01" value="Y"   />Yes?
</div>
<div>question 3
<input type="radio" name="f01" value="Y"   />Yes?
</div>
<div>question 4
<input type="radio" name="f01" value="Y"   />Yes?
</div>
<div>question 5
<input

它有点像你问的那样:它创造了一个由物品组成的放射性组。如果您单击问题4处的按钮并且之前已标记问题1,则该标记将从问题1中删除并设置为4.

然而它有效。当您提交并循环F01数组时,它将传递值:

--this after submit process
for i in 1..apex_application.g_f01.count
loop
apex_debug_message.log_message('array F01: item '||i||': '||apex_application.g_f01(i));
end loop;

--results in this debug message:
--array F01: item 1: Y

好的,那你有什么选择呢?不要使用它。它不是动态的!你不能遍历50个数组,除非你在每个数组上写50个循环...

那么APEX究竟是如何运作的呢?查看页面项目radiogroup的输出代码时,这是输出:

<input type="hidden" name="p_arg_names" value="50795996117686343389" />
<fieldset id="P3_RGROUP_PAGE_ITEM" tabindex="-1" class="radio_group">
<input type="radio" id="P3_RGROUP_PAGE_ITEM_0" name="p_t01" value="Yes" checked="checked"   />
<label for="P3_RGROUP_PAGE_ITEM_0">Y</label><br />
<input type="radio" id="P3_RGROUP_PAGE_ITEM_1" name="p_t01" value="No"    />
<label for="P3_RGROUP_PAGE_ITEM_1">N</label></fieldset>

查看隐藏的项目?我假设apex将所选值放在该隐藏项中,因此您可以轻松地引用所选的无线电组的值。

这可能是您解决此问题的最佳方法。生成您的radiogroups和按钮,并使用javascript将所选值放入隐藏项目中。您可以使用apex_item.hidden创建隐藏项目,幸运的是,您可以随后在数组中轻松引用它。如果您使用p_idx => 1,则所有隐藏的项目都将存储到数组g_f01

您只需要在您的radiogroup容器中搭载这个隐藏的项目。然后将onchange事件绑定到您的radiobuttons。 例如,看看这个jsfiddle。这会将所选值保留在隐藏项目中,该项目将在提交时发布。

对于这篇长篇文章感到抱歉,我觉得它不会那么复杂。希望有人出现并向我们展示一种简单的方法:)

相关问题