2011年6月22日 星期三

OpenFlashChart

試玩OpenFlashChart
公司之後可能需要做圖表,先測試一下mvc可用的元件,但這個是都能用,不關mvc的事XD

詳細的圖表及效果請看
OpenFlashChart


實作:

在body中加入兩個div



載入的檔案如下


在document.ready加上

var jsonFilePath = encodeURIComponent('../../Content/OpenFlash/data.json');
//存放Open Flash Chart要載入的JSON字串
var flashvars = { "data-file": jsonFilePath };
//設定要傳入Flash的變數資料,data-file是定義在Flash檔案裡面的Action Script變數
var params = { 'quality': 'high', 'allowscriptaccess': 'always' };
//設定Flash在頁面上的屬性,這些屬性是屬於HTML規範的
var attributes = {};
swfobject.embedSWF("../../Content/OpenFlash/open-flash-chart.swf", //要顯示的Flash
"my_chart", //Flash要寫入的區塊id
"100%", //Flash寬度
"100%", //Flash高度
"9.0.0", //Flash Player的版本號
"http://www.adobe.com/cfusion/knowledgebase/index.cfm?id=6a253b75",
//當瀏覽器沒有安裝Flash Player時,指示使用者要去哪一個網站進行Flash Player的URL
flashvars,
params,
attributes);


$("#divResize").resizable();



加入一個json檔為data.json在根目錄,或自已設定,並修改讀取的路徑

json檔內容:

{
"title":{
"text": "Many data lines",
"style": "{font-size: 20px; color:#0000ff; font-family: Verdana; text-align: center;}"
},

"y_legend":{
"text": "Open Flash Chart",
"style": "{color: #736AFF; font-size: 12px;}"
},

"elements":[
{
"type": "bar_3d",
"alpha": 0.5,
"colour": "#9933CC",
"text--": "Page views",
"font-size--": 10,
"values" : [9,6,7,9,5,{"top":7,"colour":"#A03030","tip":"#top#
hello"},6,9,7]
}
],

"x_axis":{
"stroke": 1,
"tick_height": 10,
"colour": "#d000d0",
"grid_colour": "#00ff00",
"labels": {
"labels": ["January","February","March","April","May","June","July","August","Spetember"]
},
"3d": 5
},

"y_axis":{
"stroke": 4,
"tick_length": 3,
"colour": "#d000d0",
"grid_colour": "#00ff00",
"offset": 0,
"max": 20
}

/* &x_axis_steps=2& */

}

在畫面載入後就會去讀json檔中的內容解析為圖表的資訊及屬性,多包一div讓圖表可以縮放,載完圖之後,就可以自由的拉動顯示大小囉!!

效果如下

JQTreeView(ajax)

JqueryTreeView筆記

在畫面只需拉一個div,其他都動態用ajax到資料庫撈資料後產生ul,li,再用jquery將之轉變為TreeView功能,請看Code。

載入時,先產生第一層的節點



增加節點的function,每次按下展開按鈕時,就會跑ajax去server端撈資料再塞入本來的節點(先刪後增)



設定TreeView的屬性
注意toggle是讓展開時可以動態去載入節點的關鍵,每一次點擊時都去載入並把舊的刪除後新增,另外只有多控制縮起來時不載入節點,其他屬性在內容中有備註。



在Server端就單純回傳json格式的字串,再到client端處理並加入節點,這邊就不多廢話了。

另外在每個節點裡面藏了一個gif讓節點展開時有一個載入的動畫,之後再塞入節點,比較活潑XD



展開後的樣子

2011年6月10日 星期五

JQGrid(SubGrid)

工作方面需要在Grid中再放一個Grid,因此實作了一下jquery的Grid及SubGrid

資料的部份,用ajax去抓取資料,再用json的格式塞到table中,其他的部份就交給jQuery去處理,按下「+」之後再用no去抓取子table的資料

注意colModel部份設定對應的欄位,在塞值時需要對應。

效果如下:


詳細功能請參考
JQGrid Demo

JavaScript Code
==========================================================
$(document).ready(function () {

$("#gridTable").jqGrid({
url: GetData(),
datatype: "local",
height: 400,
colNames: ['編號', '姓名', '生日'],
colModel: [
{ name: 'no', index: 'no', width: 250 },
{ name: 'nm', index: 'nm', width: 150 },
{ name: 'birthday', index: 'birthday', width: 100, sorttype: "date" }
],
sortname: 'no',
sortorder: 'asc',
viewrecords: true,
rowNum: 10,
rowList: [10, 20, 30],
pager: "#gridPager",
caption: "測試JQueryGrid",
subGrid: true,
subGridRowExpanded: function (subgrid_id, row_id) {
var subgrid_table_id, pager_id;
subgrid_table_id = subgrid_id+"_t";
pager_id = "p_"+subgrid_table_id;
$("#"+subgrid_id).html("
");
jQuery("#"+subgrid_table_id).jqGrid({
url: GetSubData(row_id, subgrid_table_id),
datatype: "local",
colNames: ['公司名稱', '公司類型', '地址類型'],
colModel: [
{name:"nm",index:"nm",width:80},
{name:"tp",index:"tp",width:130},
{name:"addr",index:"addr",width:70,align:"right"}
],
rowNum:10,
pager: pager_id,
sortname: 'nm',
sortorder: "asc",
viewrecords: true,
height: '100%'
});
jQuery("#"+subgrid_table_id).jqGrid('navGrid',"#"+pager_id,{edit:false,add:false,del:false})
},
subGridRowColapsed: function(subgrid_id, row_id) {}
}).navGrid('#gridPager', { edit: false, add: false, del: false });

});

function GetData() {
$.ajax({
url: "/Grid/GetCustM",
type: "POST",
data: '',
dataType: "json",
success: function (result) {
if (result != null && result != '') {
var custList = result.split(';');
for (var i = 0; i < custList.length; i++){
var cust = custList[i].split(',');
$("#gridTable").jqGrid('addRowData', i + 1, { no: cust[0], nm: cust[1], name: cust[2] });
}

}
},
error: function (error) { alert(error); return false; }
})
}

function GetSubData(rowid,tableid) {
var no = $("#gridTable").jqGrid('getRowData', rowid).no;
$("#gridTable").jqGrid('setSelection', rowid);
$.ajax({
url: "/Grid/GetCustComp",
type: "POST",
data: {custno : no},
dataType: "json",
success: function (result) {
if (result != null && result != '') {
var custList = result.split(';');
for (var i = 0; i < custList.length; i++) {
var cust = custList[i].split(',');
$("#" + tableid).jqGrid('addRowData', i + 1, { nm: cust[0], tp: cust[1], addr: cust[2] });
}

}
},
error: function (error) { alert(error); return false; }
})
}


==========================================================

Server端只單純用兩個Action回傳資料字串
Server Code
==========================================================
public JsonResult GetCustM()
{
var entitys = new LionCRMEntities();
var custm = entitys.CustM.ToList();

var returnJson = string.Empty;
foreach(var cust in custm)
{
returnJson += string.IsNullOrEmpty(returnJson) ? string.Empty : ";";
returnJson += cust.CustNO.ToString() + "," + cust.CustNM + "," + (cust.CustBirth.HasValue ? cust.CustBirth.Value.ToString("yyyy-mm-dd") : string.Empty);
}

return Json(returnJson);
}

public JsonResult GetCustComp(string custno)
{
var guidno = Guid.Parse(custno);
var entitys = new LionCRMEntities();
var cumpList = entitys.CustComp.Where(o => o.CustNO == guidno).ToList();

var returnJson = string.Empty;
foreach (var cump in cumpList)
{
returnJson += string.IsNullOrEmpty(returnJson) ? string.Empty : ";";
returnJson += cump.CompanyNM + "," + cump.CompTP + "," + cump.ADDRTP;
}

return Json(returnJson);
}

==========================================================

Error紀錄

Mvc有提供錯誤攔捷的方法

在Global.asax.vb中加上Application_Error這個方法,只要Server端發生的錯誤,都會進入。

我的作法是在web.config放一個開關,以方便在開發時,可以不用一直寫log檔,也方便處理,並在進入寫完log之後將頁面導到設定好的ErrorPage(ControllerName:Sheard,ActionName:ErrorPage),並將Exception清除(Server.ClearError())

PS.記得要用Try Catch包起來,否則如果在此方法中產生Exception時會造成無窮迴圈

Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs)
Dim isWriteLog = False
Boolean.TryParse(ConfigurationProcess.GetConfigurationParameter("IsWriteLog"), isWriteLog)

Try

If isWriteLog Then

Dim Errormsg = String.Empty
Dim unhandledException = Server.GetLastError()
Response.Clear()
Dim httpException As HttpException = TryCast(unhandledException, HttpException)
Dim systemException As SystemException = TryCast(unhandledException, SystemException)
Errormsg = "發生列外網頁:{0}錯誤訊息:{1}堆疊內容:{2}"

'If systemException IsNot Nothing OrElse String.IsNullOrEmpty(unhandledException.GetBaseException().Message) Then
Errormsg = String.Format(Errormsg,
Request.Path + Environment.NewLine,
unhandledException.GetBaseException().Message + Environment.NewLine,
unhandledException.StackTrace + Environment.NewLine)

Dim route = RouteTable.Routes.GetRouteData(New HttpContextWrapper(System.Web.HttpContext.Current))
Dim controllers = route.Values("controller")
Dim action = route.Values("action")

Dim strPathName = System.Web.HttpContext.Current.Server.MapPath("/Logs/ErrorLog/")

Dim sw As System.IO.StreamWriter


Dim errorFileName = DateTime.Now.ToString("yyyy-MM-dd")
Dim errorTime = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss")

sw = New System.IO.StreamWriter(strPathName & errorFileName & ".txt", True)
sw.WriteLine(errorTime & Errormsg)
sw.Dispose()

Server.ClearError()

Dim routeData = New RouteData()
routeData.Values.Add("controller", "Shared")
routeData.Values.Add("action", "ErrorPage")
routeData.Values.Add("fileName", errorFileName & ".txt")
routeData.Values.Add("errorTime", errorTime)


Dim errorController As IController = New LionGroupCRM.SharedController()
errorController.Execute(New RequestContext(New HttpContextWrapper(Context), routeData))

'End If

End If

Catch ex As Exception
Server.ClearError()
End Try

End Sub

2010年2月9日 星期二

DateTimePicker 日期時間選取器

由於需要使用到日期跟時間選取
原本作法都是拉一個選日期的textbox跟時、分的下拉
被閒說難用,只好另找出路
最後是用jQuery有高手分享自已再重包過的Calendar picker可以一並選取時間
不囉嗦 以下內容....

========廢話分格線============
原作者連結
jQuery Calendar with time picker

下載裡面的三個檔案
jquery.js
jquery-calendar.js
jquery-calendar.css

掛上去就能用了

在js上加上
$('#txtDate').calendar();



之後在textbox上點一下,選取器就出現了!!
簡單又好用~~

另外有找到高手提出他這個有點小bug,用時再自行更改吧!!
jQuery DateTimePicker 日期時間控件

2010年1月18日 星期一

在GroupBy多筆中取某筆

取資料時需要取某欄位相同值之後再取得最新的一筆

用FKCustomerRosterGenericDetail當Key再把Entity放到對應的Key中(另外再OrderBy)

var gEntitys = (from b in bizEntitys
group b by b.FKCustomerRosterGenericDetail into o
select new {
FKCustomerRosterGenericDetail = o.Key,
o = o.OrderBy(p => p.CreateDate).FirstOrDefault()
}
);


用Key跑迴圈就能對分群好的資料做處理

foreach (var e in gEntitys)
callQueueVoList.Add(this.CreateVOFromBizEntity(e.o));


參考網站:http://www.cnblogs.com/lyj/archive/2008/01/25/1052713.html