شمردن و ذخیره مقدارهای کنترل های داینامیک
:قلب: سلام عرض میکنمن خدمت اعضای خوب این انجمن
من یه برنامه نوشتم که با کلیک بر روی یک button ، دکمه های جدید ساخته میشه و در loctaton:(1,1) به نمایش در میاد به صورت داینامیک.
اینم رو هم نوشتم که کاربر با درگ کردن هر دکمه میتونه اونو حرکت بده.
حالا اینا به کنار.
من چه جوری باید یه برنامه بنویسم که مقدار تکست همه دکمه ها که کاربر اضافه میکنه خوانده بشه و پشت سر هم در یک رشته ذخیره بشه؟
ممنون میشم کدش رو بدید.
:اشتباه: توجه : ما نمیدونیم که کاربر چند تا دکمه اضافه میکنه
نقل قول: شمردن و ذخیره مقدار های کنترل های داینامیک
string res = "";
foreach(Control ctn in this.Controls)
{
if(ctn is Button)
{
Button btn = ((Button)ctn);
res += btn.Text + "|";
}
}
MessageBox.Show(res);
نقل قول: شمردن و ذخیره مقدار های کنترل های داینامیک
نقل قول:
نوشته شده توسط
CsharpNevisi
string res = "";
foreach(Control ctn in this.Controls)
{
if(ctn is Button)
{
Button btn = ((Button)ctn);
res += btn.Text + "|";
}
}
MessageBox.Show(res);
کد ها کاملا درست کا کرد ممنونم.
من این دستورات رو بلد نیستم. میشه یکم توضیح بیشتر بدید راجع به عمل دستورات؟ یا بگید چی سرچ کنم؟ خییلی ممنونم:قلب:
نقل قول: شمردن و ذخیره مقدار های کنترل های داینامیک
ببین تو هرچی که رو فرمت میندازی مثل تکست باکس .. باتن .. چک باکس و ... درواقع داری یه کنترل رو فرم میندازی
من یه کنترل با نام ctn درست کردم و از طریق اون داخل کنترل های فرم پیمایش انجام دادم .. :)
نقل قول: شمردن و ذخیره مقدار های کنترل های داینامیک
یک سوال دیگه هم دارم خدمتتون همینجا بپرسم دیگه تایپینگ ایجاد نکنم.
من یک numberupdown دارم توی فرمم و یک دکمه که باهاش دکمه داینامیک میسازم.
با این numberupdown مقدار X یا Y رو میخوام تغییر بدم.
میخوام وقتی روی یک دکمه داینامیک کلیک کردم ، این دکمه شناسایی بشه و با بالا و پایین کردن Numberupdown مقدار اون یک دکمه تغییر کنه و با فشار دادن دکمه Esc هیچ دکمه ای در حالت انتخاب نباشه که با numberupdown جابجا بشه.
سوالم اینه که چجوری اون دکمه که کلیک میشه رو شناسایی کنم؟
با متغیر ها میشه؟
با چه دستوری؟
نقل قول: شمردن و ذخیره مقدار های کنترل های داینامیک
به وسیله خصیصه ActiveControl شی Container تون .
this.ActiveControl
بررسی میکنید که شی انتخاب شده دکمه هست یا نه و ادامه کار ...
1 ضمیمه
نقل قول: شمردن و ذخیره مقدار های کنترل های داینامیک
نقل قول:
نوشته شده توسط
مجتبی تاجیک
به وسیله خصیصه 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;
}
}
نمونه رو ضمیمه کردم تا متوجه منظورم بشین
نقل قول: شمردن و ذخیره مقدار های کنترل های داینامیک
نقل قول:
نوشته شده توسط
khokhan
پیشنهاد من اینه که توی حلقه ای که دکمه های دینامیک ایجاد می شن رویداد کلیک برای هر دکمه هم تعریف بشه
و برای اینکه دکمه انتخابی موقع تغییر مقدار 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
_____________
بله دقیقا همینجوری میخوام ولی این فایل ضمیمه شما یه مشکلی داره.
وقتی که دو بار کلید افزودن دکمه رو میزنیم ، بعد یکی از دکمه های اضافه شده رو تغییر میدیم ، مقدار دو تا از دکمه های اضافه شده تغییر میکنه
این مشکل چجوری حل میشه؟
یا بایستی آمار دقیق کنترلهای افزوده شده رو داشته باشین :لبخند: و تگ هارو براساس اون شماره گزاری کنین ولی این کاردردسرش زیاده
بهتره هربار کنترلها پاک و از نو ایجاد بشه
نقل قول: شمردن و ذخیره مقدارهای کنترل های داینامیک
نقل قول:
بله دقیقا همینجوری میخوام ولی این فایل ضمیمه شما یه مشکلی داره.وقتی که دو بار کلید افزودن دکمه رو میزنیم ، بعد یکی از دکمه های اضافه شده رو تغییر میدیم ، مقدار دو تا از دکمه های اضافه شده تغییر میکنه
این مشکل چجوری حل میشه؟
من یکی دوتا تغییر کوچیک تو کدهای اقای خوخان عزیز دادم ..
نگا کنی میفهمی
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;
}
}
}
}
نقل قول: شمردن و ذخیره مقدارهای کنترل های داینامیک
تشکر تشکر از همه دوستان. شرمنده:خجالت:
درباره این پروژه سوالاتی هست باز که انشالاه در آینده از استادان گرامی میپرسم.
پروژم که تموم شد سورسش رو میزارم برای دوستان
1 ضمیمه
نقل قول: شمردن و ذخیره مقدارهای کنترل های داینامیک
ببخشید میشه این تکه از کد رو بازبینی کنید؟
توی فرم خودم وقتی 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
مشکل به کنترلی هست که تگ نداره ..
تگ که توی createButton() براش تعریف کردیم:
btn.Tag = i;
چجوری مشکلو حل کنم؟
___________
نقل قول:
عوض اینو تگو آی.دی بازی بهتره که خود کنترل رو تو یه شی از جنس باتن نگه داری
منظورتونو نفهمیدم. چجوری این کارو بکنیم؟
ببخشیدا هی وقتتونو میگیرم
نقل قول: شمردن و ذخیره مقدارهای کنترل های داینامیک
دوست گرامی کد رو بصورت زیر اصلاح کن.شما بجز کنترل های از نوع 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();
}
}
}
نقل قول: شمردن و ذخیره مقدارهای کنترل های داینامیک
مشکل حل شد دوستان ممنون از همه خیلی زحمتتون دادم خصوصا آقای خوخان که توی خصوصی دلیل این مشکل رو فرستادند.:قلب:
دلیل این بود که یک دکمه از قبل ساخته شده دیگه توی panel4م بود.
بازم مشکلی توی این پروژه بود مطرح میکنم توی تایپینگ جدید. دیگه ببخشید
ممنون از آقای رحیمی و آقای CsharpNevisi:تشویق:
1 ضمیمه
نقل قول: شمردن و ذخیره مقدارهای کنترل های داینامیک
عه .. من تازه کد نوشته بودم :(((((((((
حالا میزارم خواستی ببین
نقل قول: شمردن و ذخیره مقدارهای کنترل های داینامیک
نقل قول:
نوشته شده توسط
CsharpNevisi
عه .. من تازه کد نوشته بودم :(((((((((
حالا میزارم خواستی ببین
:متعجب: چه سیستم جالبی استفاده کردید!
کدامو عوض کردم:قهقهه:
خیلی خیلی ببخشید بابت زحمتایی که دادم
نقل قول: شمردن و ذخیره مقدارهای کنترل های داینامیک
ببخشید فقط این دکمه ها رو که اضافه میکنیم. با چه کدی توی کداتون دکمه بعدی مکانش عوض میشه و میره سمت راست تر؟؟؟
به جای flowLayoutPanel نمیشه از پنل استفاده کرد؟
نقل قول: شمردن و ذخیره مقدارهای کنترل های داینامیک
نقل قول:
نوشته شده توسط
CsharpNevisi
عه .. من تازه کد نوشته بودم :(((((((((
حالا میزارم خواستی ببین
ایده خوبیه اما به نظر می اد محدودیت ایجاد می کنه یعنی اگه بخوای توی فرم رنگ بندی کنی وتغییراتی در رنگها ایجاد کنی دست و پا گیر می شه
اما خاصیت تگ معمولا از نظر برنامه نویسها دور می مونه و در یه همچی مواقعی کمک حالشون می شه:لبخند:
نقل قول: شمردن و ذخیره مقدارهای کنترل های داینامیک
نقل قول:
نوشته شده توسط
khokhan
ایده خوبیه اما به نظر می اد محدودیت ایجاد می کنه یعنی اگه بخوای توی فرم رنگ بندی کنی وتغییراتی در رنگها ایجاد کنی دست و پا گیر می شه
اما خاصیت تگ معمولا از نظر برنامه نویسها دور می مونه و در یه همچی مواقعی کمک حالشون می شه:لبخند:
سلام حالتون خوبه ... منظورتونو نفهمیدم :لبخند:
نقل قول: شمردن و ذخیره مقدارهای کنترل های داینامیک
نقل قول:
نوشته شده توسط
shahryars
ببخشید فقط این دکمه ها رو که اضافه میکنیم. با چه کدی توی کداتون دکمه بعدی مکانش عوض میشه و میره سمت راست تر؟؟؟
به جای flowLayoutPanel نمیشه از پنل استفاده کرد؟
flowLayoutPanel کارش همینه