gpt4 book ai didi

c# - 在 C# 中,是否可以强制 Clipboard.GetData 在每个 CSV 值周围输出引号?

转载 作者:行者123 更新时间:2023-11-30 17:47:52 25 4
gpt4 key购买 nike

在 C# 中,我使用以下代码将数据从 WPF DataGrid 复制到剪贴板,然后从剪贴板复制到 CSV:

var originalSelectionMode = dataGrid.SelectionMode;
dataGrid.SelectionMode = DataGridSelectionMode.Extended;
dataGrid.SelectAllCells();
dataGrid.ClipboardCopyMode = DataGridClipboardCopyMode.IncludeHeader;
ApplicationCommands.Copy.Execute(null, dataGrid);
dataGrid.UnselectAllCells();

// this is the line that's not working quite right:
var text = (string)Clipboard.GetData(DataFormats.CommaSeparatedValue);

Clipboard.Clear();
dataGrid.SelectionMode = originalSelectionMode;

File.WriteAllText(fullPathToFile, text);

此代码在大多数情况下都有效,但当您在其中一个单元格中包含多行文本时就会出现问题。假设您在这样的网格中有数据:

A     |B     |C
-------------------
A1 |B1 |C1a,C2b
-------------------
A2 |B2 |C2a
| |C2b
-------------------

如果您的单元格内容中有逗号或双引号字符,Clipboard.GetData 函数似乎只会在单元格内容周围插入双引号,但实际上并没有如果你在那里有一个换行符,它会自动出现,所以上面网格的输出看起来像这样:

A,B,C
A1,B1,"C1a,C1b"
A2,B2,C2a
C2b

请注意,它确实在单元格 C1 周围放置了引号,但没有在单元格 C2 周围放置引号。

有没有办法强制 Clipboard.GetData 始终在每个单元格周围加上引号?如果没有,我该如何解决?

最佳答案

最简单的方法是使用数据绑定(bind)并将字符串写入 csv。我创建了一个示例类,它可以绑定(bind)到 DataGrid 并允许创建/编辑新行(如果需要,您可以在此类上添加通知):

 public class Data
{
public Data()
{
}

public Data(string col1, string col2, string col3)
{
Col1 = col1;
Col2 = col2;
Col3 = col3;
}

public string Col1 { get; set; }
public string Col2 { get; set; }
public string Col3 { get; set; }
}

现在我覆盖数据网格的复制命令来控制自定义复制:

 this.DataGrid.CommandBindings.Add(new CommandBinding(ApplicationCommands.Copy,
new ExecutedRoutedEventHandler(CopyClicked)));

在 CopyClicked 中,我们使用 Data ViewModel 绑定(bind)类创建数据:

 private void CopyClicked(object sender, ExecutedRoutedEventArgs e)
{
var stringBuilder = new StringBuilder();
IList l = this.DataGrid.SelectedItems;
foreach (Data data in l)
{
stringBuilder.Append("\"" + data.Col1 +"\",");
stringBuilder.Append("\"" + data.Col2 + "\",");
stringBuilder.Append("\"" + data.Col3 + "\"");
stringBuilder.AppendLine();
}
//Write to a file or straight to clipboard etc
Debug.WriteLine(stringBuilder.ToString());
}

关于c# - 在 C# 中,是否可以强制 Clipboard.GetData 在每个 CSV 值周围输出引号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24123468/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com