【问题标题】:Create RadioGroups Dynamically oracle APEX动态创建 RadioGroups oracle APEX
【发布时间】:2012-07-24 23:45:31
【问题描述】:

我目前正在使用 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;

因此问题被显示出来,并且radiogroups也被显示在每个问题旁边。

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

【问题讨论】:

    标签: oracle oracle-apex


    【解决方案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;
    }
    

    和广播集团

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

    【讨论】:

      【解决方案2】:

      噗。起初我认为这会更容易一些,但经过一段时间后,我发现无线电组非常适合磨牙。 (这是在顶点 4.1 顺便说一句)

      通常我会回答说使用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 实际上是如何工作的呢?查看页面项目无线电组的输出代码时,输​​出如下:

      <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 将所选值放入该隐藏项中,因此您可以轻松引用 radiogroup 的所选值。

      这可能是解决此问题的最佳方法。生成您的单选组和按钮,并使用 javascript 将所选值放入隐藏项中。您可以使用apex_item.hidden 创建隐藏项,谢天谢地,之后您可以在数组中轻松引用它。如果你使用p_idx =&gt; 1,所有隐藏的项目将被存储到数组g_f01

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

      抱歉这篇文章太长了,我没想到它会变得如此复杂。希望有人过来告诉我们一个简单的方法:)

      【讨论】:

      • 非常感谢您的回复。我之前确实考虑过隐藏的方法,所以我想这是唯一的方法。将让您随时了解进度
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多