2016年3月14日 星期一

C# Winform 子父視窗 傳值

這是我認為父子視窗之間最容易的傳值方法。

首先是建立會帶入參數的子視窗 form2 。



 public Form2(string parament)  //父視窗傳入的值
        {
            InitializeComponent();
            label2.Text = parament;
        }
        public string fm2_Text;        //記錄傳回form1的值

        private void button2_Click(object sender, EventArgs e)
        {
            fm2_Text = textBox2.Text;
        }

父視窗form1的部份,基本上就是呼叫子視窗,

呼叫時記得帶入值。



 
 private void button1_Click(object sender, EventArgs e)
        {
            Form2 fm2= new Form2("hello");
            
            if (fm2.ShowDialog() == DialogResult.OK)
            {
                this.label1.Text = fm2.fm2_Text; 
            }
        }



由於呼叫子視窗form2是使用ShowDialog(),

所以記得在form2的button屬性中設定DialogResult為ok即可 。

2016年2月25日 星期四

C# Winform 只能執行一個應用程式 不可重複

避免應用程式重複執行。
在Program.cs 的static void Main()加入此段
//是否可以打開新進程
bool newApp;

//獲取程式集Guid作為唯一標識
Attribute flag = Attribute.GetCustomAttribute(Assembly.GetExecutingAssembly(), typeof(GuidAttribute));
string guid = ((GuidAttribute)flag).Value;
_mutex = new System.Threading.Mutex(true, guid, out newApp);
if (false == newApp)
{
//發現重複進程
MessageBox.Show("應用系統不可重複開啟!");
return;
}
_mutex.ReleaseMutex();

2016年2月18日 星期四

Javascript 跑馬燈 Marquee 2種方法 (ex. 讀取中, 請稍候...)

方法1

( for IE only )

javascript 內容

var it=0
function initialize(){
mytext=typing.innerText
var myheight=typing.offsetHeight
typing.innerText=''
document.all.typing.style.height=myheight
typeit()
}
function typeit(){
typing.insertAdjacentText("beforeEnd",mytext.charAt(it))
if (it < mytext.length - 1)
{
it++
setTimeout("typeit()",100)
}
return
}
if (document.all)
document.body.onload=initialize

html部份如下:

< SPAN id=typing style="FONT-SIZE: 18pt; COLOR: #1A61A9; FONT-FAMILY: 新細明體; LETTER-SPACING: 2pt">讀取中, 請稍候‥‥‥‥‥‥< /SPAN>

方法2

( for IE CHROME FIREFOX )

javascript 內容

var text = "讀取PNR中, 請稍候‥‥‥‥‥‥";
var delay=50;
var currentChar=1;
var destination="[not defined]";

function type()
{
  if (document.getElementById)
  {
    var dest=document.getElementById(destination);
    if (dest)// && dest.innerHTML)
    {
      dest.innerHTML=text.substr(0, currentChar);
      //dest.innerHTML+=text[currentChar-1];
      currentChar++
      if (currentChar>text.length)
      {
        currentChar=1;
        setTimeout("type()", 5000);
      }
      else
      {
        setTimeout("type()", delay);
      }
    }
  }
}

function startTyping(textParam, delayParam, destinationParam)
{
  text=textParam;
  delay=delayParam;
  currentChar=1;
  destination=destinationParam;
  type();
}

html部份如下:

< body onload="startTyping(text, 50, 'textDestination');">
...
< /body>

2016年2月17日 星期三

C# 獲取客戶端主機位址 (真實ip 或代理 ip)

      
        if (HttpContext.Current.Request.ServerVariables["HTTP_VIA"] != null)
        {
          ClientIP = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
          //取得真實用戶端的IP
        }
        else
        {
          ClientIP = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
          //取得用戶端的IP(有可能為代理伺服器)
        }

2016年2月3日 星期三

Nujabes luv sic


寫程式的時後我會專注某一首歌曲,

從早天到晚反覆聽直到下班。



Nuhabes 我寫程式的好夥伴,

所製作的 jazz hip-hop 節奏旋律細膩易共鳴,

清新雋永值得一聽再聽,

從素人唱片行店員到知名DJ的音樂生涯更具故事性。




可惜

因車禍意外過世..........傳奇的結尾也是傳奇。


Nujabes luv sic  part 1 - 6  愛情的所有階段我想都包含在內了。





C# Asp.net 利用 winform 控制 web server 記憶體

目前被指派寫一個winform常駐程式,

比對資料庫資料和call總部webservice的回傳值是否有異,

若有則更新資料庫資料。

原本以為定時比對利用timer跑個迴圈比對就沒事了,

結果更新完資料庫資料後,

發現台灣local這邊的網站顯示資料卻沒有更新!!!

Orz....


細查發現公司webform應用程式顯示資料時,

是先看伺服器記憶體中(global.asax記錄了定期更新的資料及最後updatedTime)有無暫存資料,

若有就直接讀取不再浪費連線效能, 

因此我的常駐程式勢必得想辦法重新啟動伺服器記憶體或修改global.asax的最後updatedTime,
想了老半天才發現原來方法沒那麼複雜........想太多.........

在公司webform應用程式中寫一段webserive用來更新global.asax的updatedTime
 (公司是設定一個月前的舊資料就連線資料庫撈資料,再將最新資料儲存伺服器記憶體內),

然後我的常駐winform呼叫此webservice修改updatedTime就可以達成我想要的目的,

就這麼簡單,

程式碼三行完成需求......但這三行卻浪費我想一天,果然太嫩...。


[WebMethod(EnableSession = true)]        
        public void changeUpdateTime()
        {
            HttpContext.Current.Application.Lock();
            Global.dictionaryDom.lastUpdateTime = DateTime.Now.AddYears(-5);
            HttpContext.Current.Application.UnLock();    
        }

C# Datatable 尋找 row的index

datatblle讀取xml資料綁定datagridview,

預設有做篩選資料,

由於無用自動繫結datagridview

刪除資料或修改後反而找不到對應的index,

因此不得不用下面方法,

謹記

//找出要修改的資料
DataRow[] dr = dt.Select("code='123'");

//取得要修改的指標
int index = dt.Rows.IndexOf(dr[0]);

C# winform datagridview 增加全選功能

datagridview加上全選功能,

網路大神的寫法,

紀錄並學習。

初始化時加入
public Form1()
        {
            InitializeComponent();
             
            //加入全選
            ckeckboxSelectAll .dgv = dataGridView1;                
            ckeckboxSelectAll .AddSelectAllcheckbox();   
        }
cb.Location 調整參數到指定位置
public class ckeckboxSelectAll 
        {
            public static System.Windows.Forms.DataGridView dgv;
            
            public static void AddSelectAllcheckbox()
            {
                System.Windows.Forms.CheckBox cb= new System.Windows.Forms.CheckBox();
                cb.Text = "";
                cb.Checked = false;
                System.Drawing.Rectangle rect = dgv.GetCellDisplayRectangle(0, -1, true);
                cb.Size = new System.Drawing.Size(13, 13);
                cb.Location = new Point(rect.Location.X + dgv.Columns[0].Width - 55, rect.Location.Y + 3);
                cb.CheckedChanged += new EventHandler(cb_CheckedChanged);
                dgv.Controls.Add(cb);
            }
            
            static void cb_CheckedChanged(object sender, EventArgs e)
            {
                for (int i = 0; i < dgv.Rows.Count; i++)
                {
                    dgv.Rows[i].Cells[0].Value = ((System.Windows.Forms.CheckBox)sender).Checked;
                }
                dgv.EndEdit();
            }
            
        }