.net - 在 DataGrid 中显示二维数组

标签 .net wpf data-binding wpfdatagrid

我试图让 DataGrid 显示 object[][] 的内容.这将是只读的,所以我不关心通知更改或类似的事情。设置ItemSourceobject[][]只显示 Array 的属性在网格中,并使用 List<List<object>>而是做同样的事情,这绝对是无益的。

每个一维数组的列数可以是任意的;我只想为每行中的每个数组元素创建一个未命名的列。我怎样才能做到这一点?

最佳答案

this question 中查看我的答案.这也将启用值的编辑。由于您只是对显示它们感兴趣,因此如果不需要使用 DataGrid,那么使用 Jobi Joy 的答案可能会更容易。

制作该问题答案的简短版本。你需要一个 Ref 类

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); } }   
}  

和一个帮助类从二维数组中获取动态列
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;
    }
}

之后,您可以像这样使用 ItemsSource
<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");
}

关于.net - 在 DataGrid 中显示二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4460946/

相关文章:

c# - Xamarin ListView MVVM 数据绑定(bind)

c# - 使用 Roslyn 编译时如何设置程序集版本、文化和公钥 token ?

c# - 计算 Outlook 2003 中每天的电子邮件数量?

C# 将字符串转换为对象

javascript - 如何在 Angular2 中创建多个控件并将其绑定(bind)到一个字段对象?

wpf - 绑定(bind)字符串格式数字逗号且无小数位

c# - 为什么以下字符串比较代码在附加 0x81 后返回 TRUE

.net - 将 SqlDbType 转换为 .net 类型

wpf - 获取或设置附加属性的访问器在数据绑定(bind)时未触发? WPF

.net - 我可以使用枚举作为 ConverterParameter 吗?