2017-05-25 53 views
-5

我使用下面的代碼兩個相關的組合框:轉換在C#

namespace WindowsFormsApplication1 
{ 
public partial class Frm_Evr_Scoring : Form 
{ 

    public Frm_Evr_Scoring() 
    { 
     InitializeComponent(); 
     //************* ****************** 
     CurrentUser.CUser = "4"; 
     CurrentUser.CexeP = "9"; 
     //************* ****************** 
     refreshDept(); 

    } 
    public void refreshDept() 
    { 
     _360_OLDDataContext db = new _360_OLDDataContext(); 
     var Dept = from ep in db.ExecutivePosts 
        join ea in db.ExePostAllocates on ep.ID equals 
        ea.ExePostID 
        join u in db.Units on ep.UnitID equals u.ID 
        join dept in db.Departments on u.DeptID equals dept.ID 
        where ea.PrsID == Convert.ToInt32(CurrentUser.CUser) 
        select new { dept.ID, dept.Title }; 
     DataTable DT = new DataTable(); 
     DT.Columns.Add(
      new DataColumn() 
      { 
       DataType = Type.GetType("System.String"), 
       ColumnName = "DeptID" 
      } 
      ); 
     DT.Columns.Add(
      new DataColumn() 
      { 
       DataType = Type.GetType("System.String"), 
       ColumnName = "DeptTitle" 
      } 
      ); 
     foreach (var item in Dept) 
     { 
      var row = DT.NewRow(); 
      row["DeptID"] = item.ID; 
      row["DeptTitle"] = item.Title; 
      DT.Rows.Add(row); 
     } 
     DataRow DR; 
     DR = DT.NewRow(); 
     DR.ItemArray = new object[] { 0, "... ... ... ... ... ..." }; 
     DT.Rows.InsertAt(DR, 0); 
     Cmb_evr_Dept.DataSource = DT; 
     Cmb_evr_Dept.ValueMember = "DeptID"; 
     Cmb_evr_Dept.DisplayMember = "DeptTitle"; 
    } 
    private void Cmb_evr_Dept_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     if (Cmb_evr_Dept.SelectedValue.ToString() != null) 
     { 
      int D =Convert.ToInt32(Cmb_evr_Dept.SelectedValue); 
      refreshUnit(D); 
     } 
    } 
    public void refreshUnit(int DeptID) 
    { 
     _360_OLDDataContext db = new _360_OLDDataContext(); 
     var Unit = from ea in db.ExePostAllocates 
        join ep in db.ExecutivePosts on ea.ExePostID equals ep.ID 
        join u in db.Units on ep.UnitID equals u.ID 
        join d in db.Departments on u.DeptID equals d.ID 
        where d.ID == DeptID && ea.PrsID == Convert.ToInt32(CurrentUser.CUser) 
        select u; 

     DataTable DT = new DataTable(); 
     DT.Columns.Add(
      new DataColumn() 
      { 
       DataType = Type.GetType("System.String"), 
       ColumnName = "UnitID", 
      } 
     ); 
     DT.Columns.Add(
      new DataColumn() 
      { 
       DataType = Type.GetType("System.String"), 
       ColumnName = "UnitTitle", 
      } 
     ); 
     foreach (var item in Unit) 
     { 
      var row = DT.NewRow(); 
      row["UnitID"] = item.ID; 
      row["UnitTitle"] = item.Title; 
      DT.Rows.Add(row); 
     } 
     DataRow DR; 
     DR = DT.NewRow(); 
     DR.ItemArray = new object[] {0, "... ... ... ... ... ..." }; 
     DT.Rows.InsertAt(DR, 0); 
     Cmb_evr_Unit.DataSource = DT; 
     Cmb_evr_Unit.ValueMember = "UnitID"; 
     Cmb_evr_Unit.DisplayMember = "UnitTitle"; 
    } 

的問題是在這裏:

private void Cmb_evr_Dept_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    if (Cmb_evr_Dept.SelectedValue.ToString() != null) 
    { 
     int D =Convert.ToInt32(Cmb_evr_Dept.SelectedValue); 
     refreshUnit(D); 
    } 
} 

時,它會轉換成 「Cmb_evr_Dept.SelectedValue」 爲 「int」 我收到此錯誤:

An exception of type 'System.InvalidCastException' occurred in mscorlib.dll but was not handled in user code, with these datails: {"Unable to cast object of type 'System.Data.DataRowView' to type 'System.IConvertible'."}

有什麼奇怪的,我是,當我使用這條線:

int D =Convert.ToInt32(Cmb_evr_Dept.SelectedValue); 

在另一行像一個按鈕單擊事件顯示在文本框中顯示沒有問題。 有人可以幫我解決這個問題嗎?我真的很困惑! 謝謝。

另外一個問題,是什麼LINQ查詢(VAR部門)之間的refreshDept的開始()方法和以下區別:

_360_OLDDataContext db = new _360_OLDDataContext(); 
     ExecutivePost ep1 = db.ExecutivePosts.SingleOrDefault(x => x.ID == 
Convert.ToInt32(CurrentUser.CexeP)); 
     Unit UUU = db.Units.SingleOrDefault(x => x.ID == ep1.UnitID); 
     Department DDD = db.Departments.SingleOrDefault(x => x.ID == 
UUU.DeptID); 
     var Dept1 = from d in db.Departments where d.ID == DDD.ID select new 
{ d.ID, d.Title }; 

它不會對我的工作!

如果可以糾正,哪個更有效?包含許多連接的LINQ查詢或最後一個?

+4

使用調試器找出發生異常時的Cmb_evr_Dept.SelectedValue。 – msitt

+0

https://stackoverflow.com/search?q=InvalidCastException –

+0

'Cmb_evr_Dept.SelectedValue.ToString()!= null'爲貨物而存在,待在竹飛機上。 – Will

回答

1

你的問題是,你是第一次設置DataSource之後,你設置ValueMemberDisplayMember。發生了什麼事情是,在你設置他DataSource的那一刻,SelectedIndexChanged事件發生並且由於未設置ValueMember,因此SelectedValueDataRowView。只需更改順序,它應該可以工作:

Cmb_evr_Dept.ValueMember = "DeptID"; 
Cmb_evr_Dept.DisplayMember = "DeptTitle"; 
Cmb_evr_Dept.DataSource = DT; 

Cmb_evr_Unit.ValueMember = "UnitID"; 
Cmb_evr_Unit.DisplayMember = "UnitTitle"; 
Cmb_evr_Unit.DataSource = DT; 
+1

@EdPlunkett感謝您的編輯。我的大腦似乎遭受了短路:) – Pikoh

+0

非常感謝你親愛的。 – Meisam

+0

你能否回答我的「另一個問題」? – Meisam