2017-05-25 9 views
-5

Ich habe zwei ähnliche Comboboxen folgenden Code:Konvertierung in 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"; 
    } 

Das Problem ist hier:

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); 
    } 
} 

, wenn es konvertieren "Cmb_evr_Dept.SelectedValue" wird zu "int" I erhalten diese Fehlermeldung:

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'."}

Was für mich seltsam ist, dass wenn ich diese Zeile:

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

in anderen Zeilen wie hinter einem Button Click Event in einer TextBox angezeigt wird, zeigt es kein Problem. Würde mir bitte jemand damit helfen? Ich bin wirklich verwirrt! Danke.

Eine andere Frage, was ist der Unterschied zwischen der LINQ-Abfrage (var Dept) am Anfang des refreshDept() -Methode und die folgenden:

_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 }; 

Es ist für mich nicht funktioniert!

Und wenn es korrigiert werden kann, welche von ihnen sind effizienter? die LINQ-Abfrage enthält viele Verknüpfungen oder die letzte?

+4

Verwenden Sie den Debugger, um herauszufinden, was 'Cmb_evr_Dept.SelectedValue' ist, wenn die Ausnahme auftritt. – msitt

+0

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

+0

'Cmb_evr_Dept.SelectedValue.ToString()! = Null' kommen für die Ladung, bleiben Sie für das Bambusflugzeug. – Will

Antwort

1

Ihr Problem ist, dass Sie zuerst die DataSource einstellen und danach setzen Sie die ValueMember und die DisplayMember. Was passiert, ist, dass in dem Moment, in dem Sie ihn DataSource setzen, das SelectedIndexChanged Ereignis ausgelöst wird und ValueMember nicht festgelegt ist SelectedValue ist ein DataRowView. Ändern Sie einfach die Reihenfolge und es sollte funktionieren:

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 danke für die Bearbeitung. Mein Gehirn erlitt einen Kurzschluß, wie es scheint :) – Pikoh

+0

Vielen Dank, meine Lieben. – Meisam

+0

Würden Sie bitte meine "andere Frage" beantworten? – Meisam