2010-01-25 24 views
6

Tôi muốn có thể chọn một ô cụ thể trong Silverlight 3.0 DataGrid và đặt nó vào chế độ chỉnh sửa. Tôi có thể sử dụng VisualTreeManager để định vị ô. Làm cách nào để chuyển sang chế độ chỉnh sửa?Làm thế nào tôi có thể đặt một Silverlight 3 DataGridCell vào chế độ chỉnh sửa trong mã?

Mỗi DataGridCell trông như thế này trong VisualTreeManager:

  System.Windows.Controls.DataGridCell 
      System.Windows.Controls.Grid 
       System.Windows.Shapes.Rectangle 
       System.Windows.Controls.ContentPresenter 
       System.Windows.Controls.TextBlock 
       System.Windows.Shapes.Rectangle 
       System.Windows.Shapes.Rectangle 

với TextBlock có chứa dòng chữ Tôi muốn chỉnh sửa.

Cập nhật

Tiếp theo đề nghị @AnthonyWJones', đây là cách tôi đã cố gắng để làm điều này bằng BeginEdit().

Tôi muốn giữ nó đơn giản vì vậy tôi nghĩ rằng tôi muốn chọn một cột ở hàng đầu tiên. Ngay cả điều đó đã chứng minh ngoài kiến ​​thức SL của tôi! Cuối cùng, tôi nhận được hàng đầu tiên bằng cách tạo ra một lĩnh vực được gọi firstRow để giữ nó:

private DataGridRow firstRow; 

thêm một handler LoadingRow để DataGrid:

LoadingRow="computersDataGrid_LoadingRow" 

private void computersDataGrid_LoadingRow(object sender, DataGridRowEventArgs e) 
{ 
    if (this.firstRow == null) 
     this.firstRow = e.Row; 
} 

và sau đó thêm nút vào bảng điều khiển để kích hoạt chỉnh sửa:

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    this.dataGrid.SelectedItem = this.firstRow; 
    this.dataGrid.CurrentColumn = this.dataGrid.Columns[4]; 
    this.dataGrid.BeginEdit(); 
} 

Tôi nhấp vào nút và chọn ô chính xác nhưng không được chỉnh sửa trên ô. Phải mất một nhấp chuột thủ công để đạt được điều đó.

Trả lời

2

Tôi không chắc chắn lý do tại sao bạn cần phải tìm DataGridCell bằng cách sử dụng VisualTreeManager cũng như tôi không biết hiện tại bạn sẽ bắt đầu chỉnh sửa đúng cách như thế nào. Bạn có thể nhận được ngay với chỉ cần thiết lập trạng thái trực quan của tế bào để chỉnh sửa.

VisualStateManager.GoToState(myDataGridCell, "Editing", true); 

Tôi không chắc chắn cách hoạt động của lưới khi bạn thực hiện điều gì đó như trên. Bạn có thể tìm thấy những thứ goe một chút pearshaped nếu bạn cần DataGrid để giúp bạn hoàn nguyên các thay đổi cho một hàng.

Cách tiếp cận "chuẩn" sẽ được thiết lập DataGridSelectedItem tài sản cho mục biểu diễn bởi hàng, thiết lập CurrrentColum tài sản cho đối tượng DataGridColumn đại diện đến cột trong đó các tế bào được tìm thấy. Sau đó, gọi phương thức BeginEdit.

+0

Tôi đã dẫn xuống con đường này bởi người khác. Tôi sẽ đi với những gì bạn đã đề xuất và cho bạn biết. Cảm ơn. – ssg31415926

+0

Tôi đã thử cả hai đề xuất của bạn mà không thành công. Đầu tiên, cách tiếp cận "chuẩn". Sử dụng SelectedItem và CurrentColumn không dẫn đến ô được tô đậm nhưng việc thêm BeginEdit() không có hiệu lực. Ô không lấy tiêu điểm và không chuyển sang chế độ chỉnh sửa. Sử dụng VisualStateManager cũng không hoạt động. – ssg31415926

+0

@ ssg31415926 Tôi nghi ngờ rằng cách tiếp cận đầu tiên sẽ không hoạt động, tôi ngạc nhiên khi thứ hai không, bạn có thể chỉnh sửa câu hỏi của mình để bao gồm một đoạn mã ngắn có liên quan mô tả cách bạn đã thử không? – AnthonyWJones

0

Tôi không thể hiểu được vấn đề của bạn đúng, nhưng tôi đã có một vấn đề tương tự

Tôi muốn thực hiện chỉ vài trong số các tế bào lưới có thể chỉnh sửa và phần còn lại thì không. Thay vì tạo ra một logic và gán ReadOnly là true/false, tôi đã làm điều đơn giản.

  • Đánh dấu tế bào toàn bộ lưới điện của đó vẫn được phép, IsReadOnly như sai
  • Đặt trường hợp PreparingCellForEdit và gửi một callback
  • Khi bạn nhấp đúp chuột vào một ô, nó được trong chế độ chỉnh sửa
  • Kiểm tra xem ô này bạn muốn chỉnh sửa
  • Nếu được phép chỉnh sửa, hãy chuyển đến
  • Nếu ô đó là ReadOnly, sau đó gọi CancelEdit

Mẫu mã đi như thế

namespace foo 
{ 
    public class foobar 
    { 
     public foobar() 
     { 
      sampleGrid = new DataGrid(); 
      sampleGrid.IsReadOnly = false; 
      sampleGrid.PreparingCellForEdit += new EventHandler<DataGridPreparingCellForEditEventArgs>(sampleGrid_PreparingCellForEdit); 
     } 

     void sampleGrid_PreparingCellForEdit(object sender, DataGridsampleGrid_PreparingCellForEditEventArgs e) 
     { 
      if (sampleGrid.SelectedItem != null) 
      { 
       bool isWritableField = CheckIfWritable() 

       if (isWritableField == false) 
       { 
        sampleGrid.CancelEdit(); 
       } 

       // continue with your logic 
      } 
     } 

     private DataGrid sampleGrid; 
    } 
} 
+0

Bất kỳ ý tưởng nào tại sao CancelEdit có thể không hoạt động? – neurotix

+0

@neurotix Nó không hoạt động? Có thật không? Nó cho tôi. Silverlight 3. Tôi không nghĩ rằng điều này nên thay đổi cho SL4 –

+0

Nó không cho bất kỳ hiệu ứng nào cho tôi: (Tôi cũng đã cố gắng đạt được điều tương tự như bạn đã làm ở đây bằng cách thay đổi IsReadOnly Dinamically nhưng điều đó cũng ngẫu nhiên thất bại. quan tâm để kiểm tra: http://stackoverflow.com/questions/9311158/datagrid-column-isreadonly-property-not-working-in-silverlight-4 – neurotix

Các vấn đề liên quan