[C#] 問號"?"用法

在C#中「?」有三種用法。

  1. 可空類型修飾符(?):引用類型可以使用空引用表示一個不存在的值,而值類型通常不能表示為空,例如:string str=null;是正確的。int i=null;編譯器將報錯。為了使值類型也可為空,可空類型出現了,可空類型使用可空類型修飾符?來表示,表現形式為T?。例:int? 表示是可空的整形,DateTime?表示為可空的時間。T?其實是System.Nullable<T>(泛型結構)的縮寫形式,也就意味著當你用到T?時編譯器在編譯時會把T?編譯成System.Nullable<T>的形式,例如:int?,編譯後便是System.Nullable<int>的形式。
  2. 三元(運算符)表達式(?:)。
  3. 空合併運算符(??):用於定義可空類型和引用類型的默認值。如果此運算符的左操作數不為 null,則此運算符將返回左操作數;否則返回右操作數。 例:a ?? b,當a為null時則返回b,a不為空時返回a本身。空合併運算符為右結合運算符,即操作時從右向左進行組合的。如,「a ?? b ?? c」的形式按「a ?? (b ?? c)」計算。

文章來源:http://blog.csdn.net/loveyou128144/article/details/4409706

廣告
Posted in C#

[C#] 複合格式字串, .Format .WriteLine 等等~

原出處:微軟

.NET Framework 複合格式功能會採用物件清單和複合格式字串做為輸入。 複合格式字串是由混合索引替代符號 (Placeholder) 的固定文字所組成 (這些符號稱為對應至清單內物件的格式項目)。 格式作業產生的結果字串是由原始固定文字所組成,這些固定文字混合了清單中代表物件的字串。
下列方法支援複合格式功能:

  • String.Format ,傳回格式化的結果字串。
  • StringBuilder.AppendFormat ,將格式化的結果字串附加至 StringBuilder 物件。
  • Console.WriteLine 方法的部分多載,對主控台顯示格式化的結果字串。
  • TextWriter.WriteLine 方法的部分多載,將格式化的結果字串寫入至資料流或檔案。 衍生自 TextWriter 的類別,例如 StreamWriter 和 HtmlTextWriter,也會共用這項功能。
  • Debug.WriteLine(String, Object[]) ,將格式化的訊息輸出至追蹤接聽項。
  • Trace.TraceError(String, Object[]) 、Trace.TraceInformation(String, Object[]) 和 Trace.TraceWarning(String, Object[]) 方法,將格式化的訊息輸出至追蹤接聽項。
  • TraceSource.TraceInformation(String, Object[]) 方法,將告知性方法寫入至追蹤接聽項。

複合格式字串

複合格式字串和物件清單會當做支援複合格式功能之方法的引數來使用。 複合格式字串是由零個或更多段與一個或多個格式項目混合的固定文字所組成, 固定文字是您選擇的任何文字,而每個格式項目都會對應到清單內的一個物件或 boxed 結構。 複合格式功能將會傳回新的結果字串,其中每一個格式項目都會由清單內對應物件的字串表示來取代。
請考量下列 Format 程式碼片段。

string myName = "Fred";
String.Format("Name = {0}, hours = {1:hh}", myName, DateTime.Now);

固定的文字為 “Name = " 和 “, hours = “。 格式項目為 “{0}" (其索引為 0,且會對應至物件 myName) 及 “{1:hh}" (其索引為 1,且會對應至物件 DateTime.Now)。

格式項目語法

每個格式項目都會使用下列格式,並由下列元件所組成:
{ index[,alignment][:formatString]}
成對的大括號 (“{" 和 “}") 是必要的。
-索引元件
強制的 index 元件 (也稱為參數規範) 是用以識別物件清單中對應項目的數字 (從 0 開始)。 也就是說,參數規範為 0 的格式項目會格式化清單中的第一個物件,而參數規範為 1 的格式項目會格式化清單中的第二個物件,依此類推。
多個格式項目可以藉由指定相同參數規範來參考物件清單中的相同項目。 例如,您可以指定複合格式字串 (如:"{0:X} {0:E} {0:N}") 來格式化十六進位、科學格式和數字格式的相同數值。
每個格式項目皆可參考清單內的任何物件。 例如,如果有三個物件,您可以指定複合格式字串 (如:"{1} {0} {2}") 來格式化第二個、第一個和第三個物件。 不是格式項目所參考的物件會被忽略。 如果參數規範指派超出物件清單範圍的項目,即會產生執行階段例外狀況。
-對齊元件
選擇性 alignment 元件為帶正負號的整數 (Signed Integer),它指示慣用的格式化欄位寬度。 如果 alignment 的值小於格式化字串的長度,alignment 會被忽略而使用格式化字串的長度當做欄位寬度。 如果 alignment 為正數,欄位中的格式化資料會靠右對齊;如果 alignment 為負數,則會靠左對齊。 如果填補有必要,則會使用泛空白字元 (White Space)。 如果指定了 alignment,逗號即是必須的。
-格式字串元件
選擇性的 formatString 元件是一個格式字串,適用於將格式化的物件類型。 如果對應的物件為數值,請指定標準或自訂數值格式字串;如果對應的物件為 DateTime 物件,請指定標準或自訂日期和時間格式字串;或者,如果對應的物件為列舉值,請指定列舉格式字串。 如果未指定 formatString,則會使用數值、日期和時間或列舉類型的一般 (“G") 格式規範。 如果指定 formatString,則需要冒號。

Posted in C#

[ASP.Net] 跨網頁傳遞資料

http://www.dotblogs.com.tw/antony77/archive/2010/04/05/14417.aspx

使用 HttpWebRequest 來作
http://www.coolsun.idv.tw/modules/xhnewbb/viewtopic.php?topic_id=1273
http://coding.anyun.tw/2012/02/22/using-httpwebrequest-post-data/
http://www.dotblogs.com.tw/joysdw12/archive/2012/12/04/85380.aspx

//取得當前網址及路徑
string urlPath = "";
string[] segments = Request.Url.Segments;
for (int i = 0; i <= segments.Length - 2; i++)
{
    urlPath = urlPath + segments[i];
}

string bankUrl = string.Format("http://{0}:{1}{2}RedirectHandler.ashx", Request.Url.Host, Request.Url.Port, urlPath);
String parm = "BillerSeqNo=2014052361106509&Currency=NTD&Amount=1235500";

HttpTool http = new HttpTool();
NameValueCollection ackColl = http.SendRequest(bankUrl, parm);

if (ackColl == null)
{
    string alertScript = "處理失敗,請重新操作!<br />(ACK Null)";
    return;
}

string parm1 = ackColl["BillerSeqNo"];
string parm2 = ackColl["Currency"];

HttpTool.cs

using System;
using System.Web;
using System.Text;
using System.Net;
using System.IO;
using System.Collections.Specialized;

public class HttpTool
{
    public NameValueCollection SendRequest(string iTargetUrl, string iParam)
    {
        //此處的編碼要注意,是否會錯編 "&" 及 "=" 符號
        byte[] postData = Encoding.UTF8.GetBytes(iParam);
        HttpWebRequest request = HttpWebRequest.Create(iTargetUrl) as HttpWebRequest;
        request.Method = "POST";
        request.ContentType = "application/x-www-form-urlencoded";
        request.Timeout = 10000;
        request.ContentLength = postData.Length;
        request.AllowAutoRedirect = false;  // 禁止重新導向網頁

        // 寫入 Post Body Message 資料流
        using (Stream st = request.GetRequestStream())
        {
            st.Write(postData, 0, postData.Length);
        }

        NameValueCollection qsColl = null;
        // 取得回應資料
        using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
        {
            if (response.StatusCode == HttpStatusCode.Found) // 判斷是否為 302
            {
                // 取得返回的Header中的Location參數,Location含有重新導向的網址資訊
                Uri redirectUrl = new Uri(response.Headers["Location"]);

                // 回傳全部參數的集合
                // Parse the query string variables into a NameValueCollection.
                qsColl = HttpUtility.ParseQueryString(redirectUrl.Query, Encoding.UTF8);
            }
        }
        return qsColl;
    }
}

RedirectHandler.ashx

using System;
using System.Web;
using System.Collections.Specialized;

public class RedirectHandler : IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
        context.Response.ContentType = "text/plain";
        string url = @"http://127.0.0.1/AppPayCB/PaymentResult.aspx";

        NameValueCollection pColl = context.Request.Params;
        string all = string.Format(@"{0}?BillerSeqNo={1}&Currency={2}", url, pColl["BillerSeqNo"], pColl["Currency"]);
        context.Response.Redirect(all);
    }

    public bool IsReusable
    {
        get
        {
            return false;
        }
    }
}

[.Net] Entity Framework 批次 Update 與 Delete

用 LINQ to SQL 或 LINQ to Entities,在 Select 方面用起來有如神助飛快的方便,但在批次 Update 或 Delete 方面就遜色很多,完全就如 ADO.NET 時期下 SQL 一樣,沒有物件導向可言。
本篇將介紹如何用挖出 Entity Framework 的 Metadata,以 Expression 的方式組成SQL。

Entity Framework 批次 Update 與 Delete
Multiple entity updates with Entity Framework – EF Fetch Updates

在 LINQ to SQL 時,如何使 Transaction:
http://blog.darkthread.net/post-2008-05-14-transaction-in-linq-to-sql.aspx
http://stackoverflow.com/questions/755796/how-to-create-a-linq-to-sql-transaction
http://forums.asp.net/t/1937757.aspx?Transaction+Rollback+in+LINQ+to+SQL

ASP C# 以POST方式傳送參數並轉向瀏覽網頁

在 ASP.Net C# 中,以POST方式傳送參數到別的網頁,並轉向瀏覽此網頁

 
基本上使用 Redirect and POST 此篇文章的方法
http://www.codeproject.com/Articles/37539/Redirect-and-POST-in-ASP-NET

 
在使用 UpdatePanel 的區域內,則使用以上方法之 function 的 Control,需對 ScriptManager 做註冊的動作。
其用意為,以 PostBackTrigger 方法,更新整個頁面。否則,在執行階段會有 thread 的 error exception。

 
以 LinkButton 的 click 事件為例

protected void lbtnETPR_Click(object sender, EventArgs e)
{
  LinkButton lbtnETPR = sender as LinkButton;
  GridViewRow gvRow = lbtnETPR.NamingContainer as GridViewRow;
  string adno = gvRow.Cells[0].Text;

  DataRow[] row = pEventDs.Tables["pEvents"].Select("ammadno = '" + adno + "'");
  string crtno = row[0]["ammpatno"].ToString();

  NameValueCollection data = new NameValueCollection();
  data.Add("crtno", crtno);
  data.Add("hospno", "01");
  data.Add("notshowfg", "Y");
  HttpHelper.RedirectAndPOST(this.Page, "http://192.168.1.1/tpr/tprshow.aspx", data);
}

 
靜態的註冊方式:

<ajaxToolkit:ToolkitScriptManager ID="ToolkitScriptManager1" runat="server" />
<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
  <ContentTemplate>
    <asp:LinkButton ID="lbtnETPR" runat="server" OnClick="lbtnETPR_Click" Text="ETPR" />
  </ContentTemplate>
  <Triggers>
    <asp:PostBackTrigger ControlID="lbtnETPR" />
  </Triggers>
</asp:UpdatePanel>

 
如果,control 是位於 GridView 元件的自定欄位(TemplateField)內,則需使用動態的註冊方式:

<ajaxToolkit:ToolkitScriptManager ID="ToolkitScriptManager1" runat="server" />
<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
  <ContentTemplate>
    <asp:GridView ID="GridView1" runat="server" DataKeyNames="ammadno" OnRowDataBound="GridView1_RowDataBound" >
    <Columns>
      <asp:TemplateField HeaderText="Order">
      <ItemTemplate>
        <asp:LinkButton ID="lbtnETPR" runat="server" OnClick="lbtnETPR_Click" Text="ETPR" />
        <asp:LinkButton ID="lbtnPrscrp" runat="server" Onclick="lbtnPrscrp_Click" Text="Order" />
      </ItemTemplate>
      </asp:TemplateField>
    </Columns>
    </asp:GridView>
  </ContentTemplate>
</asp:UpdatePanel>
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
  if (e.Row.RowType != DataControlRowType.DataRow) return;
  //相當於在 aspx 中, 加入 UpdatePanel 之 PostBackTrigger 的作用
  ToolkitScriptManager1.RegisterPostBackControl(e.Row.FindControl("lbtnETPR"));
}
Posted in ASPC# | 已加上的標籤