2016年11月28日 星期一

製作row與column非固定的GridView

基本上原本的Gridview不能完成此項功能,因為如果是用動態新增column會抓不到ID
所以我這邊的做法是,使用雙重的ListVew做到動態新增row與column

外層是 row的 ListView 製作,然後裡面層是在外層的DataItem裡面多放一層ListView
然後裡面層的資料可以用外面層的物件,寫法如下


<asp:ListView ID="lvRoom" runat="server" ItemPlaceholderID="itemPlaceHolderRoom">
                        <LayoutTemplate>
                            <asp:PlaceHolder ID="itemPlaceHolderRoom" runat="server"></asp:PlaceHolder>
                             </LayoutTemplate>
                        <ItemTemplate>
                            <tr>
                                <td style="width:10%">
                                    <asp:HiddenField ID="HF_ROOM_ID" runat="server" Value='<%# Eval("ROOM_ID")%>' />
                                    <%# Eval("ROOM_NAME")%>
                                </td>
                                <asp:ListView ID="lvPrice" runat="server"  ItemPlaceholderID="itemPlaceHolderPrice" DataSource='<%# Eval("Price")%>'>
                                    <LayoutTemplate>
                                        <asp:PlaceHolder ID="itemPlaceHolderPrice" runat="server"></asp:PlaceHolder>
                                    </LayoutTemplate>
                                    <ItemTemplate>
                                        <asp:HiddenField ID="HF_PRICE_ID" runat="server" Value='<%# Eval("PRICE_ID")%>' />
                                    </ItemTemplate>
                                </asp:ListView>
                                <td></td>
                            </tr>
                        </ItemTemplate>
                    </asp:ListView>


{
<asp:listview id="lvRoom" itemplaceholderid="itemPlaceHolderRoom" runat="server">
 <layouttemplate>
  <asp:placeholder id="itemPlaceHolderRoom" runat="server"></asp:placeholder>
 </layouttemplate>
 <itemtemplate>
  
   <asp:hiddenfield id="HF_ROOM_ID" runat="server" value="&lt;%# Eval(&quot;ROOM_ID&quot;)%&gt;">
   </asp:hiddenfield><br />

   <asp:listview datasource="&lt;%# Eval(&quot;Price&quot;)%&gt;" id="lvPrice" itemplaceholderid="itemPlaceHolderPrice" runat="server">
    <layouttemplate>
     <asp:placeholder id="itemPlaceHolderPrice" runat="server"></asp:placeholder>
    </layouttemplate>
    <itemtemplate>
     <asp:hiddenfield id="HF_PRICE_ID" runat="server" value="&lt;%# Eval(&quot;PRICE_ID&quot;)%&gt;">  
    </asp:hiddenfield></itemtemplate>
   </asp:listview>
  
 </itemtemplate>
</asp:listview>
}
重點是裡面那層的ListView中的Price物件
    public class Price
    {
        public string PRICE_ID { get; set; }
        public string PRICE_NAME { get; set; }
        public int PRICE { get; set; }
        public int ADDPRICE_MAN { get; set; }
        public int ADDPRICE_BED { get; set; }
    }

    public class Room
    {
        public string ROOM_ID { get; set; }
        public string ROOM_NAME { get; set; }

        public List Price { get; set; }

        public Room()
        { 
            Price = new List();
        }
    }

2016年9月12日 星期一

ASP .Net 送出表單時Server沒有回應

打開Chrome F12時會看到下面的錯誤

 Sys.WebForms.PageRequestManagerServerErrorException: An unknown error occurred while processing the request on the server. The status code returned from the server was: 500

這時治標的方法,是將ValidateRequest="false"的模式下,不過這時候填交表單的安全性就會降低(內部系統就不管那麼多了)

修改內容如下:
 1.在ASPX的標頭加入ValidateRequest="false"
 2.在web.config中加入

  <location path="QA/QA_FAQ.aspx">
    <system.web>
      <httpRuntime requestValidationMode="2.0" />
    </system.web>
  </location>

其中QA/QA_FAQ.aspx是你要送交表單的aspx頁面

2016年9月1日 星期四

更改網頁TextBox內的值,但抓取物件時還是得到更改前的值

這個問題好像一不注意就會很常出現,所以只好來個記錄了(雖然是笨問題)

我的頁面有一個DataList,然後頁面會抓資料庫中的值來進行修改
接著我在按下存檔時,動作是進到DataList的ItemCommand事件
但是我抓到的textbox的文字值一直是存檔之前的值

後來上網找了一下,發現是個很笨的錯誤
原來按下按鈕之後,首先會進入的是pageload而不是直接進入ItemCommand
而我在pageload就是做從資料庫讀取的動作,所以再存檔時抓的值一直是錯誤的

解決方式很簡單,就是在pageload讀資料庫的時候,先判斷是不是postback就好

    protected void Page_Load(object sender, EventArgs e)
    {
        if(!IsPostBack)
        {
            GetQA();
        }        
    }

2016年7月28日 星期四

C#的webservice回傳json時結尾會多出{"d":null}

如果在webservice中
設定this.Context.Response.ContentType = "application/json";
會將回傳格式設定為json,而如果沒有回傳值的話,會預設回傳{"d":null}
修正問題方式

            JsonSerializerSettings s = new JsonSerializerSettings() ;
            string ss = JsonConvert.SerializeObject(bnbLogin, s);
            //輸出json格式

            this.Context.Response.Clear();
            this.Context.Response.ContentType = "application/json";
            this.Context.Response.AddHeader("content-length", ss.Length.ToString());
            this.Context.Response.Flush();

            //輸出json格式
            this.Context.Response.Write(JsonConvert.SerializeObject(bnbLogin));
            HttpContext.Current.ApplicationInstance.CompleteRequest();

重點是中間的content-length,將Response.Write的字串大小固定,就不會多傳{"d":null}了

--

補充:content-length是POST資料的長度,如果傳的內容包含中文時會因為編碼的關係而可能發生錯誤,將

             this.Context.Response.AddHeader("content-length", ss.Length.ToString());

length修改為依照所編碼的字串長度,像我的Server使用UTF8編碼就修改如下:

this.Context.Response.AddHeader("content-length", System.Text.Encoding.UTF8.GetBytes(ss).Length.ToString());

2016年7月25日 星期一

webservice 上傳檔案 找不到路徑 'D:\' 的一部分

在使用webservice上傳檔案時,有出現找不到路徑 'D:\' 的一部分的錯誤
原因可能如下:
1.資料夾權限未開啟
2.路徑錯誤

個人遇到時的錯誤是第二個,路徑在建立時須包含完整資料夾路徑加檔案名稱

FileStream fileStream = new FileStream(Server.MapPath(@".\test\" + this.Context.Request.Files[0].FileName), FileMode.Create);

如果只有前面資料夾部分就會錯誤上傳失敗

2016年7月15日 星期五

為Blogger程式碼排版

參考網站 http://holeyshared.blogspot.tw/2016/05/blogger-code-highlighter.html
-- 這是看了好幾篇文章確定能用的,在這邊做個筆記 我使用的是 Google Code Prettify,進入 Blogger -> 設計 -> [版面配置],按下 [新增小工具],選擇新增 [HTML/JavaScript],然後在小工具中貼入以下程式碼:

<style type="text/css">
/* 程式碼高亮設定 */
/* Main Box */
.pre-highborder{
    border: 1px solid #ff0000;
    padding: 3px 3px 3px 0;
}
pre.prettyprint, code.prettyprint {
    border-radius: 8px;
    -moz-border-radius: 8px;
    -webkit-border-radius: 8px;
    padding: 5px;
 overflow: auto;
    background-color: #eee !important;
    color: black;
    box-shadow: 0 0 5px #999;
    -moz-box-shadow: 0 0 5px #999;
    -webkit-box-shadow: 0 0 5px #999;
}
/*font*/
pre span, code span {
    font-family: 'Consolas', 'Courier New', 'Microsoft JhengHei', sans-serif !important;
    font-size: 12px !important;
}
/*each line*/
li.L0, li.L1, li.L2, li.L3, li.L4, li.L5, li.L6, li.L7, li.L8, li.L9 {
    margin: 0 !important;
    padding: 2px 0 2px 4px !important;
    list-style-type:decimal !important;
    border-left: 1px solid #999;
}
/*even line*/
li.L1, li.L3, li.L5, li.L7, li.L9 {
    background-color: #f6f6f6 !important;
}
/*odd line*/
li.L0, li.L2, li.L4, li.L6, li.L8 {
    background-color: #FFF !important;
}
/*line-number background color*/
ol.linenums {
    background-color: #eee;
    margin-left: 10px;
}
</style>

<script src="https://cdn.rawgit.com/google/code-prettify/master/loader/run_prettify.js"></script>


接著就是在網誌編輯器測試了,用html模式輸入code

<pre class="codeblock prettyprint linenums:1">

public class HelloWorld {
    public static void main (String[] args) {
        System.out.println("Hello, world!\n");
    }
}
<pre >

2016年6月28日 星期二

ASP.NET ListView Get Item

=================== .aspx ==========================================
<asp:ListView ID="lvEvent" runat="server" />
...
<asp:CheckBox ID="CheckBox1" runat="server" />

=================== .cs ==========================================
ListViewItem li = lvEvent.Items[index];
CheckBox cb = (CheckBox)li.FindControl("CheckBox1");
cb.Checked = true;