PDA

View Full Version : تغییر در مقدار پروپرتی یک شا با حالتی خاص



saed2006
دوشنبه 21 دی 1388, 10:42 صبح
با سلام
من یک arraylist دارم که توی اوت اشیایی از یک کلاس رو ذخیره کرده ام
توی اون کلاس یک مجموعه ای از پروپرتی ها وجود داره
مشکل من اینه که نمیدونم چجوری مثلا پروپرتی اول شی دومی که در arraylist ذخیره شده رو تغییر بدم
بدون اینکه مجبور باشم تمام اون شی رو از نو بسازم
نمیدونم تونستم منظورمو بیان کنم یا نه

این فایل ضمیمه رو نگاه کنید
شاید گویا تر بشه مطلب

nima-28
دوشنبه 21 دی 1388, 13:49 عصر
سلام
اگه منظورتونو درست گرفتم جواب =
كافيست
MyStruct sd = new MyStruct(); را خارج از بدنه رويداد button تعريف كنيد تا بتوانيد در button اي كه براي Update آن در نظر گرفتيد آن را با مقدار جديد ست كنيد يعني
مثلا برا ي آبديت خصوصيت Family به تنايي بنويسيد :
sd.family = textBox2.Text;

FastCode
دوشنبه 21 دی 1388, 13:50 عصر
using System;
using System.Collections.Generic;
using System.Windows.Forms;
namespace WindowsFormsApplication81
{
public partial class Form1 : Form
{
public List<MyClass> ar = new List<MyClass>();
public Form1() { InitializeComponent(); }
class MyClass
{
public string name;
public string family;
}
private void button1_Click(object sender, EventArgs e)
{
bool found = false;
for (int n = 0; n != ar.Count; n++)
if (ar[n].name == textBox1.Text)
{ ar[n].family = textBox2.Text; found = true; break; }
if (!found)
{
MyClass sd = new MyClass();
sd.name = textBox1.Text;
sd.family = textBox2.Text;
ar.Add(sd);
}
}
}
}

شما اول گفته بودید کلاس ولی توی کدتون struct داشتید منم یکم نفهمیدم دفعه ی اول گفتم نه.
با struct نمیتونید این کارو بکنید چون اونا referencable نیستن بلکه کپی هستند.
ولی اگر میخواهید از unmanaged استفاده کنید از System.Runtime.InteropServices.Marshal.AllocHGloba l
استفاده کنید.
save و load هم راحت تر میشه.(فکر کنم این نکته براتون مهم باشه)

SMRAH1
دوشنبه 21 دی 1388, 14:06 عصر
سلام
با توجه برای حل مثالی که زدی؛دو گام زیر رو انجام بده:
1) MyStruct رو به جای struct از نوع Class تعریف کن
2) در متد button2_Click بنویس:

foreach (object o in ar)
{
MyStruct sd = (MyStruct)o;
if (sd.name == textBox1.Text)
{
sd.family = textBox2.Text;
break;
}
}
البته این ساده ترین راه است و راه های دیگه ای هم هست.
موفق باشید

FastCode
دوشنبه 21 دی 1388, 14:23 عصر
سلام
با توجه برای حل مثالی که زدی؛دو گام زیر رو انجام بده:
1) MyStruct رو به جای struct از نوع Class تعریف کن
2) در متد button2_Click بنویس:

foreach (object o in ar)
{
MyStruct sd = (MyStruct)o;
if (sd.name == textBox1.Text)
{
sd.family = textBox2.Text;
break;
}
}
البته این ساده ترین راه است و راه های دیگه ای هم هست.
موفق باشید

من که کدشم دادم.
حد اقل یه بار کد منو میخوندی.

saed2006
سه شنبه 22 دی 1388, 09:04 صبح
میشه در مورد
System.Runtime.InteropServices.Marshal.AllocHGloba l
کمی توضیح بدین

FastCode
سه شنبه 22 دی 1388, 11:53 صبح
میشه در مورد
System.Runtime.InteropServices.Marshal.AllocHGloba l
کمی توضیح بدین
توضیحش خیلی سخته.:گیج:
unsafe class Table_saed2006
{
void* data;
private int count;
public int Count { get { return count; } }
private const int rowlength = 300;
private const int nameoffset = 0;
private const int namelength = 100;
private const int familyoffset = 100;
private const int familylength = 200;
public void Load(System.IO.Stream stream)
{
count = stream.Length / rowlength;
Allocate(count);
int d = stream.ReadByte();
int n = 0;
while (d != -1)
{
*((byte*)data + ++n) = (byte)d;
d = stream.ReadByte();
}
}
public void Save(System.IO.Stream stream)
{
int len = rowlength * count;
for (int n = 0; n != len; n++) stream.WriteByte(*((byte*)data + n));
}
public void Allocate(int rowcount)
{
data = System.Runtime.InteropServices.Marshal.AllocHGloba l(rowcount * rowlength).ToPointer();
}
private void UnAllocate(void* address)
{
System.Runtime.InteropServices.Marshal.FreeHGlobal ((IntPtr)address);
}
public void Add(int rowcount)
{
int bcount = count;
void* bdata = data;
count += rowcount;
Allocate(count);
memcpy(bdata, data, bcount);
UnAllocate(bdata);
}
public string GetName(int rowid)
{
return System.Runtime.InteropServices.Marshal.PtrToString BSTR((IntPtr)((byte*)data + (rowlength * rowid) + nameoffset));
}
public string GetFamily(int rowid)
{
return System.Runtime.InteropServices.Marshal.PtrToString BSTR((IntPtr)((byte*)data + (rowlength * rowid) + familyoffset));
}
public void SetName(int rowid, string value)
{
void* address =
System.Runtime.InteropServices.Marshal.StringToHGl obalUni(value).ToPointer();
memcpy(address, (byte*)data + (rowid * rowlength) + nameoffset, namelength);
UnAllocate(address);
}
public void SetFamily(int rowid, string value)
{
void* address =
System.Runtime.InteropServices.Marshal.StringToHGl obalUni(value).ToPointer();
memcpy(address, (byte*)data + (rowid * rowlength) + familyoffset, familylength);
UnAllocate(address);
}
public void delete(int rowid)
{
int bcount = count;
void* bdata = data;
count--;
Allocate(count);
memcpy(bdata, data, rowid * rowlength);
memcpy((byte*)bdata + ((rowid + 1) * rowlength), data, (rowid + 1) * rowlength);
UnAllocate(bdata);
}
public void memcpy(void* source, void* dest, int count)
{
if (count <= 0) return;
for (int n = 0; n != count; n++) *((byte*)dest + n) = *((byte*)source + n);
}
}



در استفاده از این کد از هیچ ifی صرف نظر نکنید.