問題情境:
一個表單,上半部要先填條件後帶出資料,才繼續填下半部
下半部的ui先用blockUI罩起來,中間顯示「請填上半部的資料」
結果那個顯示文字在BOOTSTRAP的表單置中樣式套用後就歪掉了
解法:
顯示訊息的時候指定
centerX: false,
centerY: false
參考:
Why does my div not center properly?http://stackoverflow.com/questions/2518465/why-does-my-div-not-center-properly
2015年12月23日 星期三
2015年12月21日 星期一
沒有權限存取資料夾 的IIS 資料夾權限設定
網站有個功能需要刪除資料夾內的檔案
但預設沒有權限可以存取
解決方法:
對該資料夾按右鍵→內容→安全性
新增使用者名稱填入
IIS AppPool\(在IIS的集區名字)
按確定,就會多出一個集區使用者,就可以針對他來做權限設定了
但預設沒有權限可以存取
解決方法:
對該資料夾按右鍵→內容→安全性
新增使用者名稱填入
IIS AppPool\(在IIS的集區名字)
按確定,就會多出一個集區使用者,就可以針對他來做權限設定了
2015年12月4日 星期五
ASP.NET GridView Header flow by scroll up and down use JQuery | WebForm的Gridview 欄標題 以JQuery置頂的方法
WebForm的Gridview元件想要讓欄標題可以置頂的方法
我的Gridview是用template做版面的,資料很多很長,捲下去時就看不見欄標題,很不方便,
解法參考來源:
http://stackoverflow.com/questions/2177983/how-to-make-div-follow-scrolling-smoothly-with-jquery
answered by ajax333221
1.原本是只有設定HeaderText,現在要加上HeaderTemplate,然後用div包起來標題文字
2.div給一個css class,這個class加上fixed時就會固定置頂
3.JQUERY
2015/12/25 追記:
如果有GridView是不要一進網頁就databinding的,那網頁ready的時候就沒有欄位標題可以註冊,
這樣就讓效果無效了,我想到的兩種解決方法:
一種是把Jquery部分改放到function pageLoad() { }事件,
這個事件會在aspx postback回來後觸發
但要判斷有沒有註冊過window scroll 才去註冊那個事件
不然每次post back都會註冊一次 就會有問題
我沒有把這方法做完,改用我想到的第二種方法
第二種比較簡單的方法是,設定gridview屬性ShowHeaderWhenEmpty="true"
然後在page load事件給gridview空的source後bind
gv.DataSource = new DataTable();
gv.DataBind();
這樣就會沒資料但顯示標頭,就可以讓javascript註冊事件
我的Gridview是用template做版面的,資料很多很長,捲下去時就看不見欄標題,很不方便,
解法參考來源:
http://stackoverflow.com/questions/2177983/how-to-make-div-follow-scrolling-smoothly-with-jquery
answered by ajax333221
1.原本是只有設定HeaderText,現在要加上HeaderTemplate,然後用div包起來標題文字
<asp:TemplateField HeaderText="標題" HeaderStyle-HorizontalAlign="Left">
<HeaderTemplate>
<div class="divTH">
<label>標題</label>
</div>
</HeaderTemplate>
<ItemTemplate>
......
</ItemTemplate>
</asp:TemplateField>
2.div給一個css class,這個class加上fixed時就會固定置頂
.divTH.fixed {
position: fixed;
top: 0;
}
3.JQUERY
$(document).ready(function () {
if (!($.browser == "msie" && $.browser.version < 7)) {
var target = ".divTH", top = $(target).offset().top - parseFloat($(target).css("margin-top").replace(/auto/, 0));
$(window).scroll(function (event) {
if (top <= $(this).scrollTop()) {
$(target).addClass("fixed");
} else {
$(target).removeClass("fixed");
}
});
}
});
2015/12/25 追記:
如果有GridView是不要一進網頁就databinding的,那網頁ready的時候就沒有欄位標題可以註冊,
這樣就讓效果無效了,我想到的兩種解決方法:
一種是把Jquery部分改放到function pageLoad() { }事件,
這個事件會在aspx postback回來後觸發
但要判斷有沒有註冊過window scroll 才去註冊那個事件
不然每次post back都會註冊一次 就會有問題
我沒有把這方法做完,改用我想到的第二種方法
第二種比較簡單的方法是,設定gridview屬性ShowHeaderWhenEmpty="true"
然後在page load事件給gridview空的source後bind
gv.DataSource = new DataTable();
gv.DataBind();
這樣就會沒資料但顯示標頭,就可以讓javascript註冊事件
標籤:
表格標題置頂,
asp.NET,
GridView,
header flow,
JQuery
2015年11月20日 星期五
asp.Net ObjectDataSource output parameter
一個查詢功能
有與DB溝通的Class,查詢方法會回拋DataTable
前端做GridView+ObjectDataSource
現在想要做後端驗證
驗證的方式是在傳入參數加入一個自訂類別 myValidClass的 output參數叫msg
在函式開頭就會先做驗證
有錯誤的時候msg的status屬性就會是false
並且msg的msg屬性會塞錯誤訊息
在網頁端的ODS加上
<asp:Parameter Type="Object" Direction="Output" Name="msg" />
並且加入OnSelected方法ods_Selected
<asp:ObjectDataSource runat="server" ID="ods" .... OnSelected="ods_Selected">
.cs端的ods_Selected方法
protected void ods_Selected(object sender, ObjectDataSourceStatusEventArgs e)
{
myValidClass msg = (myValidClass)e.OutputParameters["msg"];
if (!msg.status)
{
ScriptManager.RegisterStartupScript(this.Page, this.Page.GetType(), "alert", "alert('"+msg.msg+"');", true);
}
}
DB溝通class的方法
public DataTable search(string parameter1, out myValidClass msg)
{
DataTable dt=new DataTable();
//Do your validate method
msg=new myValidClass();
msg.status=true;
if(string.IsNullOrEmpty(parameter1))
{
msg.status=false;
msg.msg="參數1不可為空";
}
if(msg.status)
{
dt=db.getData(parameter1);
}
return dt;
}
這樣在做完查詢後ods_Selected方法就會檢查msg有沒有錯誤,
有錯誤就會alert錯誤訊息
2015年11月18日 星期三
[C#][擴充方法] 取得西元日期的民國年月日
/// <summary> 將西元日期轉民國日期 回傳 字串陣列[0]民國年YYY [1]月MM [2]日DD</summary>
/// <param name="datetime">要轉換的日期</param>
/// <returns>字串陣列[0]民國年YYY [1]月MM [2]日DD</returns>
public static string[] ToSimpleTaiwanDate(this DateTime datetime)
{
TaiwanCalendar taiwanCalendar = new TaiwanCalendar();
return new string[]{
taiwanCalendar.GetYear(datetime).ToString(),
datetime.Month.ToString().PadLeft(2,'0'),
datetime.Day.ToString().PadLeft(2,'0')};
}
/// <summary> 將西元日期轉民國日期 回傳 字串陣列[0]民國年YYY [1]月MM [2]日DD</summary>
/// <param name="datetime">要轉換的日期</param>
/// <returns>字串陣列[0]民國年YYY [1]月MM [2]日DD</returns>
public static string ToSimpleTaiwanDate_YYYMMDD(this DateTime datetime)
{
TaiwanCalendar taiwanCalendar = new TaiwanCalendar();
return
taiwanCalendar.GetYear(datetime).ToString()+
datetime.Month.ToString().PadLeft(2,'0')+
datetime.Day.ToString().PadLeft(2,'0');
}
標籤:
日期,
民國年,
西元年,
C#,
Extension Method
[C#][擴充方法] 取得日期的統一發票期別
/// <summary> 傳入日期傳出發票期別的兩個數字 [1 2] [3 4]...</summary>
/// <param name="datetime">要判斷的日期</param>
/// <returns> 整數陣列[0]期別第一個月份 [1]期別第二個月份 </returns>
public static int[] ToInvoiceMonthRange(this DateTime datetime)
{
//2 4 6 8...->餘0 ->[2-1,2][4-1,4]
//1 3 5 7...->餘1 ->[1,1+1][3,3+1]
return (datetime.Month % 2) == 0
? new int[] { datetime.Month - 1, datetime.Month }
: (datetime.Month % 2) == 1
? new int[] { datetime.Month, datetime.Month+1 }
: new int[] { 0, 0 };
}
標籤:
日期,
期別,
統一發票,
C#,
Extension Method
2015年10月30日 星期五
C# call AS400 RPG program
markdown
# 背景
因為有RPG程式老舊但一時間又不能轉出來,只能先靠程式去呼叫,
所以就用C#引用AS400元件去呼叫RPG,得到結果。
# 使用DLL
`C:\Program Files (x86)\IBM\Client Access\Shared\cwbx.dll`
# 加入參考的時候要注意內嵌 Interop 型別的問題
REF:http://blog.miniasp.com/post/2010/06/21/dot-net-4-Interop-type-cannot-be-embedded-Use-the-applicable-interface-instead.aspx
# 程式碼參考:
REF:http://forums.asp.net/t/1817332.aspx?calling+as400+programs+from+c+
```C#
using cwbx; public string getRPGProgramReturnValue(string functionName, string LibraryName, string ProgramName, ProgramParameters parameters, string outputParameterName, out CUDResult msg) { msg = new CUDResult(); string result = string.Empty; StringConverter stringConverter = new StringConverterClass(); AS400System system = new AS400System(); try { // 定義 AS400 連線資訊 system.Define("AS400"); system.UserID = "你的帳號"; system.Password = "你的密碼"; //注意:一定要是IP,用domain網址會跳一個"CWB4016 - cwbCO_SetIPAddressW 傳回錯誤碼 87"的錯誤 system.IPAddress = "你的伺服器IP"; system.Connect(cwbcoServiceEnum.cwbcoServiceRemoteCmd); // 有連線才繼續 if (system.IsConnected(cwbcoServiceEnum.cwbcoServiceRemoteCmd) == 1) { // 宣告程式物件 連到系統 cwbx.Program program = new cwbx.Program(); program.LibraryName = LibraryName; program.ProgramName = ProgramName; program.system = system; // 呼叫程式 try { program.Call(parameters); } catch (Exception ex) { msg.status = false; msg.msg += "呼叫程式時發生錯誤:" + ex.Message + "\n"; if (system.Errors.Count > 0) { msg.msg += "呼叫程式時發生system錯誤:"; foreach (cwbx.Error error in system.Errors) { msg.status = false; msg.msg += error.Text + "\n"; } } if (program.Errors.Count > 0) { msg.msg += "呼叫程式時發生program錯誤:"; foreach (cwbx.Error error in program.Errors) { msg.status = false; msg.msg += error.Text + "\n"; } } } result = stringConverter.FromBytes(parameters[outputParameterName].Value); } else { msg.status = false; msg.msg += "無法連線到AS400 ServiceRemoteCmd\n"; } system.Disconnect(cwbcoServiceEnum.cwbcoServiceAll); msg.status = true; } catch (Exception ex) { system.Disconnect(cwbcoServiceEnum.cwbcoServiceAll); msg.status = false; msg.msg += "執行" + functionName + "時發生錯誤:" + ex.Message + "\n"; } return result; } ```
# 追記
20180530 在改寫舊程式時我把IP換成DOMAIN,因應管理要求,
結果就跳出一個`CWB4016 - cwbCO_SetIPAddressW 傳回錯誤碼 87`的錯誤,
研究了半天想說自己沒改什麼東西,google也查不到什麼,
回頭看自己改的東西才想到那個欄位是IP,該不會不能填網址,
就改回IP,就正常了,算踩到一個雷。
但他還有一個`IPAddressLookupMode`屬性,我是沒試過。
# 背景
因為有RPG程式老舊但一時間又不能轉出來,只能先靠程式去呼叫,
所以就用C#引用AS400元件去呼叫RPG,得到結果。
# 使用DLL
`C:\Program Files (x86)\IBM\Client Access\Shared\cwbx.dll`
# 加入參考的時候要注意內嵌 Interop 型別的問題
REF:http://blog.miniasp.com/post/2010/06/21/dot-net-4-Interop-type-cannot-be-embedded-Use-the-applicable-interface-instead.aspx
# 程式碼參考:
REF:http://forums.asp.net/t/1817332.aspx?calling+as400+programs+from+c+
```C#
using cwbx; public string getRPGProgramReturnValue(string functionName, string LibraryName, string ProgramName, ProgramParameters parameters, string outputParameterName, out CUDResult msg) { msg = new CUDResult(); string result = string.Empty; StringConverter stringConverter = new StringConverterClass(); AS400System system = new AS400System(); try { // 定義 AS400 連線資訊 system.Define("AS400"); system.UserID = "你的帳號"; system.Password = "你的密碼"; //注意:一定要是IP,用domain網址會跳一個"CWB4016 - cwbCO_SetIPAddressW 傳回錯誤碼 87"的錯誤 system.IPAddress = "你的伺服器IP"; system.Connect(cwbcoServiceEnum.cwbcoServiceRemoteCmd); // 有連線才繼續 if (system.IsConnected(cwbcoServiceEnum.cwbcoServiceRemoteCmd) == 1) { // 宣告程式物件 連到系統 cwbx.Program program = new cwbx.Program(); program.LibraryName = LibraryName; program.ProgramName = ProgramName; program.system = system; // 呼叫程式 try { program.Call(parameters); } catch (Exception ex) { msg.status = false; msg.msg += "呼叫程式時發生錯誤:" + ex.Message + "\n"; if (system.Errors.Count > 0) { msg.msg += "呼叫程式時發生system錯誤:"; foreach (cwbx.Error error in system.Errors) { msg.status = false; msg.msg += error.Text + "\n"; } } if (program.Errors.Count > 0) { msg.msg += "呼叫程式時發生program錯誤:"; foreach (cwbx.Error error in program.Errors) { msg.status = false; msg.msg += error.Text + "\n"; } } } result = stringConverter.FromBytes(parameters[outputParameterName].Value); } else { msg.status = false; msg.msg += "無法連線到AS400 ServiceRemoteCmd\n"; } system.Disconnect(cwbcoServiceEnum.cwbcoServiceAll); msg.status = true; } catch (Exception ex) { system.Disconnect(cwbcoServiceEnum.cwbcoServiceAll); msg.status = false; msg.msg += "執行" + functionName + "時發生錯誤:" + ex.Message + "\n"; } return result; } ```
# 追記
20180530 在改寫舊程式時我把IP換成DOMAIN,因應管理要求,
結果就跳出一個`CWB4016 - cwbCO_SetIPAddressW 傳回錯誤碼 87`的錯誤,
研究了半天想說自己沒改什麼東西,google也查不到什麼,
回頭看自己改的東西才想到那個欄位是IP,該不會不能填網址,
就改回IP,就正常了,算踩到一個雷。
但他還有一個`IPAddressLookupMode`屬性,我是沒試過。
標籤:
AS400,
C#,
cwbx.dll,
RPG program
訂閱:
文章 (Atom)