PDA

View Full Version : چک کردن n تا رادیوباتن داخل حلقه



csharpdoost
چهارشنبه 28 فروردین 1392, 14:01 عصر
توسط حلقه n تا رادیو باتن ساخته و روی گروپ باکس قرار میگیرد. (داخل هر گروپ باکس 4تا رادیوباتن تعریف میشه. همه بوسیله کد تعریف شده اند نه ویزاردی)حالا میخوام رادیو باتنهای هر گروپ باکس رو چک کنم و هر کدوم که انتخاب شده بود آن رو ذخیره کنم. لطفا راهنمایی بفرمایید

parand60
چهارشنبه 28 فروردین 1392, 14:09 عصر
احتمالا نمیخواین از IF استفاده کنید. چون اینطوری به راحتی میشه فهمید کدوم radio انتخاب شده

amir_pro
چهارشنبه 28 فروردین 1392, 14:11 عصر
ببین اگه از آرایه ای از رادیوباتن ها استفاده کنی برای تعریفشون دسترسیت هم راحت تره. خوب یه راه دیگش نامی هست که به این رادیوباتنها برای ساختشون میدی موقع کدنویسی از اون استفاده کن

csharpdoost
چهارشنبه 28 فروردین 1392, 14:32 عصر
احتمالا نمیخواین از IF استفاده کنید. چون اینطوری به راحتی میشه فهمید کدوم radio انتخاب شده
چطوری؟ داخل حلقه رادیوباتنnew میشه و بهش اسم و مشخصات دیگه هم میدم. ولی بعدا که کاربر هر کدوم رو انتخای میکنه و دکه ثبت رو میزنه رادیو باتنها نشون داده نمیشن. گرچه اولش public هم تعریف کردم.

csharpdoost
چهارشنبه 28 فروردین 1392, 14:34 عصر
ببین اگه از آرایه ای از رادیوباتن ها استفاده کنی برای تعریفشون دسترسیت هم راحت تره. خوب یه راه دیگش نامی هست که به این رادیوباتنها برای ساختشون میدی موقع کدنویسی از اون استفاده کن

اتفاقا بهشون اسم هم میدم. این هم نمونه کدش:

for (int t = 1; t < tedadQes; t++)
{
ylbl += 100;
GroupBox grp = new GroupBox();
grp.Text = grpstr + t;
grp.Name = grpstr + t;
grp.Size = new Size(700,95);
//grp.AutoSize = true;
grp.Location = new Point( 5, ylbl-5);


Label lbl = new Label();
lbl.Text = "lbljjjj" + t;
lbl.Name = "lbllll" + t;
lbl.Size = new Size(50, 20);
lbl.AutoSize = true;
lbl.Location = new Point(5, 25);
this.Controls.Add(lbl);
lbl.Visible = true;



ych1 += 100;
RadioButton radiobatn1 = new RadioButton();
radiobatn1.Text = "radiobatn" + t;
radiobatn1.Name = "radiobatn" + t;
radiobatn1.Size = new Size(50, 20);
radiobatn1.AutoSize = true;
radiobatn1.Location = new Point(20, 50);
this.Controls.Add(radiobatn1);
radiobatn1.Visible = true;

group45
چهارشنبه 28 فروردین 1392, 19:20 عصر
با سلام
بازی پازل که میشه پست 886 از لینک زیر رو دانلود کنید توش این چیزی که میخواید استفاده شده

http://barnamenevis.org/showthread.php?64210-%D9%86%D9%85%D9%88%D9%86%D9%87-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%87%D8%A7%DB%8C-%DA%A9%D9%88%DA%86%DA%A9-%D9%88-%D9%85%D9%81%D9%8A%D8%AF-%D8%AF%D8%B1-%D8%B3%D9%8A-%D8%B4%D8%A7%D8%B1%D9%BE/page23

gholami146
چهارشنبه 28 فروردین 1392, 19:27 عصر
سلام دوست عزیز
شما باید از خواص اشیاء استفاده کنید
باید تابعی بنویسید که مثلا در رویداد آن کلیک باتون ها تون تعریف بشه و زمانی که کلید فشار داده و یا هرچی ... بشه اون تابع فراخوانی بشه
و نوع ارسالی رو با Tobject بررسی کنید که اگر فرستنده از کلاس باتون باشه خوب خاصیت نامش رو واکشی کنید بهمین سادگی
البته باید بگم من دلفی کار هستم و این موضوع رو با دلفی طراحی کردم
شما هم میتونید این عمل را با سی بسازید

var
Lab: Array[1..65] of TLabel;
.

.

.

.

.

.

.procedure CreatePiano;
var
k: Byte;
begin
for k:= 1 to 65 do Lab[k].Color:= Random(16777216) ;
end;

procedure TForm1.BarClick(Sender: TObject) ;
begin
Application.ProcessMessages;

with Sender as TLabel do
Windows.Beep(440 + (Color div 3500), 100) ;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
k: Byte;
begin
Randomize;
for k:= 1 to 65 do
begin
Lab[k]:= TLabel.Create(Self) ;
Lab[k].Parent := Self;
Lab[k].Left := 8 + 11*(k-1) ;
Lab[k].Color:= Random(16777216) ;
Lab[k].OnMouseEnter:= BarClick;
end;
end;

erfan_urchin
چهارشنبه 28 فروردین 1392, 19:43 عصر
اتفاقا بهشون اسم هم میدم. این هم نمونه کدش:

for (int t = 1; t < tedadQes; t++)
{
ylbl += 100;
GroupBox grp = new GroupBox();
grp.Text = grpstr + t;
grp.Name = grpstr + t;
grp.Size = new Size(700,95);
//grp.AutoSize = true;
grp.Location = new Point( 5, ylbl-5);


Label lbl = new Label();
lbl.Text = "lbljjjj" + t;
lbl.Name = "lbllll" + t;
lbl.Size = new Size(50, 20);
lbl.AutoSize = true;
lbl.Location = new Point(5, 25);
this.Controls.Add(lbl);
lbl.Visible = true;



ych1 += 100;
RadioButton radiobatn1 = new RadioButton();
radiobatn1.Text = "radiobatn" + t;
radiobatn1.Name = "radiobatn" + t;
radiobatn1.Size = new Size(50, 20);
radiobatn1.AutoSize = true;
radiobatn1.Location = new Point(20, 50);
this.Controls.Add(radiobatn1);
radiobatn1.Visible = true;



دوست عزیز اولا که location رادیو باتن هاتون کاملا اشتباهه و همه رو روی هم ایجاد میکنه. مثلا شما باید location رو به شکل زیر بنویسین تا روی هم دیگه ایجاد نکنه و زیر هم ایجاد کنه
radiobatn1.Location = new Point(20, 50+(t*15));
همچنین برای این که مثلا هرکدوم که توسط کاربر انتخاب شده بود، تکستش بره تو تکست باکس از کدزیر میتونین استفاده کنین
for (int t = 1; t < tedadQes; t++)
{
if (((RadioButton)(Controls["radiobatn" + t])).Checked == true)
textBox1.Text = Controls["radiobatn" + t].Text;
}
موفق باشی

csharpdoost
چهارشنبه 28 فروردین 1392, 21:34 عصر
دوست عزیز اولا که location رادیو باتن هاتون کاملا اشتباهه و همه رو روی هم ایجاد میکنه. مثلا شما باید location رو به شکل زیر بنویسین تا روی هم دیگه ایجاد نکنه و زیر هم ایجاد کنه
radiobatn1.Location = new Point(20, 50+(t*15));
همچنین برای این که مثلا هرکدوم که توسط کاربر انتخاب شده بود، تکستش بره تو تکست باکس از کدزیر میتونین استفاده کنین
for (int t = 1; t < tedadQes; t++)
{
if (((RadioButton)(Controls["radiobatn" + t])).Checked == true)
textBox1.Text = Controls["radiobatn" + t].Text;
}
موفق باشی

دوست عزیز اون کدها رو درست کردم(منظورم location) . ولی کد شما خطا میده :
این کل کد های بنده که اول ساخته میشه . بعد توسط کاربر ثبت میشه :

for (int t = 1; t < tedadQes; t++)
{

for (int j = 1; j <= 4; j++)
{
RadioButton radiobatn = new RadioButton();
radiobatn.Text = "radiobatn" + counradio;
radiobatn.Name = "radiobatn" + counradio;
radiobatn.Size = new Size(50, 20);
radiobatn.AutoSize = true;
if (j == 1)
radiobatn.Location = new Point(5, 50);
else if (j == 2)
radiobatn.Location = new Point(5, 70);
else if (j == 3)
radiobatn.Location = new Point(450, 50);
else if (j == 4)
radiobatn.Location = new Point(450, 70);

this.Controls.Add(radiobatn);
radiobatn.Visible = true;

grp.Controls.Add(radiobatn);

counradio++;
}

grp.Controls.Add(lbl);

this.Controls.Add(grp);
grp.Visible = true;




for (int t = 1; t <= (4*tedadQes); t++)
{

if (((RadioButton)(Controls["radiobatn" + t])).Checked == true)
{


}
}

روی همون if خطا میده. : Object reference not set to an instance of an object.

Mahmoud.Afrad
چهارشنبه 28 فروردین 1392, 22:46 عصر
چرا یک یوزرکنترل ایجاد نمیکنید؟ کافیه کنترلهای مورد نظر همراه رادیوباتن ها را روی یوزرکنترل قرار بدید. برای یوزرکنترل پراپرتی هایی تعریف کنید برای مقداردهی به کنترلها و همچنین تعیین اینکه کدوم رادیوباتن انتخاب شده(اگر آزمون گیر طراحی میکنید کاملا بدرد میخوره چون میشه انتخاب کاربر رو متوجه شد). در هنگام اضافه به فرم هم کافیه نمونه از یوزرکنترل ایجاد و سوال و چهار گزینه رو بهش بدید و به فرم اضافه کنید.

csharpdoost
چهارشنبه 28 فروردین 1392, 23:11 عصر
چرا یک یوزرکنترل ایجاد نمیکنید؟ کافیه کنترلهای مورد نظر همراه رادیوباتن ها را روی یوزرکنترل قرار بدید. برای یوزرکنترل پراپرتی هایی تعریف کنید برای مقداردهی به کنترلها و همچنین تعیین اینکه کدوم رادیوباتن انتخاب شده(اگر آزمون گیر طراحی میکنید کاملا بدرد میخوره چون میشه انتخاب کاربر رو متوجه شد). در هنگام اضافه به فرم هم کافیه نمونه از یوزرکنترل ایجاد و سوال و چهار گزینه رو بهش بدید و به فرم اضافه کنید.
ممنون از توجهتون ولی کارم تموم شده اگه این خطا رو رفع کنم دیگه توی اون قسمت برنامه کاری ندارم.

wolf_majid
چهارشنبه 28 فروردین 1392, 23:31 عصر
فکر کنم این کارت رو راه بندازه
private void SearchForSelectedRBtn(Control control,ref List<string> array)
{
foreach (Control ctrl in control.Controls)
{
SearchForSelectedRBtn(ctrl,ref array);
if (ctrl is RadioButton)
{
if((ctrl as RadioButton).Checked)
{
array.Add((ctrl as RadioButton).Name);
}
}
}
}

csharpdoost
پنج شنبه 29 فروردین 1392, 00:05 صبح
فکر کنم این کارت رو راه بندازه
private void SearchForSelectedRBtn(Control control,ref List<string> array)
{
foreach (Control ctrl in control.Controls)
{
SearchForSelectedRBtn(ctrl,ref array);
if (ctrl is RadioButton)
{
if((ctrl as RadioButton).Checked)
{
array.Add((ctrl as RadioButton).Name);
}
}
}
}
ممنون و زیاد از کدهاتون متوجه نمیشم. و نمیدونم چطوری ازش استفاده کنم.

csharpdoost
پنج شنبه 29 فروردین 1392, 00:18 صبح
با سلام
بازی پازل که میشه پست 886 از لینک زیر رو دانلود کنید توش این چیزی که میخواید استفاده شده

http://barnamenevis.org/showthread.php?64210-%D9%86%D9%85%D9%88%D9%86%D9%87-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%87%D8%A7%DB%8C-%DA%A9%D9%88%DA%86%DA%A9-%D9%88-%D9%85%D9%81%D9%8A%D8%AF-%D8%AF%D8%B1-%D8%B3%D9%8A-%D8%B4%D8%A7%D8%B1%D9%BE/page23
مشکل منو حل نکرد

Mahmoud.Afrad
پنج شنبه 29 فروردین 1392, 01:58 صبح
باید با یک حلقه گروپ باکسها رو بدست بیاری و با یک حلقه داخلی مقدار چک باکسها رو بخونی.
اگر با این کد گروپ باکس ایجاد کنی:

for (int t = 1; t < tedadQes; t++)
{
GroupBox grp = new GroupBox();
grp.Name = t.ToString();
grp.Size = new System.Drawing.Size(700, 100);
grp.Location = new Point(0, grp.Height * (t-1));
Label lbl = new Label() { Text = t.ToString() };
grp.Controls.Add(lbl);

for (int j = 1; j <= 4; j++)
{
RadioButton radiobatn = new RadioButton();
radiobatn.Text = "radiobatn" + j;
radiobatn.Name = j.ToString();
radiobatn.Size = new Size(50, 20);
radiobatn.AutoSize = true;
if (j == 1)
radiobatn.Location = new Point(5, 50);
else if (j == 2)
radiobatn.Location = new Point(5, 70);
else if (j == 3)
radiobatn.Location = new Point(450, 50);
else if (j == 4)
radiobatn.Location = new Point(450, 70);

grp.Controls.Add(radiobatn);
}

this.Controls.Add(grp);
}

با این کد میتونی جواب ها رو بدست بیاری:

class Answer
{
public string question;
public string answer;
}

List<Answer> answers = new List<Answer>();

private void button2_Click(object sender, EventArgs e)
{
answers.Clear();
foreach (Control c in this.Controls)
{
if (c is GroupBox)
{
Answer answer = new Answer();
answer.question = c.Name;

foreach (Control cc in c.Controls)
{
if (cc is RadioButton)
{
RadioButton rb = cc as RadioButton;
if (rb.Checked)
{
answer.answer = rb.Name;
}
}
}
answers.Add(answer);
}
}

foreach (Answer a in answers)
{
listBox1.Items.Add("question" + a.question + "\tanswer:" + a.answer);
}
}

erfan_urchin
پنج شنبه 29 فروردین 1392, 12:17 عصر
دوست عزیز اون کدها رو درست کردم(منظورم location) . ولی کد شما خطا میده :
این کل کد های بنده که اول ساخته میشه . بعد توسط کاربر ثبت میشه :

for (int t = 1; t < tedadQes; t++)
{

for (int j = 1; j <= 4; j++)
{
RadioButton radiobatn = new RadioButton();
radiobatn.Text = "radiobatn" + counradio;
radiobatn.Name = "radiobatn" + counradio;
radiobatn.Size = new Size(50, 20);
radiobatn.AutoSize = true;
if (j == 1)
radiobatn.Location = new Point(5, 50);
else if (j == 2)
radiobatn.Location = new Point(5, 70);
else if (j == 3)
radiobatn.Location = new Point(450, 50);
else if (j == 4)
radiobatn.Location = new Point(450, 70);

this.Controls.Add(radiobatn);
radiobatn.Visible = true;

grp.Controls.Add(radiobatn);

counradio++;
}

grp.Controls.Add(lbl);

this.Controls.Add(grp);
grp.Visible = true;




for (int t = 1; t <= (4*tedadQes); t++)
{

if (((RadioButton)(Controls["radiobatn" + t])).Checked == true)
{


}
}

روی همون if خطا میده. : Object reference not set to an instance of an object.

دوست عزیز این ارور برای اینه که مثلا شما 20 تا رادیو باتن درست کردین ولی دارین تا 21 امین رادیو باتن رو چک میکنین که علامت خورده یا نه به خاطر همین وقتی میرسه به رادیو باتن 21 این ارور میاد
این ارور میگه همچین کنترلی (مثلا رادیو باتن 21) وجود نداره
شما ببینید چندتا رادیو باتن ایجاد کردین به همون تعداد هم توی حلقه چک کنید

csharpdoost
پنج شنبه 29 فروردین 1392, 13:41 عصر
نه دوست من. البته پیغام درسته بخاطر نبودن رادیوباتن هست اما از همون اولین رادیوباتن این خطا رو میداد.دلیلش این بود که رادیو باتن ها را روی گروپ باکس اضافه کردم بعد گروپ باکس رو به فرم. به همین دلیل اول باید گروپ باکس رو پیداکنم بعد روی اون رادیو باتن رو. که دوست بزرگوارمون Mahmoud.Afrad متوجه این مشکل شده و کدش رو هم نوشتن.

group45
پنج شنبه 29 فروردین 1392, 21:38 عصر
توسط حلقه n تا رادیو باتن ساخته و روی گروپ باکس قرار میگیرد. (داخل هر گروپ باکس 4تا رادیوباتن تعریف میشه. همه بوسیله کد تعریف شده اند نه ویزاردی)حالا میخوام رادیو باتنهای هر گروپ باکس رو چک کنم و هر کدوم که انتخاب شده بود آن رو ذخیره کنم. لطفا راهنمایی بفرمایید

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

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