PDA

View Full Version : delegete عجیب!!!



siavashr
شنبه 13 بهمن 1386, 15:20 عصر
دورود
دوستان من یه مشکل عجیب خوردم .
توی پروژه مسنجری که دارم کار میکنم توی کلاینت من یک سری deleget تعریف کردم که کارهای مختلفی رو انجام میدن یکی از اونها برای زمانی هست که کاربر 1 ایدی رو در صفحه add وارد میکنه و دکمه search رو میزنه .
بار اول هیچ مشکلی نیست و همه چیز ردیفه اما اگر کاربر دوباره سعی کنه هر چیزی تو اون صفحه (چه همون صفحه باز و چه زمانی که صفحه رو ببنده و دوباره باز کنه) search کنه یه error میگیره روی deleget که تا زمانی که صفحه ساخته نشده نمیتونی از deleget به عنوان object استفاده کنی .
اما موضوع عجیبتر اینه که من دقیقا همین deleget رو در صفحه ignor هم استفاده کردم و در اون صفحه هم باید برای آیدی جستجو بشه اما اینجا اصلا error نمیگیره .
کدهای هر 2 صفحه هم دقیقا مثل هم هستند!!!!!!!!!!
لطفا اگر کسی فهمید من چی گفتم و میتونید کمک کنید
با سپاس

hassan razavi
شنبه 13 بهمن 1386, 15:27 عصر
لطفا کدتون رو هم بگذارید.

siavashr
شنبه 13 بهمن 1386, 15:43 عصر
دورود

اقا این کل کد صفحه add هست :


using System;




using System.Collections.Generic;

using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace ClientStart
{
public partial class add : Form
{
public add()
{
InitializeComponent();
}
public void AddItemsDel(string All)
{
Invoke(new Classes.DLLClient.OneInput(AddItems), All);
}
public void UpdateModuleList(string All)
{
AddItems(All);
}
public void AddItems(string All)
{
listid.Items.Clear();
ListViewItem Module = null;
string[] Items = All.Split('#');
if (All.Length == 0)
{
MessageBox.Show("Name does not exist", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
txtSearch.Clear();
}
else
{
foreach (string Item in Items)
{
Module = new ListViewItem();
Module.Text = Item;
listid.Items.Add(Module);
}
}
}
private void button1_Click(object sender, EventArgs e)
{
if (txtSearch.Text.Length == 0)
{
MessageBox.Show("A minimum of 2 characters must be entered to start search", "Sorry", MessageBoxButtons.OK);
}
else if (txtSearch.Text.Length 2)
{
MessageBox.Show("A minimum of 2 characters must be entered to start search", "Sorry", MessageBoxButtons.OK);
txtSearch.Clear();
}
else
{
//search for an id
//string selectedid = listView1.FocusedItem.Text;
string searchedId = txtSearch.Text;
string ID = Main.GetUser();
progressBar1.Visible = true;
this.progressBar1.Location = new System.Drawing.Point(88, 232);
this.progressBar1.Name = "progressBar1";
progressBar1.Value = 0;
progressBar1.PerformStep();
this.progressBar1.TabIndex = 0;
this.progressBar1.Maximum = 60000;
this.progressBar1.Minimum = 1;
this.progressBar1.Step = 1;
for (int i = progressBar1.Minimum; i = progressBar1.Maximum; i++)
{
progressBar1.PerformStep();
}
//sned message to the server
string message = "a1" + ID + "#" + searchedId;
Classes.DLLClient.SendMessage(message);
txtSearch.Clear();
progressBar1.Visible = false;
}
}
private void button2_Click(object sender, EventArgs e)
{
if (listid.SelectedItems.Count == 0)
{
MessageBox.Show("You have not entered any ID, please enter the ID you are looking for", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
else
{
//moarefiye moteghayer baraye add kardan
string selectedid = listid.FocusedItem.Text;
string ID = Main.GetUser();
//vaghty ke user bekhad id khodesho add kone in error ro migire
if (selectedid == ID)
{
MessageBox.Show("You cannot add your own Chumname", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
//listView1.Items.Clear();
}
else if (selectedid == null)
{
MessageBox.Show("You have not selected any chumname", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
else
{
//jam kardane moteghayerha va ferestadan be server
string message = "mz" + ID + "#" + selectedid;
Classes.DLLClient.SendMessage(message);
this.Close();
}
}
}
private void button3_Click(object sender, EventArgs e)
{
if (listid.SelectedItems.Count == 0)
{
MessageBox.Show("You have not entered any ID, please enter the ID you are looking for", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
else
{
string pro = listid.FocusedItem.SubItems[0].Text;// alan mitooni kar koni,. vaghty mikhay text bekhooni
string ID = Main.GetUser();
string selectedId = listid.FocusedItem.SubItems[0].Text;
string message = "mb" + "#" + selectedId + "#" + ID;
Classes.DLLClient.SendMessage(message);
}
}
private void add_Load(object sender, EventArgs e)
{
Classes.DLLClient.SearchedItems += new Classes.DLLClient.OneInput(AddItemsDel);
}
private void label1_Click(object sender, EventArgs e)
{
}


private void listid_SelectedIndexChanged(object sender, EventArgs e)
{
}
private void txtSearch_TextChanged(object sender, EventArgs e)
{
}
}
}


در ضمن من یه dll هم نوشتم که تمام چیزهائی که از سرور میاد میره توی اون و از اونجا تصمیم گرفته میشه که هر دستوری به کجا فرستاده بشه توی کلاینت یا بر عکس
که برای این قسمت از کلاینت اینها رو اضافه کردم توش



public static event OneInput SearchedItems;//serch kardane id to safe add




public static event OneInput addchums;

error هم روی این خط گرفته میشه :



Invoke(new Classes.DLLClient.OneInput(AddItems), All);

با سپاس

ARA
شنبه 13 بهمن 1386, 17:29 عصر
مطمئن نیستم ولی در onclose فرم جستجو



Classes.DLLClient.SearchedItems -= new Classes.DLLClient.OneInput(AddItemsDel);


این رو امتحان کن

siavashr
یک شنبه 14 بهمن 1386, 01:22 صبح
دورود
دوست عزیز ARA بسیار متشکرم . دقیقا حل شد . واقعا ممنونم.
من اصلا نمیدونستم که deleget مثل فایل باید حتما بسته بشه .
سپاس

اَرژنگ
یک شنبه 14 بهمن 1386, 14:35 عصر
دورود
من اصلا نمیدونستم که deleget مثل فایل باید حتما بسته بشه .

این تشبیه دلگت و فایل درست نیست.

ARA
یک شنبه 14 بهمن 1386, 14:54 عصر
این تشبیه دلگت و فایل درست نیست.


راست میگن دوستان
وقتی یک delegate رو هندل میکنی به معنی اینه که event را هندل کردی
پس event رو هندل میکنی
اگر یک event رو دوباره هندل کنی یک exception رخ میدهد
پس باید اگر میخوای مشکل پیش نیاید هندلش رو پاک کن
(اصطلاحش رو نمیدونم فکر کنم unhandel باشه :گیج:)

siavashr
یک شنبه 14 بهمن 1386, 22:26 عصر
دورود
با تشکر از توضیحاتتون .
سپاس

اَرژنگ
دوشنبه 15 بهمن 1386, 15:27 عصر
راست میگن دوستان
وقتی یک delegate رو هندل میکنی به معنی اینه که event را هندل کردی
پس event رو هندل میکنی
اگر یک event رو دوباره هندل کنی یک exception رخ میدهد
پس باید اگر میخوای مشکل پیش نیاید هندلش رو پاک کن
(اصطلاحش رو نمیدونم فکر کنم unhandel باشه :گیج:)
اصطلاحش detach است.