2016-12-16 5 views
1

Im Infragistics4.Win.UltraWinGrid.v16.1データコンテナを使用しています。たとえば、DataSourceを更新したばかりで、DataSourceが更新されたときにその行がアクティブになったときにその行をスクロールして選択するようにしたいとします。Infragistics UltraWinGridは、新しく追加された行を選択します。

row.Activate(); 
if(grdProjects.ActiveRowScrollRegion.IsActiveScrollRegion) 

IsActiveScrollRegion条件が通過するが、行がまだ後のグリッドで選択されていない:私は、コードの2行を追加し

private void SelectByID(int searchId) 
{ 
    ISelectionManager selectionManager = grdProjects; 

    foreach (UltraGridRow row in grdProjects.Rows) 
    { 
     if (Convert.ToInt32(row.Cells["StagingID"].Value) == searchId) 
     { 
      selectionManager.ActivateItem(row); 
      row.Activate(); 
      if (grdProjects.ActiveRowScrollRegion.IsActiveScrollRegion) 
       grdProjects.ActiveRowScrollRegion.ScrollRowIntoView(row); 
      break; 
     } 
    } 
} 

private void _createProjectDialog_FormClosed(object sender, FormClosedEventArgs e) 
{ 
    CreateProjectDialog send = (CreateProjectDialog)sender; 
    if (send.SetAsCurrent) 
    { 
     this.Close(); 
    } 
    else 
    { 
     //refresh grid and set current proj 
     _stagingProjects.Add(send.StagingProject); 
     grdProjects.Rows.Refresh(RefreshRow.ReloadData); 
     SelectedProject = ApplicationContext.Instance.Project.StagingProject; 
     SelectByID(SelectedProject.StagingID); 
    } 
} 

:現在、私は、次の障害のある実装を有します実行。

ありがとうございました!

+0

意図行は常にグリッドの底部で終わることに注意してください、非選択。 – Rice

答えて

2

場合は、あなたが特定の行を選択したいだけでrow.Selected = true;を使用した場合には、単にrow.Activated = true;を使用する特定の行をアクティブにしたいと思いますおそらくあなたはこれら二つの違いを知っていると私はすぐにコードのコメントでそれを説明しました。単純なフォームの例を次に示します。

public partial class Form1 : Form 
{ 
    private DataSet _dataSet = new DataSet(); 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     InitializeDataSet(_dataSet); 
    } 

    private void SelectByID(int searchId) 
    { 
     ISelectionManager selectionManager = this.ultraGrid1; 

     foreach (UltraGridRow row in this.ultraGrid1.Rows) 
     { 
      if (Convert.ToInt32(row.Cells["ID"].Value) == searchId) 
      { 
       if (ultraGrid1.ActiveRowScrollRegion.IsActiveScrollRegion) 
       { 
        ultraGrid1.ActiveRowScrollRegion.ScrollRowIntoView(row); 

        // Activating and selecting are two different things. 
        // Activating the row draws dotted border around it. 
        // Selecting the row highlights it with blue color by default. 
        row.Activated = true; 
        row.Selected = true; 
        break; 
       } 
      } 
     } 
    } 

    private void ultraButton1_Click(object sender, EventArgs e) 
    { 
     var dataSourceRows = _dataSet.Tables[0].Rows; 
     var dataRow = dataSourceRows.Add(new object[] { dataSourceRows.Count }); 

     SelectByID(dataSourceRows.Count - 1); 
    } 

    private void InitializeDataSet(DataSet dataSet) 
    { 
     var dataTable = dataSet.Tables.Add(); 

     dataTable.Columns.Add("ID", typeof(int)); 

     for (int index = 0; index <= 100; index++) 
     { 
      dataTable.Rows.Add(new object[] { index }); 
     } 

     this.ultraGrid1.DataSource = dataTable; 
    } 
} 

enter image description here

+0

応答Ivayloのためにありがとう、しかしこれは私の問題を解決しません。ロジックの効果は以前と同じです(グリッドの最初の行が選択されています)。 – Rice

+1

それは変です。どこかで、アプリケーションの最後の行を選択できないものがあります。コードを少し簡素化する。データソースがDataSet、DataTable、IBindingListなどのIBindingソースオブジェクトにバインドされている場合は、明示的にデータソースを更新する必要はありません。もう1つの方法は、新しく追加された行を明示的にスクロールする必要がないことです。を選択すると、自動的にビューがスクロールされます。これらの行を削除し、何が起こるかを見て、簡単なシナリオで実際に動作することを確認するためにフォームを再現してみてください。 –

+0

データ構造は 'List'です。私はおそらくあなたが提案したようにそれをDataTableに変更しようとするべきです。このように、現在新たに追加された行が表示される唯一の方法は、明示的にRefresh(RefreshRow.ReloadData)を呼び出すことです。 – Rice

関連する問題