PDA

View Full Version : سوال: شمردن و ذخیره مقدارهای کنترل های داینامیک



shahryars
دوشنبه 09 فروردین 1395, 10:25 صبح
:قلب: سلام عرض میکنمن خدمت اعضای خوب این انجمن



من یه برنامه نوشتم که با کلیک بر روی یک button ، دکمه های جدید ساخته میشه و در loctaton:(1,1) به نمایش در میاد به صورت داینامیک.
اینم رو هم نوشتم که کاربر با درگ کردن هر دکمه میتونه اونو حرکت بده.
حالا اینا به کنار.


من چه جوری باید یه برنامه بنویسم که مقدار تکست همه دکمه ها که کاربر اضافه میکنه خوانده بشه و پشت سر هم در یک رشته ذخیره بشه؟
ممنون میشم کدش رو بدید.
:اشتباه: توجه : ما نمیدونیم که کاربر چند تا دکمه اضافه میکنه

CsharpNevisi
دوشنبه 09 فروردین 1395, 16:46 عصر
string res = "";
foreach(Control ctn in this.Controls)
{
if(ctn is Button)
{
Button btn = ((Button)ctn);
res += btn.Text + "|";
}
}
MessageBox.Show(res);

shahryars
دوشنبه 09 فروردین 1395, 16:53 عصر
string res = "";
foreach(Control ctn in this.Controls)
{
if(ctn is Button)
{
Button btn = ((Button)ctn);
res += btn.Text + "|";
}
}
MessageBox.Show(res);

کد ها کاملا درست کا کرد ممنونم.
من این دستورات رو بلد نیستم. میشه یکم توضیح بیشتر بدید راجع به عمل دستورات؟ یا بگید چی سرچ کنم؟ خییلی ممنونم:قلب:

CsharpNevisi
دوشنبه 09 فروردین 1395, 17:10 عصر
ببین تو هرچی که رو فرمت میندازی مثل تکست باکس .. باتن .. چک باکس و ... درواقع داری یه کنترل رو فرم میندازی
من یه کنترل با نام ctn درست کردم و از طریق اون داخل کنترل های فرم پیمایش انجام دادم .. :)

shahryars
دوشنبه 09 فروردین 1395, 17:19 عصر
یک سوال دیگه هم دارم خدمتتون همینجا بپرسم دیگه تایپینگ ایجاد نکنم.
من یک numberupdown دارم توی فرمم و یک دکمه که باهاش دکمه داینامیک میسازم.
با این numberupdown مقدار X یا Y رو میخوام تغییر بدم.
میخوام وقتی روی یک دکمه داینامیک کلیک کردم ، این دکمه شناسایی بشه و با بالا و پایین کردن Numberupdown مقدار اون یک دکمه تغییر کنه و با فشار دادن دکمه Esc هیچ دکمه ای در حالت انتخاب نباشه که با numberupdown جابجا بشه.
سوالم اینه که چجوری اون دکمه که کلیک میشه رو شناسایی کنم؟
با متغیر ها میشه؟
با چه دستوری؟

Felony
سه شنبه 10 فروردین 1395, 02:28 صبح
به وسیله خصیصه ActiveControl شی Container تون .

this.ActiveControl

بررسی میکنید که شی انتخاب شده دکمه هست یا نه و ادامه کار ...

khokhan
سه شنبه 10 فروردین 1395, 04:20 صبح
به وسیله خصیصه ActiveControl شی Container تون .

this.ActiveControl

بررسی میکنید که شی انتخاب شده دکمه هست یا نه و ادامه کار ...

پیشنهاد من اینه که توی حلقه ای که دکمه های دینامیک ایجاد می شن رویداد کلیک برای هر دکمه هم تعریف بشه
و برای اینکه دکمه انتخابی موقع تغییر مقدار numberupdown مشخص بشه از تگ کنترل کمک بگیرین و البته یه متغییر از نوع int هم بایستی داشته باشین تا مقدار تگ ها رو براتون نگه داری کنه
private int ctrID = 0;
private void createButton()
{
for (int i = 0; i < 5; i++)
{
Button btn = new Button();

btn.Tag = i;
btn.Location = new Point( i, i);
btn.Text = "btn"+i;
btn.Click += (sender, e) =>
{
ctrID = -1;
numericUpDown1.Value = 0;
numericUpDown1.Enabled = true;
ctrID =(int)btn.Tag;
};
panel1.Controls.Add(btn);

}
}

برای دکمه Esc روی فرم مربوطه ابتدا خاصیت KeyPreview رو در پراپرتی فرم true کنید
و بعد در رویدادKeyPress بنویسن:

private void Form1_KeyPress(object sender, KeyPressEventArgs e)
{

if (e.KeyChar == (char)27)
{
numericUpDown1.Value = 0;
}

}

نمونه رو ضمیمه کردم تا متوجه منظورم بشین

shahryars
سه شنبه 10 فروردین 1395, 05:12 صبح
پیشنهاد من اینه که توی حلقه ای که دکمه های دینامیک ایجاد می شن رویداد کلیک برای هر دکمه هم تعریف بشه
و برای اینکه دکمه انتخابی موقع تغییر مقدار numberupdown مشخص بشه از تگ کنترل کمک بگیرین و البته یه متغییر از نوع int هم بایستی داشته باشین تا مقدار تگ ها رو براتون نگه داری کنه
private int ctrID = 0;
private void createButton()
{
for (int i = 0; i < 5; i++)
{
Button btn = new Button();

btn.Tag = i;
btn.Location = new Point( i, i);
btn.Text = "btn"+i;
btn.Click += (sender, e) =>
{
ctrID = -1;
numericUpDown1.Value = 0;
numericUpDown1.Enabled = true;
ctrID =(int)btn.Tag;
};
panel1.Controls.Add(btn);

}
}

برای دکمه Esc روی فرم مربوطه ابتدا خاصیت KeyPreview رو در پراپرتی فرم true کنید
و بعد در رویدادKeyPress بنویسن:

private void Form1_KeyPress(object sender, KeyPressEventArgs e)
{

if (e.KeyChar == (char)27)
{
numericUpDown1.Value = 0;
}

}

نمونه رو ضمیمه کردم تا متوجه منظورم بشین
_____________
بله دقیقا همینجوری میخوام ولی این فایل ضمیمه شما یه مشکلی داره.
وقتی که دو بار کلید افزودن دکمه رو میزنیم ، بعد یکی از دکمه های اضافه شده رو تغییر میدیم ، مقدار دو تا از دکمه های اضافه شده تغییر میکنه
این مشکل چجوری حل میشه؟

khokhan
سه شنبه 10 فروردین 1395, 05:28 صبح
_____________
بله دقیقا همینجوری میخوام ولی این فایل ضمیمه شما یه مشکلی داره.
وقتی که دو بار کلید افزودن دکمه رو میزنیم ، بعد یکی از دکمه های اضافه شده رو تغییر میدیم ، مقدار دو تا از دکمه های اضافه شده تغییر میکنه
این مشکل چجوری حل میشه؟


یا بایستی آمار دقیق کنترلهای افزوده شده رو داشته باشین :لبخند: و تگ هارو براساس اون شماره گزاری کنین ولی این کاردردسرش زیاده
بهتره هربار کنترلها پاک و از نو ایجاد بشه

CsharpNevisi
سه شنبه 10 فروردین 1395, 06:36 صبح
بله دقیقا همینجوری میخوام ولی این فایل ضمیمه شما یه مشکلی داره.وقتی که دو بار کلید افزودن دکمه رو میزنیم ، بعد یکی از دکمه های اضافه شده رو تغییر میدیم ، مقدار دو تا از دکمه های اضافه شده تغییر میکنه
این مشکل چجوری حل میشه؟

من یکی دوتا تغییر کوچیک تو کدهای اقای خوخان عزیز دادم ..
نگا کنی میفهمی

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 Dinamic
{
public partial class Form1 : Form
{

public Form1()
{
InitializeComponent();
numericUpDown1.Enabled = false;

}

private int ctrID = 0;
private static int lastID = 0;


private void createButton()
{
int len = lastID;
for (int i = len; i < len + 5; i++)
{
Button btn = new Button();
btn.Name = "btn1";
btn.Tag = i;
btn.Location = new Point(i, i);
btn.Text = "btn" + i;
btn.Click += (sender, e) =>
{
ctrID = -1;
numericUpDown1.Value = 0;
numericUpDown1.Enabled = true;
ctrID = (int)btn.Tag;
};
panel1.Controls.Add(btn);
lastID++;
}
}
private void button1_Click(object sender, EventArgs e)
{
createButton();
}


private void numericUpDown1_ValueChanged(object sender, EventArgs e)
{


foreach (Control ctn in this.panel1.Controls)
{
var tagID = (int)ctn.Tag;
if (tagID == ctrID )
{
ctn.Text = numericUpDown1.Value.ToString();
}
}
}



private void Form1_KeyPress(object sender, KeyPressEventArgs e)
{
ctrID = -1;

if (e.KeyChar == (char)27)
{
numericUpDown1.Value = 0;
}


}
}
}

shahryars
سه شنبه 10 فروردین 1395, 07:30 صبح
تشکر تشکر از همه دوستان. شرمنده:خجالت:
درباره این پروژه سوالاتی هست باز که انشالاه در آینده از استادان گرامی میپرسم.
پروژم که تموم شد سورسش رو میزارم برای دوستان

shahryars
سه شنبه 10 فروردین 1395, 10:04 صبح
ببخشید میشه این تکه از کد رو بازبینی کنید؟
توی فرم خودم وقتی numberupdown رو تغییر میدم ارور میده

private void numericUpDown1_ValueChanged(object sender, EventArgs e) {


foreach (Control ctn in this.panel1.Controls)
{
var tagID = (int)ctn.Tag;
if (tagID == ctrID)
{
ctn.Text = numericUpDown1.Value.ToString();
}
}
}

ارور رو ضمیمه کردم

CsharpNevisi
سه شنبه 10 فروردین 1395, 13:41 عصر
مشکل به کنترلی هست که تگ نداره .. عوض اینو تگو آی.دی بازی بهتره که خود کنترل رو تو یه شی از جنس باتن نگه داری

shahryars
سه شنبه 10 فروردین 1395, 14:21 عصر
مشکل به کنترلی هست که تگ نداره ..

تگ که توی createButton() براش تعریف کردیم:
btn.Tag = i;
چجوری مشکلو حل کنم؟
___________


عوض اینو تگو آی.دی بازی بهتره که خود کنترل رو تو یه شی از جنس باتن نگه داری

منظورتونو نفهمیدم. چجوری این کارو بکنیم؟

ببخشیدا هی وقتتونو میگیرم

ژیار رحیمی
سه شنبه 10 فروردین 1395, 14:24 عصر
دوست گرامی کد رو بصورت زیر اصلاح کن.شما بجز کنترل های از نوع Button کنترل های دیگه یی در پانل قرار دادی شما باید کنترل های داخل پانل رو فیلتر کرده که از نوع Button باشند.

private void numericUpDown1_ValueChanged(object sender, EventArgs e)
{
foreach (Control ctn in this.panel1.Controls.OfType<Button>())
{
var tagID = (int)ctn.Tag;
if (tagID == ctrID )
{
ctn.Text = numericUpDown1.Value.ToString();
}
}
}

shahryars
سه شنبه 10 فروردین 1395, 14:43 عصر
مشکل حل شد دوستان ممنون از همه خیلی زحمتتون دادم خصوصا آقای خوخان که توی خصوصی دلیل این مشکل رو فرستادند.:قلب:
دلیل این بود که یک دکمه از قبل ساخته شده دیگه توی panel4م بود.
بازم مشکلی توی این پروژه بود مطرح میکنم توی تایپینگ جدید. دیگه ببخشید
ممنون از آقای رحیمی و آقای CsharpNevisi:تشویق:

CsharpNevisi
سه شنبه 10 فروردین 1395, 16:11 عصر
عه .. من تازه کد نوشته بودم :(((((((((

حالا میزارم خواستی ببین

shahryars
سه شنبه 10 فروردین 1395, 16:48 عصر
عه .. من تازه کد نوشته بودم :(((((((((

حالا میزارم خواستی ببین

:متعجب: چه سیستم جالبی استفاده کردید!
کدامو عوض کردم:قهقهه:
خیلی خیلی ببخشید بابت زحمتایی که دادم

shahryars
سه شنبه 10 فروردین 1395, 17:17 عصر
ببخشید فقط این دکمه ها رو که اضافه میکنیم. با چه کدی توی کداتون دکمه بعدی مکانش عوض میشه و میره سمت راست تر؟؟؟
به جای flowLayoutPanel نمیشه از پنل استفاده کرد؟

khokhan
سه شنبه 10 فروردین 1395, 18:05 عصر
عه .. من تازه کد نوشته بودم :(((((((((

حالا میزارم خواستی ببین

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

CsharpNevisi
چهارشنبه 11 فروردین 1395, 01:07 صبح
ایده خوبیه اما به نظر می اد محدودیت ایجاد می کنه یعنی اگه بخوای توی فرم رنگ بندی کنی وتغییراتی در رنگها ایجاد کنی دست و پا گیر می شه
اما خاصیت تگ معمولا از نظر برنامه نویسها دور می مونه و در یه همچی مواقعی کمک حالشون می شه:لبخند:

سلام حالتون خوبه ... منظورتونو نفهمیدم :لبخند:

CsharpNevisi
چهارشنبه 11 فروردین 1395, 01:07 صبح
ببخشید فقط این دکمه ها رو که اضافه میکنیم. با چه کدی توی کداتون دکمه بعدی مکانش عوض میشه و میره سمت راست تر؟؟؟
به جای flowLayoutPanel نمیشه از پنل استفاده کرد؟

flowLayoutPanel کارش همینه