1

有一个网格,需要在同一列中有具有不同选项值的选择框。例如,在为解决此问题而设置的测试网格中,其概念是使用选择框从电影中选择一个演员。每行都有不同电影的数据。在每一行中,actors 列都有一个不同的actors 列表,需要使用这些actors 来动态填充该行的选择框。演员列表设置为 CSV,逗号分隔值,在数据库中:IE、Clint Eastwood、Tom Cruz、Vin Diesel。

从完成的测试来看,一旦设置了列模型,每次网格加载只执行一次,这意味着您只能为列中的所有选择框获得一组选项。通过设置循环块以在填充网格的 php 文件(在本例中为 myfirtgridajax.php)中生成正确的代码,并显示为函数,已成功将具有所需值的 html 字符串作为返回数据传递给网格具有正确值的选择框,它的行为不像在列模型中设置的选择框

{... edittype:select, edit options:{value:{CE:'Clint Eastwood'... }}} 

需要的是从将在数据库中设置另一个值的选择框生成一个 POST 请求 onChange 或具有相同结果的东西。也就是说,如果选择了 Clint Eastwood,则需要生成一个 POST 请求以将该值传递给另一个 php 页面进行处理。

我的问题是,虽然它看起来像在通过传递 html 字符串创建的选择框上设置事件侦听器会起作用,但有没有更好的方法来做到这一点?

<script>
$(function () {
    $('#displayresultstable').jqGrid({
        url:'../gridcalls/myfirstgridajax.php',
        datatype:'json',
        mtype: 'GET',
        colNames:['ID', 'movie', 'topic', 'rating','actors'],
        colModel :[
            {name:'ID', index:'ID', width:50},
            {name:'movie', index:'movie', width:200, editable:true},
                {name:'topic', index:'topic', width:350, editable:true},
            {name:'rating', index:'rating', width:50, editable:true },
            {name:'actors', index:'actors', width:350, editable:true }, 
        ],
        pager: '#pager',
        rowNum:10,
        height: 'auto',
        rowList:[5,10,15],
        sortname:'ID',
        sortorder: 'desc',
        viewrecords: true,
        gridview: true,
        cellEdit: true,
        cellurl:'../editfirstgridajax.php',
        caption: 'Movie Greats'
    });
    $('#displayresultstable').jqGrid('navGrid','#pager', {view: true});
});
</script>

<table id='displayresultstable'>
    <tr><td></td></tr>
</table>

<div id='pager'></div>

谢谢

4

1 回答 1

0

仍然想要一个非黑客解决方案,但想出了一个可行的黑客。

您所做的是在生成 HTML 对象的 AJAX 调用页面中设置一个条件块,在本例中是一个由参与者列中的数据填充的选择框。使用 PHP explode(',',$myarray) 解析数据并使用循环设置选择选项。然后添加事件处理程序所需的 JavaScript 以传递选定的值并调用另一个 JavaScript 函数以将数据(我正在使用 POST)传递到另一个 PHP 页面以更新数据库。一切就绪后,我用 HTML 字符串替换了单元格(对于给定的行)或列(查看整个网格)的行 json 值。

在 columnModel 上,您必须删除可编辑:true。否则,用户可以单击选择按钮无法隐藏的一个或两个像素的边距/填充空间,无论我为选择框提供什么高度属性,这都会导致显示 HTLM 字符串在那个牢房里。此外,您需要将所有 JavaScript 放在与选择框相同的代码行上,我使用了一个设置为条件块中生成的 HTML 字符串的变量,否则网格会添加换行符,或者更确切地说,看起来和行为类似于换行符到放置选择框的表格单元格。这会导致网格单元格的格式增加高度。

$responce->rows[$i]['cell']=array($row['ID'],$row['movie'], $row['topic'],$row['rating'],'<select id="actors'.$i.'"style="width:100%;"><option value="what the'.$therowid.'">ed</option><option value="zed">zed</option><option value="red">red</option></select><script>$("#actors'.$i.'").change(function(){var actorselected =$("#actors'.$i.' option:selected").val();alert("you changed select box actors'.$i.' with record id '.$therowid.'\nThe selected value is "+actorselected);});/script>');

上面的代码来自一个不使用数据库的静态尝试,但确实演示了它是如何工作的。

于 2013-05-22T15:39:09.117 回答