2016-06-14 12 views
0

私は、セル編集イベントでアクティブなデータグリッドの名前を取得しようとしています。セル編集イベントでアクティブなDataGridの名前を取得しますか?

まず、これは良い習慣であるかどうかわかりませんが、データグリッドのセルが編集されたときに実行されるイベントがあります。私は、ユーザーがテーブルに行を追加したかどうかをテストしようとしています。どの表が編集中であるかを知る方法が必要なので、if節を入れて正しいコードにしてエラーを投げないようにします。現時点では

private void DataGrid_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e) 
     { 

      Staff_Time_TBL selectedRow = e.Row.Item as Staff_Time_TBL; 
      long id = selectedRow.ID; 

      if (id == -1) 
      { 
       // give a GUID and then insert it into the database when saved 
       selectedRow.ID = DateTime.UtcNow.Ticks; 
       sql.Staff_Time_TBLs.InsertOnSubmit(selectedRow); 
      } 

      try 
      { 
       sql.SubmitChanges(); 
       LastSavedTextBlock.Text = "Last saved: " + DateTime.Now.ToLongTimeString(); 
      } 
      catch(Exception ex) 
      { 
       Alerts.Error("Couldn't save changed to the database", "Database Error", ex); 
      } 
     } 

、以下のコードでは、この表にアクセスされていない場合、明らかにそれは、データグリッドの名前を取得するに

Staff_Time_TBL selectedRow = e.Row.Item as Staff_Time_TBL; 
       long id = selectedRow.ID; 

私の試み、エラーがスローされ、これはちょうどDataGrid

var tblName = sender.GetType().Name; 
を返します。

これは変数tblName2に対してnullを返し、そのために最後の行で例外をスローします。

string dataGridName = "";    
      DataObject tblName2 = sender as DataObject; 
      dataGridName = tblName2.ToString(); 

が存在するかどうかをチェックしますが、私はsender DataGridの名前を取得する方法の何かを見つけることができませんすべてのテーブル名とThis threadを取得this threadがあります。

明らかに、これが良い習慣でない場合、私は知りたいと思います。ありがとう。

答えて

1

使用VisualTreeHelperクラス:

private void Dgrid_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e) 
     { 
      FrameworkElement source = e.EditingElement; 

      while (!(source is DataGrid)) 
       source = VisualTreeHelper.GetParent(source) as FrameworkElement; 

      MessageBox.Show(((DataGrid)source).Name); 
     } 
+0

これはデータグリッドでない場合はエラーになりますか?ありがとう – KyloRen

+0

それはエラーがスローされないように見えます。ありがとう – KyloRen

1

希望するデータグリッドの名前であれば、これは機能するはずです。

DataGrid dg = (DataGrid)sender; // Will throw an exception if not a DataGrid 
string name = dg.Name; 

DataObjectを使用する理由がわかりません。

+0

DataGridがインテリセンスではありませんでした。それは私が必要と思ったものだが、そこには存在していなかった。私は学ぶべきことがたくさんある。 – KyloRen

+0

これを行うことができる例外を回避するために、 'DataGrid dg = senderをDataGridとして; if(dg!= null) { string dgName = dg.Name; } ' – KyloRen

+0

例外は例外を発生させるかどうかによって異なります。時々あなたがする、時にはしない。 –

関連する問題