PDA

View Full Version : آموزش: ارسال لیستی از داده ها بین دو Activity (هر نوع داده ای)



arman_Delta2002
جمعه 05 دی 1393, 19:07 عصر
سلام امروز بهتون نحوه ارسال لیستی از داده ها رو میدم که مهم نیست چه نوع داده ای باشه و فکر کنم اولین بار باشه چون هیچ اموزشی نبود واسه این خلاقیت
خوب اول یه کلاس درست میکنیم

public class tb_Clob_Login
{
public int ID { get; set; }
public string FName { get; set; }
public string UserName { get; set; }
public string Pass { get; set; }
public string Mobile { get; set; }
public string Emailr { get; set; }
public byte[] AccessT { get; set; }
public bool Ban { get; set; }
public string BanDateTime { get; set; }
public string BanDescription { get; set; }
public double Latitude { get; set; }
public double Longitude { get; set; }
public bool Show1 { get; set; }
}

خوب حالا یه تابع برای تبدیل لیست به بایت باید داشته باشیم
این تایع یک شیع رو میگیره و به ارایه ای از بایت تقییر میده.
public byte[] ToByteArray(object source)
{
var formatter = new BinaryFormatter();
using (var stream = new MemoryStream())
{
formatter.Serialize(stream, source);
return stream.ToArray();
}
}
خوب حالا میریم سراق اکتیویتی که لیست داده ها قراره اجرا شه
ما فرض بر این میگیریم که کاربر روی دکمه ورود کلیک کرده و پس از دریافت اطلاعات اون و ریختنش توی یکه لیست از کلاس بالا داده ها رو میفرستیم واسه اکتیویتی دوم که کاربر وارد شده رو نشون میده و اطلاعات رو میگیره
در فرم اول :

List<tb_Clob_Login> _result2 = new List<tb_Clob_Login>(); // ایجاد لیستی از کلاس
WebService1.tb_Clob_Login tb_Clob_LoginTemp = new WebService1.tb_Clob_Login(); // یه کلاس موقت از رو اون میسازم که بتونم داده ها رو به سرور لاگین کنم
tb_Clob_LoginTemp.UserName = Username1;
tb_Clob_LoginTemp.Pass = Password;
tb_Clob_LoginTemp.Emailr = Username1;
tb_Clob_LoginTemp.Ban = false;
tb_Clob_LoginTemp.Show1 = true;
_result2 = WebServiceTemp1.Logining_tb_Clob_Login(tb_Clob_Log inTemp).Cast <tb_Clob_Login>().ToList(); // اینجا لاگین میشه و اگر داده ای برگرده داده ها رو داخل لیست پر میکنه

if (_result2.Count > 0)
{
PublicClass1 PublicClassTemp = new PublicClass1(); // چون من این تابع تبدیل کلاس به بایت رو داخل یه کلاس به اسم PublicClass1 ریختم باید یه نمونه ازش بسازم
byte[] ConvertDataToByteTemp = PublicClassTemp.ToByteArray(_result2); // اینجا هم یه متقییر از نوع ارایه ای از بایت ها میسازم که کلاس تبدیل لیست ام رو به بایت هم صدا زدم


Intent intentTemp = new Intent(this ,typeof( ClobFlyOutMainActivity)); // در این قسمت یه نمونه از اکتیویتی که قراره داده ها رو بگره میسازم
intentTemp.PutExtra("UserLogin", ConvertDataToByteTemp); // به اون نمونه که خط قبل ساختم با این دستور اون کلاسی که به بایت تبدیل شده رو میفرستم و نام ارسال شده هم گزاشتم UserLogin
StartActivity(intentTemp); // و نمونه ساخته شده رو استارت میکنم
}
else
{
Toast.MakeText(this, "رمز ورود اشتباه میباشد!", ToastLength.Long).Show();
Vibrator VibratorTemp1 = (Vibrator)GetSystemService(Context.VibratorService );
VibratorTemp1.Vibrate(100);
}


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

protected override void OnCreate (Bundle bundle)
{
base.OnCreate (bundle);

BinaryFormatter bf = new BinaryFormatter(); // یه متقییر از نوع روبرو تعریف میکنیم
byte[] TT = (byte[])Intent.Extras.GetByteArray("UserLogin"); // با این دستور یه متقییر از نوع بایتی از ارایه تعریف میکنیم که مقدار دریافتی رو بشه میدیم
using (Stream ms = new MemoryStream(TT)) // بقیش هم مشخصه
{
List<tb_Clob_Login> myList = (List<tb_Clob_Login>)bf.Deserialize(ms); // تبدیل بایت به لیست داده ای که ارسال شده بود
}


}



موفق باشید(اگه میشد برگردم به زمان قدیم به تاریخی برمیگشتم که سازنده اندروید فکر ساختنش به ذهنش رسیده بود و برای نجات جان بشریت از این فاجه نرم افزاری میکشتمش :قهقهه:)