使用WPF将Datagrid的第一列绑定到列表中

本文关键字:一列 绑定 列表 WPF Datagrid 使用 | 更新日期: 2023-09-27 18:09:08

我有两列Path和Filename作为datagrid1,我想将Path列绑定到列表中<>这样我就可以通过单击一个按钮将所有文件复制到不同的位置。有人能帮我吗?正在查找c#wpf代码。

Path            FileName
C:'Temp'abc.txt abc.txt
C:'Temp'xyz.txt xyz.txt
C:'Temp'a.txt   a.txt

守则

XAML

<DataGrid AutoGenerateColumns="False" Height="193" HorizontalAlignment="Left"
          Margin="169,6,0,0" Name="dataGrid1" VerticalAlignment="Top" Width="200"              
          ItemsSource="{Binding}">
          <DataGrid.Columns>
              <DataGridTextColumn Header="Path" Binding="{Binding Path}" />
              <DataGridTextColumn Header="FileName" Binding="{Binding FileName}" />
          </DataGrid.Columns>
</DataGrid>

在后面

public class ReportFiles
    {
        public string Path { get; set; }
        public string FileName { get; set; }
    }

使用WPF将Datagrid的第一列绑定到列表中

我查看了您的代码,它看起来结构不太好,
而且它也不起作用,尤其是"buttonAttach_Click()"函数。

这里有不同的事情要提

  1. 将类ReportFiles重命名为ReportFile,因为它只描述"一个"文件,而不是一堆文件

  2. ReportFiles的属性命名不正确
    RealNameTargetName并不是很容易解释的,所以我将它们更改为PathFileName

  3. 您通过以下调用将条目作为匿名对象添加到DataGrid:

    dataGrid1.Items.Add(new { RealName = list.RealName, TargetName = list.TargetName});

    如果添加对象本身,它会更干净,以后更容易使用
    特别是因为您之前已经在行中创建了它
    所以我把它改成:

    ReportFile reportFile = new ReportFile();
    reportFile.Path = str;
    reportFile.FileName = System.IO.Path.GetFileName(str);
    dataGrid1.Items.Add(reportFile);

  4. 我不明白你在btnSave_Click函数中做了什么。但我认为,您希望将之前选择的现有文件复制到C:'Temp'目录,所以我也更改了它。
    正如您现在所看到的,您可以在DataGrid.Items上简单地进行foreach,并根据自己的喜好使用它们。


因此,它可以归结为一个非常简单的解决方案:

public class ReportFile
{
  public string Path { get; set; }
  public string FileName { get; set; }
}
private void buttonAttach_Click(object sender, RoutedEventArgs e)
{
  Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog();
  if (dlg.ShowDialog() == true)
  {
    foreach (string str in dlg.FileNames)
    {
      ReportFile reportFile = new ReportFile();
      reportFile.Path = str;
      reportFile.FileName = System.IO.Path.GetFileName(str);
      dataGrid1.Items.Add(reportFile);
    }
  }
}
private void btnSave_Click(object sender, RoutedEventArgs e)
{
  foreach (ReportFile reportFile in dataGrid1.Items)
  {
    string fileName = @"C:'Temp'" + reportFile.FileName;
    if (File.Exists(fileName))
      continue;
    else
    {
      try
      {
        File.Copy(reportFile.Path, fileName);
      }
      catch (Exception err)
      {
        MessageBox.Show(err.Message);
        return;
      }
    }
  }
}




@任何mods,请删除第一个Answer,因为它不再计算

我基本上要做的是从本地驱动器收集文件,并将它们全部复制到C:''ReportFiles。我创建了两个按钮。附加并保存。Attach将浏览并获取文件。在dataGrid1中,我使用旧的路径和文件名。当收集完所有文件时。点击保存按钮。这将从数据网格中获取Path列,并开始将文件从数据网格的Path列复制到C:''ReportFiles。循环将完成此工作。

问题是列表,我无法将数据网格列作为集合的列表。希望一切顺利。

数据网格代码:

<DataGrid AutoGenerateColumns="False" Height="193" HorizontalAlignment="Left" Margin="169,6,0,0" Name="dataGrid1" VerticalAlignment="Top" Width="200" ItemsSource="{Binding ReportFiles}">
                <DataGrid.Columns>
                    <DataGridTextColumn Header="Path" Binding="{Binding Path}" />
                    <DataGridTextColumn Header="FileName" Binding="{Binding FileName}" />
                </DataGrid.Columns>
            </DataGrid>

主窗口.cs:

public partial class EditReport : Window
{
        public List<ReportFiles> listabove = new List<ReportFiles>();
 public class ReportFiles
    {
        public string RealName { get; set; }
        public string TargetName { get; set; }
    }
    private void buttonAttach_Click(object sender, RoutedEventArgs e)
        {
        Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog();
              if (dlg.ShowDialog() == true)
        {
foreach (string str in dlg.FileNames)
                     {
                     ReportFiles list = new ReportFiles();
                     list.RealName = str;
                     list.TargetName = filename;
                     dataGrid1.Items.Add(new { RealName = list.RealName, TargetName = list.TargetName });
            string fileName = @"C:'Temp'" + filename + System.IO.Path.GetExtension(str).Trim(); ;
                    if (File.Exists(fileName))
                    continue;
                    else
                        {
                        try
                        {
                             File.Copy(str, fileName);
                        }
                        catch (Exception err)
                             {
                             MessageBox.Show(err.Message);
                             return;
                             }
                        }
            }
        }
}
private void btnSave_Click(object sender, RoutedEventArgs e)
       {
            ReportFiles rep = new ReportFiles();
            DataRowView paths = (System.Data.DataRowView)dataGrid1.Items[0];
            rep.RealName = Convert.ToString(paths.Row.ItemArray[0]);
       }
}