簡體   English   中英

使用Silverlight / c#wpf遍歷/循環Datagrid行以獲取復選框列的值:NullReferenceException錯誤

[英]Iterate/Loop through Datagrid rows to get the value of checkbox column using Silverlight/ c# wpf: NullReferenceException error

我在Silverlight xaml中有一個DataGrid,其中包含名為Active(復選框),名稱(Textcolumn),ID(Textcolumn)的三列和datagrid外部的Save按鈕。 當我嘗試循環/遍歷datagrid行以使用GetCellContent獲取復選框的值時,出現以下錯誤。 GetCellContent對於前20行工作正常,但此后給出NullReferenceException錯誤。 請幫忙。

System.NullReferenceException: Object reference not set to an instance of an object.

XAML

<StackPanel Orientation="Horizontal">
                    <Button Content ="Save" Click="SavePopUp_Click"/>
                    <TextBlock x:Name="GridHeader"  Style="{StaticResource GridHeaderStyle}" Margin="0,0,0,0" Width="445" Foreground="White" HorizontalAlignment="Right" TextAlignment="Center" Visibility="Collapsed"/>
</StackPanel>

<sdk:DataGrid  x:Name="dgloss">
    <sdk:DataGrid.RowDetailsTemplate>
                <DataTemplate>
                      <Border>
                           <Border Margin="2" Padding="2" BorderBrush="#AAAAAA" BorderThickness="2" CornerRadius="4">
                       </Border>
                     </Border>
                </DataTemplate>
        </sdk:DataGrid.RowDetailsTemplate>

        <sdk:DataGrid.Columns>

         <!--<sdk:DataGridCheckBoxColumn  IsReadOnly="False" Header="Active" Binding="{Binding Active, Mode=TwoWay}" CanUserResize="False" />-->
                        <sdk:DataGridTemplateColumn Header ="Active">
                            <sdk:DataGridTemplateColumn.CellTemplate>
                                <DataTemplate>
                                    <CheckBox x:Name="chkcode" Tag="{Binding Active}" Checked="HandleCheck" Unchecked="HandleUnchecked" IsThreeState="False" HorizontalAlignment ="Center" VerticalAlignment="Center" IsChecked="{Binding Active, Mode=TwoWay}" />
                                </DataTemplate>
                            </sdk:DataGridTemplateColumn.CellTemplate>
                            </sdk:DataGridTemplateColumn>

                            <sdk:DataGridTextColumn IsReadOnly="True" SortMemberPath="Name" Header="Name" Binding="{Binding Name, Mode=TwoWay}" Foreground="White"/>
                        <sdk:DataGridTextColumn x:Name="ID" IsReadOnly="True" SortMemberPath="ID" Header="ID" Binding="{Binding ID, Mode=TwoWay}" Foreground="White" Visibility="Visible"/>
         </sdk:DataGrid.Columns>

</sdk:DataGrid>

保存按鈕點擊事件

    private void SavePopUp_Click(object sender, RoutedEventArgs e)
            {
               IEnumerable list = dgloss.ItemsSource as IEnumerable;
               List<string> lstFile = new List<string>();

               foreach (var row in list)
               {  
                   bool IsChecked = (bool)((CheckBox)dgloss.Columns[0].GetCellContent(row)).IsChecked;

                   if (IsChecked)
                   {
                      string id = ((TextBlock)grdLossCodelist.Columns[2].GetCellContent(row)).Text;
                       lstFile.Add(id);

}
}    
}

我遇到了同樣的問題,並確定非文本單元格(復選框,按鈕等)僅在呈現時才會返回其值,否則將返回null。 此外,實際上僅呈現控件上顯示的DataGrid行。 因此,在您的情況下,我敢打賭,您的DataGrid的大小應使其一次顯示20行,因此第21行返回null。

我最后要做的是遍歷ItemSource而不是DataGrid本身。 最終,無論如何這都是一個更好的實現,以免通過將數據訪問與UI混合而違反MVVM。

但是,如果您確實希望/需要直接使用DataGrid進行操作,則可以強制該單元格在代碼中呈現:

            foreach (var column in dataGrid.Columns)
            {
                DataGridTemplateColumn dgtColumn = null;
                DataGridBoundColumn dgbColumn = null;

                dgbColumn = column as DataGridBoundColumn;

                if (dgbColumn == null)
                {
                    dgtColumn = column as DataGridTemplateColumn;
                    CheckBox checkbox = (CheckBox)dgtColumn.CellTemplate.LoadContent();
                }
             }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM