作者james732 (好人超)
看板C_Sharp
标题[问题] 大量变数对应至大量Control
时间Wed May 14 20:41:01 2014
我使用的是C#写Winform视窗程式
目前做的事情是把档案里的资料读出来
对应到form上的控制项
譬如:
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct Setting
{
public byte control;
public byte data1;
public byte data2;
}
control bit7 => Checkbox
control bit6, bit5 => shift变成0,1,2,3之後控制 Combobox
data1 => Textbox (十进位显示)
data2 => Textbox (十六进位显示)
档案读出来的东西,能够显示在控制项上
然後控制项如果被修改,也要能够写回档案
我目前用databind的方式来写,已经初步可以用
简单的程式如下:
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct Setting
{
public byte control;
public byte data1;
public byte data2;
public bool IsEnable
{
get
{
return (control & 0x80) == 0 ? false : true
}
}
public int Option
{
get
{
return (control & 0x60) >> 5;
}
}
public int DecimalData
{
get
{
return data1;
}
}
public string HexData
{
get
{
return data2.ToString("X02");
}
}
void InitUi()
{
checkboxIsEnable.DataBindings.Add("checked", myobj, "IsEnable");
comboBoxOption.DataBindings.Add("SelectedIndex", myobj, "Option");
textBoxDecData.DataBindings.Add("Text", myobj, "DecimalData");
textBoxHexData.DataBindings.Add("Text", myobj, "HexData");
}
}
class MyForm : Form
{
void InitUi(byte[] rawData)
{
Setting myobj = Marshal.PtrToStructure(....);
checkboxIsEnable.DataBindings.Add("checked", myobj, "IsEnable");
comboBoxOption.DataBindings.Add("SelectedIndex", myobj, "Option");
textBoxDecData.DataBindings.Add("Text", myobj, "DecimalData");
textBoxHexData.DataBindings.Add("Text", myobj, "HexData");
}
}
但是目前我的资料有很多很多 (上千笔)
一笔一笔的加propert实在很累
而且我还没写set的部份...
想到输入的资料可能还需要换算与验证...(虚脱)
想问一下,有没有更聪明的方式
可以达成我的需求呢?谢谢
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 111.67.62.81
※ 文章网址: http://webptt.com/cn.aspx?n=bbs/C_Sharp/M.1400071263.A.DD7.html
1F:推 Eleganse:无限多的数据对应到无限多的textbox 不就gridview 05/15 11:19
2F:→ Eleganse:只要把textbox宣告在gridview资料列内 05/15 11:20
3F:→ Eleganse:或gridview内已经有开启textbox栏位型态的属性 05/15 11:20
4F:→ Eleganse:如此一来 只要写一列就好 其它数千列gridview自动比照 05/15 11:21
主要是因为资料并不是很有规律
就像以上的例子,有的要用Checkbox,有的要用TextBox,有的要用ComboBox等
对於有规律的资料,我确实是用DataGridView做的
5F:推 Eleganse:你的意思是你的表格内"栏位型态有很多种" 05/15 11:46
6F:→ Eleganse:还是"*同一栏*内有多种不同型态需要个别处理的资料" 05/15 11:46
7F:推 StupidGaGa:gridview也可以有checkbox 05/15 12:05
以上面的例子来说
UI会像这样
http://imgur.com/EPYWpeO.png
相关程式码
http://ideone.com/AAidUU
完整的专案
http://ppt.cc/su8F (google drive空间,以Visual Stuidio 2012建立)
在这个例子里,只有3个byte,显示四笔资料
不过我实际上使用的有上千个byte,显示出来的更多
想不到有没有更聪明的方式来做...
8F:推 StupidGaGa:先问,你的enable跟option的作用是什麽? 05/15 12:45
9F:→ StupidGaGa:另外,你这作法的确是用gridview去处理修改或显示 05/15 12:46
10F:→ StupidGaGa:gridview内的确可以有checkbox跟comboBox 05/15 12:47
Enable对应的是RawData[0]的Bit7
如果Bit7为1,Enable就要打勾
相同的,如果打勾或被取消,Bit7就要对应被设定或取消
Option对应的是RawData[0]的Bit6,Bit5
Bit6 Bit5
0 0 => 选项1
0 1 => 选项2
1 0 => 选项3
1 1 => 选项4
在我上面程式的例子,RawData[0]为0xC0,Bit6=1,Bit5=0,於是对应到选项3
主要是
控制项以及RawData需要连动,我不知道有没有比较简易的写法来做
※ 编辑: james732 (111.67.62.81), 05/15/2014 14:01:08
11F:→ StupidGaGa:1. 你bind的对象要改成gridview 05/15 14:41
12F:→ StupidGaGa:2. gridview跟你储存的data要连动,请参考gird的event 05/15 14:42
13F:→ StupidGaGa:3. 建议鲜血简单的textbox连动,在应用到checkbox等 05/15 14:43
14F:→ StupidGaGa:4. 相关用法或程式码范例请看MSDN或google一定有 05/15 14:44
15F:→ StupidGaGa:另外,你图片范例有误,171应该是0xAB怎麽是0xCD? 05/15 14:48
因为图片里的DecimalData是Bind到RawData[1],0xAB
HexData是Bind到RawData[2], 0xCD
如果全部都是Textbox,那我已经有做了
问题是目前混合了CheckBox, ComboBox, TextBox
我不知道有没有比"一格一格加"还要简单的方法可以做到...
┌───────┬─────┐
│Enable │ CheckBox │
├───────┼─────┤
│Option │ ComboBox │
├───────┼─────┤
│DecimalData │ TextBox │
├───────┼─────┤
│HexData │ TextBox │
└───────┴─────┘
↑如果这里全部都是同一种Control,我已经OK了
但我Google到的资料,如果要不同的Control
似乎要自己一个一个加?
※ 编辑: james732 (111.67.62.81), 05/15/2014 17:16:21