2016-12-16 89 views
1

Im使用Infragistics4.Win.UltraWinGrid.v16.1數據容器。比方說,我剛剛更新了DataSource,並且希望將該行(它在DataSource更新時顯示)激活,因爲它會滾動到該行並將其選中。目前,我有以下錯誤的實現:Infragistics UltraWinGrid選擇新添加的行

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

注意我添加的兩行代碼:

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

IsActiveScrollRegion條件通過,但該行仍沒有在網後選擇執行。

謝謝你的幫助!

+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

這很奇怪。在某處,某些東西可以防止選擇應用程序中的最後一行。簡化代碼。如果數據源綁定到IBinding源對象(如DataSet,DataTable,IBindingList等),則不必顯式刷新數據源。另一方面,您不需要顯式滾動到新添加的行,因爲當行被選中時,視圖將自動滾動爲你。刪除這些行,看看會發生什麼,並嘗試重現我的表單,以驗證它在簡化的情況下實際上是否有效。 –

+0

數據結構是'List',也許我應該嘗試將它改爲DataTable,正如你所建議的那樣。因此,現在新添加的行顯示的唯一方式是通過調用來顯式刷新'(RefreshRow.ReloadData)' – Rice

相關問題