我有课
public class ForAllViewModel
{
byte abn;
byte abn2;
public ObservableCollection<TArrF> a
public class TArrF
{
public unsafe byte* Yk;
}
}
我写的时候
a[1].Yk = &abn;
a[2].Yk = &abn2;
abn =1;
abn2 = 0;
它给了我错误
错误CS0212:您只能在固定语句初始值设定项中获取未固定表达式的地址。
我想要的只是在
之后(*a[1].Yk)+=1;
(*a[2].Yk)+=1;
Console.WriteLine(abn.ToString());
Console.WriteLine(abn2.ToString());
在日志2
和1
中查看。
是的,我看到了
fixed (byte* p = &abn) { a[1].Yk = p; }
但在日志1
和0
中使用此功能。
更新:
好的,我会尝试解释我的任务。
在窗体/窗口我有很多CheckBoxes。每个CheckBox都分配给Data Base的FieldName和TableName。它用于动态构建SQL查询。
我使用类似于&#39; abn&#39;计算特定表使用的字段数。
例如:
CheckBox1分配给Field1和Table1
CheckBox2分配给Field2和Table1
CheckBox3分配给Field1和Table2
CheckBox是Checked counter&#39; abn&#39;增加1.如果计数器> 0我将Table1添加到我的SQL查询和特定字段。 CheckBox未选中时,计数器减1.如果counter = 0,我从SQL查询中删除Table1。
我用指针在Delphi中解决了这个任务。现在我开始将这个项目移植到C#并坚持下去。
是的,我知道它需要修复&#39;但正如我写的那样固定(字节* p =&amp; abn){a [1] .Yk = p; }&#39;不给我正确的结果。
因为当我这样做时,你会做出一个[1] .Yk + = 1;&#39; &#39; ABN&#39;也应该成为1更大。但它没有。这意味着我以错误的方式设置指针。所以我正确搜索。
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace WpfApplication5
{
/// <summary>
/// Логика взаимодействия для MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
byte abn, abn2;
public class Field
{
public string Table;
public string Field;
public unsafe byte* Yk;
}
public ObservableCollection<Field> a;
public MainWindow()
{
InitializeComponent();
a = new ObservableCollection<Field>();
abn = 0;
abn = 0;
a.Add(new Field());
a.Add(new Field());
a.Add(new Field());
a.Add(new Field());
a[1].Table="Table_1";
a[1].Field="Field_1";
a[2].Table="Table_1";
a[2].Field="Field_2";
a[3].Table="Table_2";
a[3].Field="Field_1";
unsafe
{
fixed (byte* p = &abn) { a[1].Yk = p; }
fixed (byte* p = &abn) { a[2].Yk = p; }
fixed (byte* p = &abn2) { a[3].Yk = p; }
}
}
private void CheckEdit_EditValueChanged(object sender, DevExpress.Xpf.Editors.EditValueChangedEventArgs e)
{
unsafe
{
Console.WriteLine("abn BEFORE modification: "+abn.ToString());
Console.WriteLine("abn2 BEFORE modification: " + abn2.ToString());
DevExpress.Xpf.Editors.CheckEdit cb = sender as DevExpress.Xpf.Editors.CheckEdit;
byte i = Convert.ToByte(cb.Tag);
if ((bool)cb.IsChecked)
{
*a[i].Yk += 1;
//if(*a[i].Yk==1) { addTabletoSQL(a[i].Table);}
//addFieldtoSQL(a[i].Field);
}
else
{
*a[i].Yk -= 1;
//if(*a[i].Yk==0) { removeTablefromSQL(a[i].Table);}
//removeFieldfromSQL(a[i].Field);
}
Console.WriteLine("abn AFTER modification: " + abn.ToString());
Console.WriteLine("abn2 AFTER modification: " + abn2.ToString());
}
}
}
}
添加一些行以更清楚我看到项目应该如何工作(以及它如何在Delphi中工作)和xaml
<Grid>
<dxe:CheckEdit HorizontalAlignment="Left" Margin="39,28,0,0" VerticalAlignment="Top" Width="150" Content="Field 1" Tag="1" EditValueChanged="CheckEdit_EditValueChanged" />
<dxe:CheckEdit HorizontalAlignment="Left" Margin="39,55,0,0" VerticalAlignment="Top" Width="150" Content="Field 2" Tag="2" EditValueChanged="CheckEdit_EditValueChanged" />
<dxe:CheckEdit HorizontalAlignment="Left" Margin="39,82,0,0" VerticalAlignment="Top" Width="150" Content="Field 3" Tag="3" EditValueChanged="CheckEdit_EditValueChanged" />
</Grid>
所以,当我检查CheckBoxes abn = 2和abn2 = 1时。这是对的。但是当我取消选中时 - abn和abn2应该变为0,但它不会 second time
答案 0 :(得分:0)
我建议在这个答案中对您的代码进行一些小改动,但我实际上建议您重新设计应用程序的更大部分,以使其适合WPF架构。
而不是你的代码
FieldCount abn, abn2;
public class FieldCount
{
public byte Count { get; set; }
}
public class Field
{
public string Name { get; set; }
public FieldCount Yk { get; set; }
}
public ObservableCollection<Field> a;
您可以使用:
a = new ObservableCollection<Field>();
abn = new FieldCount { Count = 0 };
// note I assume you don't want to double initialize abn
abn2 = new FieldCount { Count = 0 };
// add fields to the collection
a.Add(new Field { Name = "Field X", Yk = abn });
a.Add(new Field { Name = "Field Y", Yk = abn });
a.Add(new Field { Name = "Field Z", Yk = abn2 });
a.Add(new Field());
然后相应地更改初始化:
private void CheckEdit_EditValueChanged(object sender, DevExpress.Xpf.Editors.EditValueChangedEventArgs e)
{
Console.WriteLine("abn BEFORE modification: " + abn.Count.ToString());
Console.WriteLine("abn2 BEFORE modification: " + abn2.Count.ToString());
var cb = sender as DevExpress.Xpf.Editors.CheckEdit;
byte i = Convert.ToByte(cb.Tag);
if ((bool)cb.IsChecked)
{
a[i].Yk.Count += 1;
}
else
{
a[i].Yk.Count -= 1;
}
Console.WriteLine("abn AFTER modification: " + abn.Count.ToString());
Console.WriteLine("abn2 AFTER modification: " + abn2.Count.ToString());
}
并更改已检查的事件处理程序
pd.Series
希望我没有添加任何拼写错误,现在无法编译我的更改。