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

时间:2013-04-15 10:58:41

标签: c# .net wpf xaml

我有两列Path和Filename作为datagrid1,我想将路径列绑定到列表<>这样我就可以通过单击一个按钮将所有文件复制到其他位置。有谁可以帮助我吗?寻找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; }
    }

2 个答案:

答案 0 :(得分:0)

我基本上做的是从本地驱动器收集文件并将它们全部复制到C:\ ReportFiles。我创建了两个按钮。附加并保存。 Attach将浏览并获取文件。在dataGrid1中,我正在使用旧路径和文件名。完成收集所有文件后。单击“保存”按钮。这将从datagrid获取Path列,并从datagrid Path列开始处理文件到C:\ ReportFiles。循环将完成这项工作。

问题是列表,我不能将datagrid列作为集合列表。希望这清楚。

DataGrid代码:

<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>

MainWindow.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]);

       }
}

答案 1 :(得分:0)

我查看了你的代码并且看起来结构不是很好,因为它不起作用"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进行预告,并按照自己喜欢的方式进行操作。


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

    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,请删除第一个答案,因为它不再计算