簡體   English   中英

列名稱中的C#DataTable DataGrid特殊字符“ /”(斜杠)

[英]C# DataTable DataGrid special character “/” (slash) in column names

我想使用DataGrid在C#中顯示字符串表。 列名是動態生成的(即在編譯時未知)。

這是一個例子:

此處,數字已轉換為字符串。

我正在使用DataTable作為包含整個表(行和列標題)的DataGrid的源。 但是,我有一個問題,即“氣候變化”列中的值未顯示在DataGrid中。 相反,我在控制台上收到以下錯誤消息

"BindingExpression path error: 'climate  w' property not found on 'object' 
''DataRowView' (HashCode=22429696)'. BindingExpression:Path=climate  
w/change; DataItem='DataRowView' (HashCode=22429696); target element is 
'TextBlock' (Name=''); target property is 'Text' (type 'String')"

我知道這是由於列名中的斜杠(“ /”)被解釋為綁定表達式。

我的問題是

  1. 有沒有一種方法可以關閉該行為,即將列名解釋為綁定表達式? 由於我為DataTable提供了行和列的所有值和標頭,因此無需根據列名計算任何數據值。 盡管不存在稱為“人類毒性”的屬性,但“人類毒性”一欄也沒有問題。
  2. 如果我不能使用DataTable作為DataGrid的源來實現上述目標,那么將使用哪種正確的數據結構?

這是生成DataTable的代碼。

    public DataTable PaValues { get; set; }

    private void CreateDataSet()
    {
        var dt = new DataTable("Perturbation Analysis");
        List<String> ics = _perturbationAnalysis.ImpactCatagories();
        dt.Columns.Add("Parameters");

        foreach (var ic in ics)
        {
            dt.Columns.Add(Sanatize(ic));
        }
        foreach (var parameter in _perturbationAnalysis.ParameterNames())
        {
            var dr = dt.NewRow();
            dr[0] = parameter;
            for (int i = 0; i < ics.Count; i++)
            {
                dr[i+1] = _perturbationAnalysis[parameter, ics[i]].ToString();
            }
            dt.Rows.Add(dr);
        }
        PaValues = dt;
    }

    private string Sanatize(string ic)
    {
        //return ic.Replace("/", "[/]").Replace("[", "").Replace("]", "").Replace(".", " ");
        //return "[" + ic + "]";
        return ic;

    }

這是XAML文件的摘錄

            <DataGrid
                x:Name="PAGrid"
                CanUserAddRows="False" 
                CanUserDeleteRows="False"
                ClipboardCopyMode="IncludeHeader"
                FrozenColumnCount="1"
                ItemsSource="{Binding Path=PaValues,UpdateSourceTrigger=PropertyChanged}"
                Style="{StaticResource DataGridStyle}"
                IsReadOnly="True">
            </DataGrid>

如評論中所建議,我添加了一個AutoGeneratingColumn處理程序,該處理程序將綁定更改為使用方括號:

    private void PaViewAutoGeneratingColumnHandler(object sender, DataGridAutoGeneratingColumnEventArgs e)
    {
        e.Column = new DataGridTextColumn
        {
            Binding = new Binding("[" + e.Column.Header + "]"), Header=e.Column.Header

        };
    }

現在,它適用於“無變化的氣候”,但不適用於名為“ EDIP2003無LT,酸化無LT,酸化無LT”的列,這是實際使用的示例顧客。 錯誤消息與以前相同

BindingExpression path error: '[]' property not found on 'object' ''DataRowView' (HashCode=56876317)'. 
BindingExpression:Path=[EDIP2003 w/o LT, acidification w/o LT, acidification w/o LT] 

查看有關PropertyPath語法的文檔,我們可以看到為什么字符串無法映射。

您已經指出並可以解決的第一個是斜杠/

源遍歷(綁定到集合層次結構)

 <object Path="propertyName/propertyNameX" .../> 

此語法中的/用於在層次結構數據源對象中導航,並且支持使用連續的/字符進入層次結構的多個步驟。

這是通過使用索引器( [] )修復的。

但是,索引器格式支持多個索引器,以逗號分隔:

多個索引器

 <object Path="[index1,index2...]" .../> 

要么

 <object Path="propertyName[index,index2...]" .../> 

如果給定對象支持多個索引器,則可以按順序指定這些索引器,類似於數組引用語法。 有問題的對象可以是當前上下文,也可以是包含多索引對象的屬性的值。

如果進一步看,可以看到可以使用以下語法對逗號進行轉義:

屬性路徑字符串的轉義

對於某些業務對象,您可能會遇到以下情況:屬性路徑字符串需要轉義序列才能正確解析。 轉義的需求應該很少見,因為許多這樣的字符在通常用於定義業務對象的語言中都具有類似的命名交互問題。

  • 在索引器([])中,脫字符號(^)轉義下一個字符。

使用所有這些,我想出了以下解決方案,以在仍然使用自動生成的列的情況下轉義所有內容。 可能會過大,但是可以保證正確解釋字符串。

private void PaViewAutoGeneratingColumnHandler(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
    var columnName = (string)e.Column.Header;

    // We'll build a string with escaped characters.
    // The capacity is the length times 2 (for the carets),
    // plus 2 for the square brackets.
    // This is not optimized for multi-character glyphs, like emojis

    var bindingBuilder = new StringBuilder(columnName.Length * 2 + 2);

    bindingBuilder.Append('[');
    foreach (var c in columnName)
    {
        bindingBuilder.Append('^');
        bindingBuilder.Append(c);
    }
    bindingBuilder.Append(']');

    e.Column = new DataGridTextColumn
    {
        Binding = new Binding(bindingBuilder.ToString()),
        Header = e.Column.Header,
    };
}

暫無
暫無

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

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