Flex 3:在datagrid中动态创建复选框列 - 数据填充问题和事件监听器

时间:2013-01-11 13:53:42

标签: flex

我的mxml文件中有一个datagrid控件:

现在在我的AS文件中,在从DB获取数据时的结果函数中,我可以动态创建列。假设我创建了1列(客户端名称):

private function GetDebtors_Result(event:ResultEvent):void
{
var arrayCol:Array = new Array();
var xmlSrc:XML = new XML("<main></main>");
var xmlTmp:XML;
var colClientname:DataGridColumn;

//Build an XML from DB data received (could as well use "event.result" directly to act as dataprovider for the datagrid, but I needed to break it down here)
for each(var o:Object in event.result)
{
xmlTmp = <row>
<CLIENTNAME>{o.CLIENTNAME}</CLIENTNAME>
</row>;
xmlSrc.appendChild(xmlTmp);
}

//Create the column CLIENTNAME
colClientname = new DataGridColumn("CLIENTNAME");
colClientname.headerText = "Client Name";

//Add the newly created column in the "Column" array.
arrayCol.push(colClientname);

//Use the "Column" array to set the columns of the datagrid.  
dgSearch.columns = arrayCol;

//Populate the datagrid with the XML data.
dgSearch.dataProvider = xmlSrc.row;
}

这很有效。

现在出现问题:我需要添加第二列,其中包含复选框。将根据数据库中的数据选择或取消选择它们。我将通过更新与上面相同的“GetDebtors_Result”函数来显示我是如何做到的(添加的行被注释为“// ADDED ”):

private function GetDebtors_Result(event:ResultEvent):void
{
var arrayCol:Array = new Array();
var xmlSrc:XML = new XML("<main></main>");
var xmlTmp:XML;
var colClientname:DataGridColumn;
var colSel:DataGridColumn; // **ADDED**

//Build an XML from DB data received (could as well use "event.result" directly to act as dataprovider for the datagrid, but I needed to break it down here)
for each(var o:Object in event.result)
{
xmlTmp = <row>
<CLIENTNAME>{o.CLIENTNAME}</CLIENTNAME>
<SELECTED>{(o.SELECTED == 1)?true:false}</SELECTED>  //**ADDED**
</row>;
xmlSrc.appendChild(xmlTmp);
}

//Create the column CLIENTNAME
colClientname = new DataGridColumn("CLIENTNAME");
colClientname.headerText = "Client Name";

//Create the column SELECTED
colSel = new DataGridColumn("SELECTED"); // **ADDED**
colSel.headerText = ""; // **ADDED**
colSel.itemRenderer = new ClassFactory(mx.controls.CheckBox); // **ADDED**
colSel.dataField = "SELECTED"; // **ADDED**

//Add the newly created column in the "Column" array.
arrayCol.push(colClientname);

//Add the "selection" column in the "Column" array.
arrayCol.push(colSel); // **ADDED**

//Use the "Column" array to set the columns of the datagrid.  
dgSearch.columns = arrayCol;

//Populate the datagrid with the XML data.
dgSearch.dataProvider = xmlSrc.row;

}

问题#1:出现复选框列,我可以选中并取消选中复选框,但加载时不会对DB数据进行选中/取消选中。

问题2:如何将一个函数与复选框相关联,例如一个将更新XML以便我可以将新数据保存到数据库的复选框?

有人得到了解决方案吗?先感谢您。

2 个答案:

答案 0 :(得分:1)

似乎是我今天看到的一个非常古老的问题。 希望你现在能找到解决方案,只要有人遇到同样的问题:

向列中添加复选框时 - 只需将其实例化为1st:

var chkTempCheck: Checkbox = new CheckBox();

然后设置所需的所有属性:

chkTempCheck.selected = o.dBColumnToDecideCheckUnCheck

这里'o'是你在event.result中使用的对象。 这肯定会有效!

答案 1 :(得分:0)

初始方案是:所有列都在mxml文件中定义。复选框列使用了itemrenderer并且工作正常。我在3种不同的情况下使用相同的数据网格 - 只是根据“视图”,某些列被设置为可见/不可见。问题是当移动“视图”并填充网格并再次移动“视图”时,列宽度呈指数级增长。我排除了复选框列,一切正常;列宽度还可以。我在后面包含了复选框列,并尝试在AS文件中设置列宽,并且列增加指数问题已修复,但在视图A中填充网格时以及在视图B中填充网格时,列宽从不相同。所以我冒险尝试在获取DB数据后立即在AS文件中设置列。希望你能在这些情况下找到自己。谢谢你的帮助。