【问题标题】:How to remove selected Column in DataGrid? (C#/WPF)如何删除 DataGrid 中的选定列? (C#/WPF)
【发布时间】:2019-10-26 05:07:09
【问题描述】:

如何在 DataGrid 中删除选定的列(及其行)?

复选框和Excel记录的选择:

CsvGrid.SelectAllCells();
foreach (var checkBox in CheckBoxes.Children.OfType<CheckBox>().Where(x => x.IsChecked == true))
{
    for(int i = 0; i < CsvGrid.SelectedCells.Count; i++)
    {
        if (checkBox.Tag != CsvGrid.Columns[i].Header) // How to remove this Column and its lines?
    }
}
ApplicationCommands.Copy.Execute(null, CsvGrid);
String result = (string) Clipboard.GetData(DataFormats.Text);
CsvGrid.UnselectAllCells();

SaveFileDialog saveFileDialog = new SaveFileDialog();
saveFileDialog.FileName = "Document";
saveFileDialog.DefaultExt = ".xls";
saveFileDialog.Filter = "Excel|*.xls|Excel 2010|*.xlsx|CSV files (*.csv)|*.CSV";
saveFileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
if (saveFileDialog.ShowDialog() == true)
{
    File.WriteAllText(saveFileDialog.FileName, result.Replace(',', ' '));
    MessageBox.Show("File created!");
}

读取 CSV 表。使用 LumenWorks 写入 DataTable

using LumenWorks.Framework.IO.Csv;

DataTable csvTable = new DataTable();
using (CsvReader csvReader = new CsvReader(new StreamReader(FilePath.Text), true))
{
    csvTable.Load(csvReader);

    for (int i = 0; i < csvTable.Columns.Count; i++)
    {
        csvTable.Columns[i].ColumnName = csvTable.Columns[i].ColumnName.Replace("_", " ");
    }

    CsvGrid.ItemsSource = csvTable.DefaultView;
}

【问题讨论】:

    标签: c# wpf linq


    【解决方案1】:

    您可以将可见性设置为折叠:

    CsvGrid.Columns[i].Visibility = Visibility.Collapsed;
    

    更改绑定源:

    WPF:

    <Grid>
        <DataGrid x:Name="TheGrid" ItemsSource="{Binding dataTable}">
            <DataGrid.Columns>
                <DataGridTemplateColumn Header="Delete">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <CheckBox Tag="2" Checked="Remove_me"></CheckBox>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
    

    后面的代码:

       DataTable dt1 = new DataTable();
    
       public MainWindow()
        {
            InitializeComponent();
            dt1 = new DataTable();
    
            dt1.Columns.Add("1");
    
            dt1.Columns.Add("2");
    
            dt1.Columns.Add("3");
    
            DataRow dr = dt1.NewRow();
    
            TheGrid.ItemsSource = dt1.DefaultView;
        }
        private void Remove_me(object sender, RoutedEventArgs e)
        {
    
            CheckBox checkbox = (CheckBox)sender;
            dt1.Columns.Remove(checkbox.Tag.ToString())
    
            TheGrid.ItemsSource = null;
            TheGrid.ItemsSource = dt1.DefaultView;
    
        }
    

    【讨论】:

    • 很遗憾没有。然后我将这些数据写入 .xml
    • 我明白了。在这种情况下,您别无选择,只能从绑定源中删除不需要的列。
    • 您能添加用于填充数据网格的代码吗?
    • 更新问题!
    • 添加了从绑定源中删除列的示例。在这种情况下是一个数据表。
    【解决方案2】:
    CsvGrid.Items.Refresh();
    CsvGrid.UpdateLayout();
    
    for (int i = 0; i < CsvGrid.Columns.Count; i++)
    {
        foreach (var checkBox in CheckBoxes.Children.OfType<CheckBox>().Where(x => x.IsChecked == true))
        {
            if (CsvGrid.Columns[i].Header.ToString() == checkBox.Tag.ToString()) CsvGrid.Columns.RemoveAt(i);
         }
    }
    
    CsvGrid.SelectAllCells();
    CsvGrid.ClipboardCopyMode = DataGridClipboardCopyMode.IncludeHeader;
    ApplicationCommands.Copy.Execute(null, CsvGrid);
    String result = (string) Clipboard.GetData(DataFormats.Text);
    CsvGrid.UnselectAllCells();
    
    SaveFileDialog saveFileDialog = new SaveFileDialog();
    saveFileDialog.FileName = "Document";
    saveFileDialog.DefaultExt = ".xls";
    saveFileDialog.Filter = "Excel|*.xls|Excel 2010|*.xlsx|CSV files (*.csv)|*.CSV";
    saveFileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
    if (saveFileDialog.ShowDialog() == true)
    {
        File.WriteAllText(saveFileDialog.FileName, result.Replace(',', ' '));
        MessageBox.Show("File created!");
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-17
      • 2023-03-24
      • 2018-07-09
      • 2020-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多