2018年2月27日 星期二

[Android] AndroidManifest.xml 檔案

<?xml version="1.0" encoding="utf-8"?>
<!-- project name=package -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="net.minaik.sfc">
    <!-- Internet setting, required -->
    <uses-permission android:name="android.permission.INTERNET"></uses-permission>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
    <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme">
        <!--start page-->
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <!--subpage-->
        <activity android:name=".ListActivity" />
        <activity android:name=".TransActivity"></activity>
    </application>
</manifest>

2018年2月12日 星期一

[Android] Spinner選單

1.固定選項

layout.xml 
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin"> <Spinner android:id="@+id/spinner" android:layout_width="match_parent" android:layout_height="wrap_content" /> </RelativeLayout>

string.xml
 <resources>
<string name="app_name">SpinnerDemo</string> <string-array name="lunch"> <item>雞腿飯</item> <item>魯肉飯</item> <item>排骨飯</item> <item>水餃</item> <item>陽春麵</item> </string-array> </resources>

java-code
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Spinner spinner = (Spinner)findViewById(R.id.spinner); ArrayAdapter<CharSequence> lunchList = ArrayAdapter.createFromResource(MainActivity.this, R.array.lunch, android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(lunchList); } }

simple_spinner_dropdown_item 


2.動態選項


ayout.xml 
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin"> <Spinner android:id="@+id/spinner" android:layout_width="match_parent" android:layout_height="wrap_content" /> </RelativeLayout>

java-code
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Spinner spinner = (Spinner)findViewById(R.id.spinner); final String[] lunch = {"雞腿飯", "魯肉飯", "排骨飯", "水餃", "陽春麵"}; ArrayAdapter<String> lunchList = new ArrayAdapter<>(MainActivity.this, android.R.layout.simple_spinner_dropdown_item, lunch); spinner.setAdapter(lunchList); } }

--------------------------------------------------------------------------------

 java all

public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
//動態選單 Spinner spinner = (Spinner)findViewById(R.id.spinner); final String[] lunch = {"雞腿飯", "魯肉飯", "排骨飯", "水餃", "陽春麵"}; ArrayAdapter<String> lunchList = new ArrayAdapter<>(MainActivity.this, android.R.layout.simple_spinner_dropdown_item, lunch); spinner.setAdapter(lunchList);

//選單動作
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { Toast.makeText(MainActivity.this, "你選的是" + lunch[position], Toast.LENGTH_SHORT).show(); } @Override public void onNothingSelected(AdapterView<?> parent) { } }); } }

onItemSelected事件中所代表的是當使用者按下 Spinner 的某個 item 
該怎麼處理它們, 

2018年1月17日 星期三

[C#] ThreadTimer

using System;

namespace T_API
{    class Thread_GL
    {
        public class Guarder : IDisposable
        {
            //---------------------------------------------------------------
            //Member variable
            //---------------------------------------------------------------

            private System.Threading.Timer ThreadTimer;
            private UInt16 count;
           
            //private  Watchdog wdg;
            //---------------------------------------------------------------
            //Member functions
            //---------------------------------------------------------------

            public void Start()
            {
                count = 0;
                if (ThreadTimer == null)
                {
                    //委派 MainFunction 每10秒執行一次
                    ThreadTimer = new System.Threading.Timer(new System.Threading.TimerCallback(Task), this, 1, 10 * 1000);//10秒

                }
               
            }

            public void Stop()
            {
                if (ThreadTimer != null)
                {
                    ThreadTimer.Dispose();
                    ThreadTimer = null;
                }
               
            }

            ~Guarder()
            {
                this.Dispose();
            }

            public void Dispose()
            {
                Stop();
                GC.SuppressFinalize(this);
            }

            //依據各工作預定時間呼叫Working Thread
            private void Task(object obj)
            {
                this.count++;
                //[Updater]
                //每10秒(1HR)檢查一次

                if (this.count % 1 == 0)
                {

                }
            }
        }

    }
}

2018年1月15日 星期一

Web API controller (1)

using Oracle.ManagedDataAccess.Client;
using System.Collections.Generic;
using System.Data;
using System.Web.Http;

namespace WebApplication1.Controllers
{
    //[Authorize]驗證權限 
    public class ValuesController : ApiController
    {
        // GET api/values
        public IEnumerable<string> Get()
        {


            return new string[] { "value1", "value2" };
        }

        // GET api/values/5
        public string Get(int id)
        {
           
            return "value";
        }

        // POST api/values
        public void Post([FromBody]string value)
        {
        }

        // PUT api/values/5
        public void Put(int id, [FromBody]string value)
        {
        }

        // DELETE api/values/5
        public void Delete(int id)
        {
        }
    }
}

參考:https://dotblogs.com.tw/kevintan1983/2013/11/18/130230

[IIS]iis 建置網站指令

cd\
cd  windows\System32\inetsrv\

APPCMD ADD APPPOOL /name:MyAppPool4.0 /managedRuntimeVersion:"v4.0"

APPCMD ADD SITE /name:"Wapi_ERP" /bindings:http://*:9005 /physicalPath:"D:\DEV\Wapi_ERP\Wapi_ERP"

APPCMD SET SITE /site.name:Wapi_ERP /[path='/'].applicationPool:MyAppPool4.0

pause


存成 IIS.bat

2018年1月8日 星期一

[Error] Gridview & ScriptManager

經web ui contrls 更新Gridview (ScriptManager)時可能會出現以下錯誤

無效的回傳或回呼引數。已在組態中使用 <pages enableEventValidation="true"/> 或在網頁中使用 <%@ Page EnableEventValidation="true" %> 啟用事件驗證。基於安全性理由,這項功能驗證回傳或回呼引數是來自原本呈現它們的伺服器控制項。如果資料為有效並且是必需的,請使用 ClientScriptManager.RegisterForEventValidation 方法註冊回傳或回呼資料,以進行驗證。

請檢查
IsPostBack 是否有使用
請檢查 Page_Load裡面在BindData的程式是不是沒有加上 if(!IsPostback)
尤其是在gridview裡面有控制項的功能時...
不需要每次都binddata,只要non postback作一次就可以了

衍生問題,若是在 IsPosBack 無法自動產生gridview 內的controls或遺失
請將controls 分成二部分產生

1.GridView1_RowCreated
自動產生控制項,gridview  的default。
2. GridView1_RowDataBound
 設定控制項內的資料連繫。

2017年12月21日 星期四

Response.End 的Exception -Thread was being aborted

下載檔案發生 exception
Thread was being aborted
本來看到有人說不執行既可
但用Try/catch 包住不執行ThreadAbortException 的例外,一樣會有問題
且違反例外原則

參考了黑大及傑哥的文件後,將 Response.End()拿掉,換成HttpContext.Current.ApplicationInstance.CompleteRequest();
解決;感謝。



 public void DownloadFile( string Files)
    {
        try
        {
            string FileName = Path.GetExtension(Files);
            System.Web.HttpContext.Current.Response.Clear(); //清除buffer
            System.Web.HttpContext.Current.Response.ClearHeaders(); //清除 buffer 表頭
            System.Web.HttpContext.Current.Response.Buffer = false;
            System.Web.HttpContext.Current.Response.ContentType = "application/octet-stream";
            // 檔案類型還有下列幾種"application/pdf"、"application/vnd.ms-excel"、"text/xml"、"text/HTML"、"image/JPEG"、"image/GIF"
            System.Web.HttpContext.Current.Response.AppendHeader("Content-Disposition", "attachment;filename=" + System.Web.HttpUtility.UrlEncode(FileName, System.Text.Encoding.UTF8));
            // 考慮 utf-8 檔名問題,以 out_file 設定另存的檔名
            //System.Web.HttpContext.Current.Response.AppendHeader("Content-Length", attach.Length.ToString()); //表頭加入檔案大小
            //System.Web.HttpContext.Current.Response.BinaryWrite(attach);
            System.Web.HttpContext.Current.Response.WriteFile(Files);
            // 將檔案輸出
            System.Web.HttpContext.Current.Response.Flush();
            // 強制 Flush buffer 內容
            //System.Web.HttpContext.Current.Response.End();
          HttpContext.Current.ApplicationInstance.CompleteRequest();
        }

        catch (ThreadAbortException ex)
        { }
        catch (Exception ex)
        {
            throw ex;
        }

    }

參考:
http://blog.darkthread.net/post-2007-03-08-threadabortexception-when-response-end.aspx
https://dotblogs.com.tw/jeffyang/2017/06/14/214252