2015年1月28日 星期三

[Bug] 無法啟用條件約束。一或多個資料列的值違反非 Null、唯一或外部索引鍵條件約束

在使用TableAdapter作Query時發生

[解法]
原因為有些資料欄位Query出來後為null值
但是該欄位在dbDataSet的屬性AllowDBNull為False

因此把該欄位(或乾脆把全部欄位屬性AllowDBNull改為True

似乎不只這個問題會有這個警告訊息出現,其他況狀可看一下參考網址
參考網址

2015年1月15日 星期四

[C#] WinForm Report (.rdlc) with multiple datasources(Bean)

參考資料來源 How to create Microsoft Report (.rdlc) with multiple datasources in ASP.NET.

  1. 建立在專案中加入UserBean.cs 寫完後記得先對Project compiler

    class UserBean
        {
            private string name;

            public string Name
            {
                get { return name; }
                set { name = value; }
            }
            private int age;
            public int Age
            {
                get { return age; }
                set { age = value; }
            }

            private string sex;

            public string Sex
            {
                get { return sex; }
                set { sex = value; }
            }

            public UserBean()
            {

            }

            public UserBean(string name, int age, string sex)
            {
                this.name = name;
                this.age = age;
                this.sex = sex;
            }
    }
  2. 在WinForm裡放入一ReportViewer
  3. 在ReportViewer選擇設計新報表
  4. 資料來原選擇物件
  5.  勾選UserBean > 完成
  6. 在WinForm Loading寫入
    List<UserBean> userBeanList1 = new List<UserBean>();
    List<UserBean> userBeanList1 = new List<UserBean>();
    userBeanList1.Add(new UserBean("Bob", 30, "M"));
    userBeanList2.Add(new UserBean("Alice", 25 ,"F"));
    reportViewer1.LocalReport.DataSources.Clear();
    ReportDataSource rd1 = new ReportDataSource("user1", userBeanList1);
    ReportDataSource rd2 = new ReportDataSource("user2", userBeanList2);
    reportViewer1.LocalReport.DataSources.Add(rd1);
    reportViewer1.LocalReport.DataSources.Add(rd2);
    this.reportViewer1.RefreshReport();
  7. 在rdlc中修改(加入)資料集(DataSet)名稱
  8. 結果

2015年1月9日 星期五

[C#] dataGridView當掉問題

以下是靠著在學時學的C#功能寫winForm的結果
就是所謂的鳥蛋教學
但至少可以解決問題啦(抓頭

dataGridView當掉的圖如下

 多麼好笑的圖

我遇到的掉當原因為
我在winForm裡是使用Thread
當Thread抓取到某個值後需修改dataGridView (addRows)
但是控制dataGridView的其實是winForm的UI Thread

通常這樣寫會出現下列Exception

類型 'System.InvalidOperationException' 的未處理例外狀況發生於 System.Windows.Forms.dll

其他資訊: 跨執行緒作業無效: 存取控制項 'dataGridView1' 時所使用的執行緒與建立控制項的執行緒不同。


如果你說沒有發生 (σ ゚∀ ゚)σ 快來去看看你的Form Load是否多加了一行
Form.CheckForIllegalCrossThreadCalls = false;

雖然加上了會省了很多問題(忽略跨執行緒的問題)
但也讓我抓這個 dataGridView當掉問題抓了很久
因為一點Exception都沒有
就直接叉叉呈現

這時候我們只好踏實點寫了
把它委派(delegate)

先宣告類別變數
// 委派DataGridView使用
private delegate void GridViewAddRows(String str);

後面帶的參數請依需求更改類別 但是一次好像只能丟一個值
接下來寫方法,想對dataGridView addRows時呼叫
大概的意思好像是如果需要委派,就把它委派(this.Invoke(addRows, str))
若已委派,就執行你要它幹嘛就幹嘛(喂

private void InvokeGridViewAddRows(String str)
{
            if (this.InvokeRequired)
            {
                GridViewAddRows addRows = new GridViewAddRows((InvokeGridViewAddRows));
                this.Invoke(addRows, str);
            }
            else
            {
                    // 在這裡寫入原本取到str後要對dataGridView做的事
            }
}

總之還是請大家多多Google再寫(冒汗

以上