2012-04-18 21 views
10

enter image description here Sự cố tôi đang mắc phải có liên quan đến hộp kiểm trong DataGrid (WPF). Tôi đã đính kèm ảnh chụp màn hình để hiểu rõ hơn về sự cố.Tiêu đề cột dữ liệu thống kê nên kiểm tra/bỏ chọn trạng thái Hộp kiểm tùy thuộc vào việc tất cả các Hộp kiểm của cột DataGridView được chọn hay không được chọn

Sự cố: Hộp kiểm Cột DataHeader được chọn ngay cả khi một trong các trẻ em được bỏ chọn. Tôi hy vọng các giải pháp để sửa lỗi này để khi một trong những đứa trẻ được bỏ chọn một cách rõ ràng bởi người sử dụng, TẤT CẢ (Tiêu đề cột) nên được bỏ chọn ngầm.

Hãy giúp các bạn ... Cảm ơn bạn Plz kiểm tra liên kết. tôi muốn các giải pháp để làm việc như thế này. http://www.codeproject.com/Articles/42437/Toggling-the-States-of-all-CheckBoxes-Inside-a-Dat#

<dg:DataGrid.Columns> 
    <dg:DataGridCheckBoxColumn Binding="{Binding Check}" IsThreeState="True" Width="50"> 
     <dg:DataGridCheckBoxColumn.HeaderTemplate> 
      <DataTemplate x:Name="dtAllChkBx"> 
       <CheckBox Name="cbxAll" Content="{x:Static properties:Resources.lblAll}" 
          Checked="CheckBox_Checked" Unchecked="CheckBox_Unchecked" /> 
      </DataTemplate> 
     </dg:DataGridCheckBoxColumn.HeaderTemplate> 
    </dg:DataGridCheckBoxColumn> 

.

private void CheckBox_Unchecked(object sender, RoutedEventArgs e) 
{ 
    unchck_all_prd(); 
    dgEnggAcc.Items.Refresh(); 
} 

private void unchck_all_prd() 
{ 
    for (int i = 0; i < engg_list.Count; i++) 
    { 
     engg_list[i].Check = false; 
    } 
} 

private void chck_all_prd() 
{ 
    for (int i = 0; i < engg_list.Count; i++) 
    { 
     engg_list[i].Check = true; 
    } 
} 

public class EnggLst : ObservableCollection<EnggLst> 
{ 
    public bool Check { get; set; } 
} 
+0

xin vui lòng đặt mã XAML của bạn – ABH

+0

Theo tôi bạn không nên' t có tiêu đề được bỏ chọn nếu có một hàng không được kiểm soát. Trong tâm trí của tôi nếu tất cả được bỏ chọn sau đó có nghĩa là _all các hàng được bỏ chọn_. Bạn nên sử dụng hộp kiểm 3 trạng thái và sử dụng trạng thái "tôi không biết" thứ 3 cho một hỗn hợp. Windows hoạt động theo cách này (Hãy nghĩ đến việc chọn nhiều tệp trong trình thám hiểm, một số trong đó chỉ đọc và một số trong đó không có. Nếu bạn xem thuộc tính của các tệp này, hộp kiểm chỉ đọc sẽ ở trạng thái thứ ba) –

+0

iYadav

Trả lời

4

sử dụng mã này làm việc cho tôi.

//this event is for **Checked and UnChecked** of up check box (cbxall) 
private void UpCheckbox_Checked(object sender, RoutedEventArgs e) 
{ 
    //checkBox1 = cbxall (your up checkbox) 
    if (checkBox1.IsChecked == true) 
    { 
     dataGrid1.Items.OfType<YourClass>().ToList().ForEach(x => x.IsChecked = true); 
    } 
    else 
    { 
     dataGrid1.Items.OfType<YourClass>().ToList().ForEach(x => x.IsChecked = false); 
    } 
} 

//this event is for all other check box 
//**Checked and UnChecked** of all other check box is this event 
private void OtherCheckbox_Checked(object sender, RoutedEventArgs e) 
{ 
    //checkBox1 = cbxall (your up checkbox) 
    if (dataGrid1.Items.OfType<YourClass>().All(x => x.IsChecked == true)) 
    { 
     checkBox1.IsChecked = true; 
    } 
    else if (dataGrid1.Items.OfType<YourClass>().All(x => x.IsChecked == false)) 
    { 
     checkBox1.IsChecked = false; 
    } 
    else 
    { 
     checkBox1.IsChecked = null; 
    } 
} 

hy vọng điều này sẽ giúp bạn Chúc may mắn.

+0

Cảm ơn bạn! nó hoạt động hoàn hảo :) – iYadav

+0

Hi Tôi đang tìm kiếm chức năng tương tự. Trong giải pháp trên, bạn gọi checkBox1 (cbxall) trực tiếp nhưng chúng tôi không nhận được id hộp kiểm trong mã phía sau. Tôi bị kẹt giải pháp này trong bốn ngày qua – Surya

1

Trong XAML DataGrid của bạn thêm:

<DataGridTemplateColumn.Header> 
<CheckBox x:Name="ckbHeader" Click="ckbHeader_Click"></CheckBox> 
</DataGridTemplateColumn.Header> 

Trong mã add bạn:

var ckbox = sender as CheckBox; 
var All = Collection.View.SourceCollection as List<ObjectX>; 

if (ckbox.IsChecked == true) 
{ 
    foreach (var item in All)  
     item.Marked = true;  
} 
else 
{ 
    foreach (var item in All)  
     item.Marked = false;   
} 
Collection.View.Refresh(); 

LƯU Ý: Người gửi là CheckBox

+0

Việc kiểm tra sự bình đẳng với 'true' là thừa. Chỉ cần nói 'if (ckbox.IsChecked)' –

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