PDA

View Full Version : حرفه ای: نمایش تغییرات لیست باکس هر 10 ثانیه یکبار؟؟



ghamgin
شنبه 23 آذر 1392, 08:43 صبح
سلام
دوستان من یه لیست باکس دارم که کاربر در اون تغییراتی رو اعمال می کنه (مثلا ایتمی رو حذف و یا چند ایتم درج میکنه)
تا اینجا مشکلی نیست
من میخوام برنامه ام هر 10 ثانیه یکبار توی لیست باکس بگرده و ایتم هایی که جدید هستن (10 ثانیه قبل توی لیست باکس نبودن و الان اضاف شدن) رو پیدا کنه و در یک لیبل نمایش بده
و دوباره ده ثانیه بعد بگرده و ایتم هایی که در طول این 10 ثانیه دوم ایجاد شدن در لیست رو پیدا و در لیبل نشون بده
اما نمیدونم چی باید بنویسم
ممنون میشم کمک کنید


پیشاپیش ممنون

fmehrvarzi
شنبه 23 آذر 1392, 09:06 صبح
سوال اول:کاری نداره داداش تو رویداد تیک تایمر اینکارو انجام بده و بازه زمانیشو قرار بده 10000
سوال دوم: با استفاده از اینستال شیلد میشه اینکارو انجام داد(خودش یه راهنمای نصبی داره)

ghamgin
شنبه 23 آذر 1392, 17:33 عصر
سوال اول:کاری نداره داداش تو رویداد تیک تایمر اینکارو انجام بده و بازه زمانیشو قرار بده 10000
سوال دوم: با استفاده از اینستال شیلد میشه اینکارو انجام داد(خودش یه راهنمای نصبی داره)



سلام
ممنون
تایمر رو میدونم
کد پیدا کردن ایتم های جدید چیه؟؟؟
کدی ندارید بذارید؟
(جستو جو رو نمیدونم)
درباره سوال 2 بدون اینستال شیلد راهی نیست که درایو ویندوز رو تشخیص داد و فایل رو در پوشه سیستم 32 کپی کرد؟
خواهش می کنم راهنمایی کنید
بازم ممنون

meysamsh91
یک شنبه 24 آذر 1392, 01:33 صبح
سلام
دوست عزیز عنوان نکردید روند حذف و یا اضافه شدن آیتم ها در لیست باکس از چه طریقی صورت میگیره . برای همین من با فرض اینکه شما یک تکست باکس دارید و یک دکمه Add (برای اضافه) و یک دکمه Remove (برای حذف) آیتم های لیست باکس دارید، پاسخ رو با استفاده از کلاس Stack قرار میدم
قبلش یک توضیح بدم که شیوه کار stack به این شکل است که آخرین ورودی اولین خروجی می باشد. (Last in First out) پس آخرین تغییر ما در لیست باکس اولین پیغام ما در لیبل هست.

گام اول :
اضافه کردن NameSpace مربوط به کلاس Stack در قسمت فضای نام

using System.Collections;


گام دوم:
ساخت یک شی از کلاس Stack در سطح کلاس

namespace WindowsFormsApplication57
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

Stack s = new Stack(); // ساخت شی


گام سوم :
اضافه کردن کنترل Timer
گام چهارم:
تعریف پریود زمانی برای تایمر و فعال سازی تایمر به نحو مقتضی (من این کار رو در رویداد فرم لود انجام دادم)
گام پنجم :
اضافه کردن محتویات تکست باکس به لیست باکس و ذخیره آن در Stack از طریق دکمه ADD
پس در رویداد کلیک دکمه ADD کد زیر رو اضافه می کنیم

listBox1.Items.Add(textBox1.Text);
s.Push(textBox1.Text + " is added");


گام ششم:
حذف آیتم انتخابی از لیست باکس و ذخیره آن در Stack از طریق دکمه Remove

s.Push(listBox1.SelectedItem+" is Removed");
listBox1.Items.Remove(listBox1.SelectedItem);

گام هفتم :
کدهای مربوط به Timer_Tick

label1.Text = "";
while (s.Count != 0)
label1.Text += s.Pop() + "\r\n";


نکته : از طریق Push آبجکت ها درون Stack ذخیره و از طریق Pop آبجکت ها از Stack خارج میشن.
نکته مهم : زمانیکه آبجکت از Stack خارج شد دیگه قابل دسترسی نیست.
موفق و پیروز باشید.

ghamgin
یک شنبه 24 آذر 1392, 09:12 صبح
سلام
یه دنیا ممنون از وقتی که گذاشتید
حق با شماست
ببینید
لیست باکس من با زدن یک باتن انی یک سری ایتم داخلش لود میشه (از یه فایل متنی خونده میشه) و داخلش میاد
(پس ممکنه چند تا ایتم جدید که جاشون در لیست مشخص نیست جدید باشه)(البته این هم با تایمر هست یعنی هر 10 ثانیه یکبار یک سری ایتم به لیست باکس اضافه میشه(اطلاعاتش اپدیت میشه)
من میخوام تشخیص بدم در طول این ده ثانیه در اپدیت فعلی لیست باکس چه ایتمی هایی نسبت به قبل (10 ثانیه قبل) جدید هستن اونها رو نشون بدم
یعنی چطور میشه اطلاعات کل لیست باکس رو هر 10 ثانیه با هم مقایسه کرد و جدید ها رو نشون داد؟؟
ممنون میشم در این مورد لطف کنید و راهنماییم کنید

rahnema1
یک شنبه 24 آذر 1392, 22:22 عصر
سلام ، خب همون هایی که در 10 ثانیه اخیر وارد شده اند همون هایی هستند که جدید هستند دیگه چه مقایسه ای لازمه؟

ghamgin
سه شنبه 26 آذر 1392, 08:07 صبح
سلام ، خب همون هایی که در 10 ثانیه اخیر وارد شده اند همون هایی هستند که جدید هستند دیگه چه مقایسه ای لازمه؟
سلام
اخه ایتم های لیست باکس قاطی هست (قدیمی ها و اونهایی که 10 ثانیه پیش اضاف شدن)
من چطوری بفهمم که کدوم ها 10 ثانیه پیش اضاف شدن
ایتمها درهم اند
ممنون میشم بگید
(اگه میشه کد بذارید...ممنون)

abbas.oveissi
سه شنبه 26 آذر 1392, 08:16 صبح
سلام
اخه ایتم های لیست باکس قاطی هست (قدیمی ها و اونهایی که 10 ثانیه پیش اضاف شدن)
من چطوری بفهمم که کدوم ها 10 ثانیه پیش اضاف شدن
ایتمها درهم اند
ممنون میشم بگید
(اگه میشه کد بذارید...ممنون)

سلام ، خب چرا برای کسایی که جدید اضافه میشن یه Tag تعریف نمیکنی،بعد هر ده ثانیه که چک میکنی،اونایی که مثلا تگشون یک هست رو میفهمی جدیدا.بعد همون موقع که جدیدارو پیدا میکنی تگشون رو صفر کن تا دفعه بعدی باز جدیدارو پیدا کنی. یه همچین چیزی منظورمه :

private void button1_Click(object sender, EventArgs e)
{
ListBoxItem item = new ListBoxItem();
item.isNew = true;
item.Content = "a";
listBox1.Items.Add(item);
}

class ListBoxItem
{
public bool isNew;
public string Content;

public override string ToString()
{
return Content;
}

}
حالا مثلا ForEach بذار هر 10 ثانیه حدیدارو پیدا کن،isNew اشون رو False کن.

skmr_ae
سه شنبه 26 آذر 1392, 08:17 صبح
سلام
من هم مقایسه دو تا لیست باکس رو میخوام بدونم
چطور میشه ایتم هایی که در هر دو لیست نیست (تکراری ها رو نشون نداد)رو نشون داد
ممنون

skmr_ae
سه شنبه 26 آذر 1392, 08:20 صبح
اقای abbas.oveissi (http://barnamenevis.org/member.php?174698-abbas.oveissi) نمیشه کد بدید؟؟؟
سپاس

abbas.oveissi
سه شنبه 26 آذر 1392, 08:26 صبح
اقای abbas.oveissi (http://barnamenevis.org/member.php?174698-abbas.oveissi) نمیشه کد بدید؟؟؟
سپاس
اضافه کردم به جواب بالا.

abbas.oveissi
سه شنبه 26 آذر 1392, 08:33 صبح
سلام
من هم مقایسه دو تا لیست باکس رو میخوام بدونم
چطور میشه ایتم هایی که در هر دو لیست نیست (تکراری ها رو نشون نداد)رو نشون داد
ممنون

سلام ، من نمیدونم تعداد آیتم های لیست باکستون زیاده یا کم ، اما ساده ترین راهی که من به ذهنم میرسه و مرتبه زمانی الگوریتمش N^2 هست اینه که دو تا حلقه ی تو در تو داشته باشید.به ازای لیست باکس اول تمام دومی رو بگردین و اگر تکراری بود جفتشو پاک کنین.

ghamgin
چهارشنبه 27 آذر 1392, 08:50 صبح
سلام ، من نمیدونم تعداد آیتم های لیست باکستون زیاده یا کم ، اما ساده ترین راهی که من به ذهنم میرسه و مرتبه زمانی الگوریتمش N^2 هست اینه که دو تا حلقه ی تو در تو داشته باشید.به ازای لیست باکس اول تمام دومی رو بگردین و اگر تکراری بود جفتشو پاک کنین.
سلام
ممنون جناب abbas.oveissi
اما من لیستم در فرم لود از یک فایل یکباره هر ده ثانیه کد میشه
چطور کد شما رو براش استفاده کنم
اینکه شما گفتید ایتم برابر a
من که ایتم های جدید رو نمیدونم
ممنون میشم کمک کنید

درباره
سوال اقا/خانم skmr_ae اطلاعی ندارید؟(خواهش می کنم اگه نمونه ای هر چند ساده دارید بذارید یا کد..)
فکنم سوالشون بدردم میخوره(با دو تا لیست کارم شاید بشه)
بازم تشکر

مهرداد صفا
چهارشنبه 27 آذر 1392, 12:08 عصر
با سلام.
- یک لیست در سطح کلاس برای نگهداری آخرین آیتمها تعریف کنید.
- داخل تایمر با استفاده از متود Except آیتمهای جدید و آیتمهای حذف شده را به دست بیاورید.
- لیست آخرین آیتمها را آپدیت کنید.
دقت کنید که
Listbox1.Cast<object>().Except(LastItems) لیست آیتمهای حذف شده را بر میگرداند و برای آیتمهای اضافه شده باید برعکس عمل کنید.

abbas.oveissi
چهارشنبه 27 آذر 1392, 15:28 عصر
سلام
ممنون جناب abbas.oveissi
اما من لیستم در فرم لود از یک فایل یکباره هر ده ثانیه کد میشه
چطور کد شما رو براش استفاده کنم
اینکه شما گفتید ایتم برابر a
من که ایتم های جدید رو نمیدونم
ممنون میشم کمک کنید

درباره
سوال اقا/خانم skmr_ae اطلاعی ندارید؟(خواهش می کنم اگه نمونه ای هر چند ساده دارید بذارید یا کد..)
فکنم سوالشون بدردم میخوره(با دو تا لیست کارم شاید بشه)
بازم تشکر

اون a رو به عنوان نمونه نوشته بودم که ببینید طرز کار این کلاس چه شکلی هست.بعد شما بالاخره دارید یه جا item هارو به لیست باکس اضافه میکنید،اونجا موقع اضافه کردن خاصیت isNew رو True کنید.
البته آقای مهرداد صفا یه خط کد گذاشتن که اگر استفاده کنید ،فکرکنم خیلی بهتر باشه تا اینکه خودتون رو درگیر این راه من بکنید.اگر نشد بعدا بیاید راه حل منو تست کنید.

skmr_ae
چهارشنبه 27 آذر 1392, 15:34 عصر
سلام ، من نمیدونم تعداد آیتم های لیست باکستون زیاده یا کم ، اما ساده ترین راهی که من به ذهنم میرسه و مرتبه زمانی الگوریتمش N^2 هست اینه که دو تا حلقه ی تو در تو داشته باشید.به ازای لیست باکس اول تمام دومی رو بگردین و اگر تکراری بود جفتشو پاک کنین.

سلام
ممنون
دارم روش کار میکنم
اما توی دستورات فورایچ خطا میده

foreach (string str2 in listbox2)
{
String temp=str2.Items.TosTring();

foreach (string str in listbox1)
{
if (str.items=="temp")

{
Textbox1.Text=listbox.Items.ToString();
}
}
میشه یه نمونه از دوتا فورایچ تو در تو برا مقایسه هر ایتم لیست اول با تمام ایتم لیست دوم بذارید
ممنون

ghamgin
چهارشنبه 27 آذر 1392, 15:57 عصر
با سلام.
- یک لیست در سطح کلاس برای نگهداری آخرین آیتمها تعریف کنید.
- داخل تایمر با استفاده از متود Except آیتمهای جدید و آیتمهای حذف شده را به دست بیاورید.
- لیست آخرین آیتمها را آپدیت کنید.
دقت کنید که
Listbox1.Cast<object>().Except(LastItems) لیست آیتمهای حذف شده را بر میگرداند و برای آیتمهای اضافه شده باید برعکس عمل کنید.


سلام
جناب
مهرداد صفا
ممنونم
خیلی راه حلتون عالیه
اما خیلی سطح بالاست
من اطلاعی از این روش ندارم
خواهش میکنم بیستر راهنمایی کند
ممنون
یعنی چی یه کلاس برای ایتم های جدید
من که گفتم لیست یکباره با ایتمهای جدید و قدیم پر میشه..
؟؟؟؟

abbas.oveissi
چهارشنبه 27 آذر 1392, 15:58 عصر
بفرمایید :
for (int i = listBox1.Items.Count-1; i >= 0; i--) //peymayesh rooye listbox e aval
{
string item1 = listBox1.Items[i].ToString();
for (int j = listBox2.Items.Count - 1; j >= 0; j--) //peymayesh rooye listbox e dovom
{
string item2 = listBox2.Items[j].ToString();
if (item1 == item2)//agar item haa mosavii bood,az har 2 listbox pakeshoon mikone
{
listBox1.Items.RemoveAt(i);
listBox2.Items.RemoveAt(j);
break;
}
}
}

مهرداد صفا
چهارشنبه 27 آذر 1392, 16:15 عصر
سلام
جناب
مهرداد صفا
ممنونم
خیلی راه حلتون عالیه
اما خیلی سطح بالاست
من اطلاعی از این روش ندارم
خواهش میکنم بیستر راهنمایی کند
ممنون
یعنی چی یه کلاس برای ایتم های جدید
من که گفتم لیست یکباره با ایتمهای جدید و قدیم پر میشه..
؟؟؟؟

خواهش می کنم.
ببینید شما یک لیست و یا آرایه به صورت سراسری و در سطح کلاس تعریف می کنید و در هر ده ثانیه تمام آیتمها را وارد این آرایه می کنید؛ فقط قبل از این کار اعضای آرایه (که در واقع آیتمهای ده ثانیه پیش هستند) را با آیتمهای حال حاضر listBox مقایسه می کنید و ...
متود Except کار مقایسه بین دو IEnumerable<t> (لیست و یا آرایه) را انجام می دهد و لیستی از آیتمهای آرایه اول که در آرایه دوم موجود نیست را بر می گرداند.
برای مثال:


//بسم الله الرحمن الرحیم
// اللهم صل علی محمد و آل محمد
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
private List<object> LastItems = new List<object>();
public Form1()
{
InitializeComponent();
timer1.Interval = 10000;
timer1.Start();
}

private void timer1_Tick(object sender, EventArgs e)
{
var NewItems = listBox1.Items.Cast<object>().Except(LastItems).ToList();
var RemovedItems = LastItems.Except(listBox1.Items.Cast<object>()).ToList();
LastItems = listBox1.Items.Cast<object>().ToList();
}


}
}

ghamgin
پنج شنبه 28 آذر 1392, 16:48 عصر
سلام
دوستان
ضمن تشکر از راهنمایی های جناب صفا وabbas.oveissi
من راه حل اقای صفا رو انجام دادم
اما برا نمایش ایتم های جدید در لیست دوم هیچ ایتمی در لیست دوم نمایش نداد(lastitem رو نشون نداد)نمیدونم ایراد کارم کجاست
private void timer1_Tick(object sender, EventArgs e)
{
var NewItems = lbSecondTableColumns.Items.Cast<object>().Except(LastItems).ToList();
var dd = LastItems.Except(lbSecondTableColumns.Items.Cast<object>()).ToList();
listBox3.Items.Add(dd.ToString());
LastItems = lbSecondTableColumns.Items.Cast<object>().ToList();
//listBoxresult.Items.Add(LastItems.ToString());

}

abbas.oveissiو طبق گفته اقای
برا مقایسه ایتم دو لیست اون کد ارائه شد اشتباهه که بخوایم تک تک عناصر یک لیست رو با همه عناصر لیست دو مقایسه کنید این جوری
عناصر تکراری یکبار با هم برابر و به اندازه عناصر لیست دوم برابر نیستن که برا نمایش همه رو نشون میده
(فکر می کنم کد غلط نیست ایده غلطه)
من این کد رو برا نمایش ایتم های غیر تکراری دو لیست نوشتم
int i = 0;
int a=lbFirstTableColumns.Items.Count - 1;
int b = lbSecondTableColumns.Items.Count - 1;
while(i<=a || i<=b)
{

string item1 = lbFirstTableColumns.Items[i].ToString();
string item2 = lbSecondTableColumns.Items[i].ToString();
if (item1 != item2)
{
listBox3.Items.Add(item1);
}
i++;
}
اما اگر لیست دوم ایتم های بیشتری نسبت به لیست اول داشته باشه
روی ایندکس خطا میده
باید چکار کنم که مقایسه در صورت نا برابری تعداد عناصر ها و مکان هاشون (مثلا عناصر هم نام در مکان 3 لیست اول و 5 لیست دوم)جواب بده؟؟
ممنون میشم دوستان عزیز راهنمایی بفرمایند
تشکر

abbas.oveissi
جمعه 29 آذر 1392, 01:14 صبح
خواهش،کمکی هنوز نکردم :لبخند:
من نفهمیدم مشکل کد من چی بوده ، البته من با این پیشفرض اینو نوشتم که توی هر لیست باکس دیگه تکراری نباشه ، مثلا اینجوری : ListBox2 = b , c , dListBox1 = a , b , c
حالا با این کد b و c از هر دو لیست باکس حذف میشن. البته کد آقای صفا که خیلی بهتره،من تازه یادگرفتمش :لبخند:
راستی کدهاتو لطفا توی تگ CSHARP بذار که درست نمایش داده بشه،اینجوری سخته فهمیدنش

مهرداد صفا
جمعه 29 آذر 1392, 10:19 صبح
سلام
دوستان
ضمن تشکر از راهنمایی های جناب صفا وabbas.oveissi
من راه حل اقای صفا رو انجام دادم
اما برا نمایش ایتم های جدید در لیست دوم هیچ ایتمی در لیست دوم نمایش نداد(lastitem رو نشون نداد)نمیدونم ایراد کارم کجاست

private void timer1_Tick(object sender, EventArgs e)
{
var NewItems = lbSecondTableColumns.Items.Cast<object>().Except(LastItems).ToList();
var dd = LastItems.Except(lbSecondTableColumns.Items.Cast<object>()).ToList();
listBox3.Items.Add(dd.ToString());
LastItems = lbSecondTableColumns.Items.Cast<object>().ToList();
//listBoxresult.Items.Add(LastItems.ToString());

}


سلام.
نتیجه یک لیست از آیتمهاست که برای اضافه کردنش باید از متود AddRange استفاده کنید. به این صورت:



MyListBox.Items.AddRange(NewItems.ToArray());
//or
MyListBox.DataSource=NewItems;

ghamgin
شنبه 30 آذر 1392, 08:15 صبح
سلام.
نتیجه یک لیست از آیتمهاست که برای اضافه کردنش باید از متود AddRange استفاده کنید. به این صورت:



MyListBox.Items.AddRange(NewItems.ToArray());
//or
MyListBox.DataSource=NewItems;

سلام
اقای صفا بازم ممنون
کدتون رو امتحان کردم اما
اون چیزی که میخواستم نبود
این کد وقتی که به محتوای لیست جاری با ایتم های فعلی یک سری ایتم اضاف بشه رو نشون میده
مثلا اگر در لیست این ایتم ها باشه
مرغ
جوجه
طاووس
کبک
و ما به این ایتم ها این موارد رو اضاف کنیم
مرغ
شترمرغ
طاووس
..
با اجرای کدتون مرغ و شتر مرغ و طاووس رو نمایش میده (یعنی اینهایی که جدید درج شدن)
این درست
اما من میخوام فقط شتر مرغ رو نشون بده و طاووس و مرغ رو که با ایتم های قبل تکراری اند رو نشون نده ممنون میشم راهنمایی بفرمایید
(در ضمن لیست هربار پاک میشه و ایتم های جدید در اون درج میشن
یعنی ایتم جدید به قبلی ها اضاف نمیشه)
با تشکر