【发布时间】:2014-01-04 13:58:06
【问题描述】:
我正在尝试使用 c# 制作简单的 WPF 应用程序,但遇到以下问题: 在我的应用程序中,我使用“Macierz”类来表示和使用 BigInteger 对象数组。现在我需要使用 DataGrid 以图形方式表示这个数组(或者如果有更好的方法可以使用其他方法),我不知道如何将这个 DataGrid 绑定到我的类。我曾尝试通过数据源窗口(VS 2013)执行此操作,但是当我将我的类添加到其中时,我的数组没有显示。 这是我班级的一些代码:
public class Macierz
{
public Macierz(ulong A, ulong B)
{
a = A;
b = B;
M = new BigInteger[A, B];
}
private ulong a, b;
public ulong A
{
get
{
return a;
}
}
public ulong B
{
get
{
return b;
}
}
private BigInteger[,] M;
public BigInteger this[ulong A, ulong B]
{
get
{
return M[A, B];
}
set
{
M[A, B] = value;
}
}
我需要用文本框或类似的单元格表示数组,以便用户可以轻松更改特定单元格的值。
编辑: 现在,感谢 user3148019 的回答,我在课堂上添加了这个方法:
public DataTable ToDataTable()
{
DataTable table = new DataTable();
DataRow tmp;
for (ulong i = 0; i < b; i++)
table.Columns.Add(i.ToString(), typeof(BigInteger));
for (ulong i = 0; i < a; i++)
{
tmp = table.NewRow();
for (ulong j = 0; j < b; j++)
tmp[j.ToString()] = M[i, j];
table.Rows.Add(tmp);
}
return table;
}
所以现在我可以使用 DataGrid 显示我的数组,但这需要两倍的内存,并且用户无法更改原始数组中的任何值。我试图更改我的类,用 DataTable 对象替换简单的 BigInteger[a, b] 数组,但访问特定单元格时遇到问题。例如:
public BigInteger tmp = 0;
for (ulong i = 0; i < a; i++)
for (ulong j = 0; j < b; j++)
{
tmp += table.Rows[i].ItemArray[j];
}
这会产生错误:
错误 1 'System.Data.DataRowCollection.this[int]' 的最佳重载方法匹配有一些无效参数
错误 2 参数 1:无法从 'ulong' 转换为 'int'
DataTable 对象中的行数和列数是否限制为 int 的最大值,还是有其他方法可以访问 DataTable 成员?
编辑2:
我应该早点说,Macierz 永远不会更改数组内的任何值,因此只有用户可以更改单元格女巫的值,这意味着我不需要 INotifyCollectionChange(或者我错了吗?)。现在我也认为显示完整的数组并不总是必要的。我不希望 Macierz 从 DependencyObject 派生,因为我想在其他控制台应用程序中使用它。我想以最简单的方式实现我的目标。这就是我现在在 Macierz 拥有的:
public DataTable ToDataTable(ulong AStart, ulong ACount, ulong BStart, ulong BCount)
{
if (AStart >= a)
AStart = a - 1;
if (BStart >= b)
BStart = b - 1;
ulong AStop = AStart + ACount;
ulong BStop = BStart + BCount;
if (AStop > a)
AStop = a;
if (BStop > b)
BStop = b;
DataTable table = new DataTable();
DataRow tmp;
BigInteger BItmp;
for (ulong i = BStart; i < BStop; i++)
table.Columns.Add(i.ToString(), typeof(BigInteger));
table.Columns.Add("Suma", typeof(BigInteger));
for (ulong i = AStart; i < AStop; i++)
{
tmp = table.NewRow();
for (ulong j = BStart; j < BStop; j++)
tmp[j.ToString()] = M[i, j];
BItmp = 0;
for (ulong j = 0; j < B; j++)
BItmp += M[i, j];
tmp["Suma"] = BItmp;
table.Rows.Add(tmp);
}
return table;
}
在 MainWindow.xaml.cs 中:
private void PokazButton_Click(object sender, RoutedEventArgs e)
{
this.Cursor = Cursors.Wait;
if (czyCala.IsChecked == true)
GridTabela = M.ToDataTable(0, M.A, 0, M.B);
else
GridTabela = M.ToDataTable(VA, VACount, VB, VBCount);
TabelaDataGrid.DataContext = this;
TabelaDataGrid.ItemsSource = GridTabela.DefaultView;
this.Cursor = null;
}
这很好用,允许我以简单的方式向用户显示数组,但我现在不知道如何允许用户更改原始数组中的值。我试图使用 CellEditEnding DataGrid 事件,但我现在不知道如何访问、读取和验证用户在特定单元格中所做的输入,尤其是如何获取该单元格的坐标(我可能应该以某种方式获取这些信息,例如“e. Column.something" 或 "e.Row.something" 但我不知道该怎么做)。
【问题讨论】:
标签: c# wpf data-binding wpfdatagrid