2010-07-30 4 views
0

VS 2010, WPF 프로젝트.텍스트 상자를 데이터 격자에 넣는 방법?

모든 셀에 텍스트가있는 DataGrid가 있습니다 (데이터는 사용자 정의 객체의 배열입니다). 그러나 어떤 셀의 내용 (ctrl + c)도 복사 할 수 없습니다. 그래서 각 셀의 내용을 표시하기 위해 텍스트 상자를 사용하고 싶습니다. 실제 문제는 XAML에서이 작업을 수행 할 수 없다는 것입니다. 코드에서 전체 그리드가 수동으로 작성되므로 코드에서 동적으로 처리해야하므로 XAML은 그리드 만 알고 있습니다.

이 방법으로 열을 추가합니다. 열과 관련된 모든 것으로 헤더 템플릿을 지정할 수 있다는 것입니다. 그것에 대한 셀 템플릿을 작성하고 위젯을 텍스트 상자로 설정하는 방법은 무엇입니까?

  int i = 0; 

      foreach (var db_col in query.FieldNames) 
      { 
       var col = new DataGridTextColumn(); 
       col.IsReadOnly = false; 
       col.Header = db_col; 
       col.Binding = new Binding(String.Format("Visual[{0}]", i)); 
       grid.Columns.Add(col); 

       ++i; 
      } 

감사합니다.

해결됨

Marko 덕분에 마침내 그러한 해결책을 찾았습니다.

 foreach (var db_col in query.FieldNames) 
     { 
       var template = new DataTemplate(); 
       var elemFactory = new FrameworkElementFactory(typeof(TextBox)); 
       elemFactory.SetBinding(TextBox.TextProperty, new Binding(String.Format("Visual[{0}]", i))); 
       template.VisualTree = elemFactory; 

       var col = new DataGridTemplateColumn(); 
       col.CellTemplate = template; 
       col.IsReadOnly = true; 
       col.Header = db_col; 
       grid.Columns.Add(col); 

       ++i; 
     } 

답변

1

우선, DataGridTextColumn은 편집 모드에 있지 않을 때 TextBlock을 사용하여 데이터를 표시합니다. 아마도 그로부터 아무것도 복사 할 수없는 이유 일 것입니다. 편집 모드로 들어가면 TextBlock이 TextBox로 대체되고 정상적으로 복사/붙여 넣기가 가능해집니다.

게시 한 코드가 원하는 기능을 제공하지 않는다는 점을 감안할 때, 항상 TextBox를 표시한다고 가정 할 수 있습니다. 이 작업을 수행하려면 DataGridTemplateColumn을 사용해야합니다. 따라서 코드 뒤에는 새로운 DataGridTemplateColumn을 만들고, CellTemplate을 TextBox가 들어있는 새로운 DataTemplate으로 설정합니다. 당신은 여기에 텍스트 상자와 DataTemplate을을 만들기위한 몇 가지 샘플을 찾아야한다 : Can i create DataTemplate in code-behind?

또한 참고 당신은 당신이 (필요한 경우) 다른 데이터 그리드 컬럼에 내장되는 몇 가지 동작을 구현할 필요가 DataGridTemplateColumn를 생성 할 경우. 예를 들어, DataGrid가 IsReadOnly = true로 설정된 경우 TextBox가있는 DataGridTemplateColumn은 여전히 ​​편집 가능합니다. 따라서 TextBox.IsReadOnly 속성을 DataGrid.IsReadOnly 속성에 바인딩해야합니다.

+0

좋아요! 고맙습니다. 처음에는 셀의 템플릿 설정에 문제가있었습니다. 왜냐하면 열의 유형을 변경하는 것을 잊었 기 때문입니다. – greenoldman

관련 문제