wpf2009.02.06 14:47
datagrid를 사용하다보면 datagrid로드시 datagrid 행으로 focus를 자동으로 가게하고 싶을때가 있다

예를들면 datagrid를 선택하고 있다가 머 다른페이지(수정,추가) 페이지에서 datagrid정보를 수정하고 나서 다시 돌아오면

datagrid가 다시 Load되어서 스크롤이 맨위를 가르켜는 경우 다시 스크롤을 그지점까지 해주어야한다.

그래서 나온 해결법은 datagrid index번호를 알고 그 index번호까지 자동으로 가게 하는것이다.

index번호는     int intSelectIndex = CameraDataGrid.SelectedIndex; 이런식으로 얻어오면 된다.

자 해결해보자

쉽다

    int index = 1;
            dataGrid1.SelectedItem = dataGrid1.Items[index];
            dataGrid1.ScrollIntoView(dataGrid1.Items[index]);

이렇게만 하면 해결된다 하지만 이소스를 이용하기 위해서는 data를 입력하고 바로

   public Window1()
        {
            InitializeComponent();
            db = new DataClasses1DataContext();            
    dataGrid1.DataContext = db.Users;
     int index = 1;
            dataGrid1.SelectedItem = dataGrid1.Items[index];
            dataGrid1.ScrollIntoView(dataGrid1.Items[index]);
         } 

이런식으로 넣으면 동작이 되지 않고 에러가 난다....

    this.Loaded += new RoutedEventHandler(Window1_Loaded);

load 이벤트 핸들러를 주고

 void Window1_Loaded(object sender, RoutedEventArgs e)
        {
            int index = 1;
            dataGrid1.SelectedItem = dataGrid1.Items[index];
            dataGrid1.ScrollIntoView(dataGrid1.Items[index]);
        }
이렇게 하였더니 로딩이 끝난후 자동으로 focus 위치를 바꾸어 주었다.

이걸 조사하면서 정말 많은 방법이 있다는것을 알게되었다.

참조한사이트


그외 참조한사이트


silverlight datagrid msdn (wpf랑 비슷하다)




2009-5-6일 추가
focus만 기억하기 위해서 이런방법을 썼다 현재 매니저쪽

 public void RefreshDataGrid() 
{
 int SelectIndex = CameraDataGrid.SelectedIndex;
 CameraDataGrid.DataContext = DataCameraMgr.GetTableData();
 if (SelectIndex > -1)
 {
 CameraDataGrid.SelectedItem = CameraDataGrid.Items[SelectIndex];
 }
 }

2009-5-20일 추가
데이터가 하나만 있을때 에러나는거 수정
public void RefreshDataGrid()
        {
            if (dataEquipmentManager == null)
                return;

            int SelectIndex = machinesDataGrid.SelectedIndex;
            machinesDataGrid.DataContext = dataEquipmentManager.GetTableData();            
            if (SelectIndex > -1)
            {
                if (machinesDataGrid.Items.Count != 0)
                {
                    if (machinesDataGrid.Items.Count <= SelectIndex)
                    {
                        SelectIndex--;
                    }
                    machinesDataGrid.SelectedItem = machinesDataGrid.Items[SelectIndex];
                }       
            }
        }

Posted by 동동(이재동)