3 Stimmen

2d-Array im DataGrid anzeigen

Ich versuche, ein DataGrid zu bekommen, um den Inhalt eines object[][] . Dies wird schreibgeschützt sein, so dass ich mich nicht um Benachrichtigungsänderungen oder Ähnliches kümmern muss. Einstellung ItemSource zu einer object[][] zeigt einfach die Eigenschaften von Array im Gitter, und mit List<List<object>> tut stattdessen das Gleiche, was ausgesprochen wenig hilfreich ist.

Die Anzahl der Spalten in jedem 1d-Array kann beliebig sein; ich möchte lediglich, dass für jedes Array-Element in jeder Zeile eine unbenannte Spalte erstellt wird. Wie kann ich dies tun?

1voto

Fredrik Hedblad Punkte 81655

Siehe meine Antwort in diese Frage . Dies ermöglicht auch die Bearbeitung der Werte. Da Sie nur an der Anzeige der Werte interessiert sind, ist es vielleicht einfacher, die Antwort von Jobi Freude wenn die Verwendung des DataGrid nicht erforderlich ist.

Um eine Kurzfassung der Antwort auf diese Frage zu geben. Sie benötigen eine Ref-Klasse

public class Ref<T>
{  
    private readonly Func<T> getter;   
    private readonly Action<T> setter;  
    public Ref(Func<T> getter, Action<T> setter)   
    {   
        this.getter = getter;   
        this.setter = setter;   
    }  
    public T Value { get { return getter(); } set { setter(value); } }   
}  

Und eine Hilfsklasse, um dynamische Spalten aus dem 2d-Array zu erhalten

public class BindingHelper
{
    public DataView GetBindable2DViewFromIList<T>(IList list2d)
    {
        DataTable dataTable = new DataTable();
        for (int i = 0; i < ((IList)list2d[0]).Count; i++)
        {
            dataTable.Columns.Add(i.ToString(), typeof(Ref<T>));
        }
        for (int i = 0; i < list2d.Count; i++)
        {
            DataRow dataRow = dataTable.NewRow();
            dataTable.Rows.Add(dataRow);
        }
        DataView dataView = new DataView(dataTable);
        for (int i = 0; i < list2d.Count; i++)
        {
            for (int j = 0; j < ((IList)list2d[i]).Count; j++)
            {
                int a = i;
                int b = j;
                Ref<T> refT = new Ref<T>(() => (list2d[a] as IList<T>)[b], z => { (list2d[a] as IList<T>)[b] = z; });                    
                dataView[i][j] = refT;
            }
        }
        return dataView;
    }
}

Danach können Sie ItemsSource wie folgt verwenden

<DataGrid Name="dataGrid" 
          RowHeaderWidth="0" 
          ColumnHeaderHeight="0" 
          AutoGenerateColumns="True" 
          AutoGeneratingColumn="dataGrid_AutoGeneratingColumn"/> 

dataGrid.ItemsSource = BindingHelper.GetBindable2DViewFromIList<object>(m_2DArray);

private void dataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e) 
{ 
    DataGridTextColumn column = e.Column as DataGridTextColumn; 
    Binding binding = column.Binding as Binding; 
    binding.Path = new PropertyPath(binding.Path.Path + ".Value");
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X