PDA

View Full Version : ارتباط کمبوباکس با گرید در معماری سه لایه



shm184
جمعه 26 مهر 1392, 13:29 عصر
سلام من گریدی دارم که میخوام با انتخاب هر گزینه از داخل کمبوباکس مقادیر گریدم تغییر کنه

برای این کار درلایه BLL متدی برای پر کردن گرید به صورت زیر نوشتم

public DataTable GridQuestion(int groupid)
{

SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = new SqlCommand();
da.SelectCommand.CommandText = "SelectAllQuestionWithGroupId";
da.SelectCommand.Parameters.AddWithValue("@groupid", groupid);
DataTable dt = new DataTable();
dt = cld.AllSelect(da);
return dt;
}

و استورد پروسیجری هم که استفاده کردم سلکتی به شرط برابری کدمقادیر کمبوباکسم با فیلد کد مربوط به اون مقادیر داخل جدولم هست

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

plus
جمعه 26 مهر 1392, 13:43 عصر
dataGridView1.DataSource = BLL.GridQuestion(comboBox1.SelectedIndex);

esafb52
جمعه 26 مهر 1392, 15:13 عصر
با سلام چون مقدارت از نوع int هست باید کد بالارو اینجوری بنویسی
dataGridView1.DataSource = BLL.GridQuestion(Convert.ToInt32(comboBox1.Selecte dIndex));

veniz2008
جمعه 26 مهر 1392, 15:42 عصر
با سلام چون مقدارت از نوع int هست باید کد بالارو اینجوری بنویسی
dataGridView1.DataSource = BLL.GridQuestion(Convert.ToInt32(comboBox1.Selecte dIndex));

سلام.
selectedindex خودش عددی هست و نیازی به تبدیل نداره (بودنش هم ایرادی نداره ولی ضروری نیست).
البته ایشون ممکنه کمبو رو از دیتابیس پر کرده باشه و خاصیت ValueMember رو برای کمبوباکس فعال کرده باشه که در اینصورت کد دوستمون به شکل زیر تغییر پیدا میکنه :

dataGridView1.DataSource = BLL.GridQuestion(comboBox1.SelectedValue);

shm184
جمعه 26 مهر 1392, 16:05 عصر
ممنون که پاسخ دادین من با اون یک خط کدی که کاربرplus نوشتن همین کار رو انجام میدم و مشکلی در اون رابطه ندارم
این سوال من در واقع مربوط به همون فرم سوالاتی میشه که توی ویدئوها گذاشتین و من دقیقا همون کارهارو میخوام با سه لایه انجام بدم
توی قسمتی که سوالات رو وارد دیتابیس میکنیم من برای این حالت که سه لایه هست به این صورت متد رو در لایه BLL نوشتم
public void AddQuestion(int groupid, string questiontext, string case1, string case2, string case3, string case4, int answer)
{
SqlCommand cmd = new SqlCommand("AddQuestion");
cmd.Parameters.AddWithValue("@groupid", groupid);
cmd.Parameters.AddWithValue("@questiontext", questiontext);
cmd.Parameters.AddWithValue("@case1", case1);
cmd.Parameters.AddWithValue("@case2", case2);
cmd.Parameters.AddWithValue("@case3", case3);
cmd.Parameters.AddWithValue("@case4", case4);
cmd.Parameters.AddWithValue("@answer", answer);
cld.AllCommand(cmd);
}

وموقعی که میخوام تو لایه کاربر فراخوانیش کنم اینجوری مینویسم

private void BtnAdd_Click(object sender, EventArgs e)
{

clquestion.AddQuestion(Convert.ToInt32(CmbGroup.Se lectedValue), TxtQuestion.Text, TxtCase1.Text, TxtCase2.Text, TxtCase3.Text, TxtCase4.Text,Convert.ToInt32(CmbAnswer.SelectedVa lue));
MessageBox.Show("سوال مورد نظر با موفقیت ثبت گردید");

}

میخوام بدونم این روشی که من استفاده کردم درسته یا نه؟ اگه درست نیست بگین چیکار کنم اگه هم درسته من مشکلی که واسم پیش میاد رو بگم

shm184
جمعه 26 مهر 1392, 16:33 عصر
من وقتی میام از کمبوباکس یه گروه رو انتخاب میکنم و براش سوال وارد میکنم ثبت میشه اما مشکلی که وجود داره اینه که با کد گروهی که اینکارو انجام دادم ثبت نمیشه
مثلا من چهار تا گروه رو توی جدول گروهای امتحانی ثبت کردم
هر سوالی که ثبت میکنم میره تو گروه دومی که ثبت کرده بودم و اصلا برای سه گروه دیگه سوالی ثبت نمیشه
ایراد کارم کجاست؟

shm184
جمعه 26 مهر 1392, 16:55 عصر
کلاس مربوط به دیتابیس
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;

namespace Azmoon3Layer
{
class Cl
{
public SqlConnection con = new SqlConnection("server=SHM; database=DbAz; integrated security=true");

public DataTable AllSelect(SqlDataAdapter da)
{
da.SelectCommand.Connection = con;
da.SelectCommand.CommandType = CommandType.StoredProcedure;
DataTable dt = new DataTable();
da.Fill(dt);
return dt;
}

public void AllCommand(SqlCommand cmd)
{
cmd.Connection = con;
cmd.CommandType = CommandType.StoredProcedure;
con.Open();
cmd.ExecuteNonQuery();
con.Close();
}
}
}


کلاس مربوط به فرم سوالات

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;

namespace Azmoon3Layer
{
class ClQuestion
{
Cl cld = new Cl();

public DataTable GridQuestion(int groupid)
{

SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = new SqlCommand();
da.SelectCommand.CommandText = "SelectAllQuestionWithGroupId";
da.SelectCommand.Parameters.AddWithValue("@groupid", groupid);
DataTable dt = new DataTable();
dt = cld.AllSelect(da);
return dt;
}

public DataTable CmbGrooup()
{
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = new SqlCommand();
da.SelectCommand.CommandText = "SelectAllGroup";
DataTable dt = new DataTable();
dt = cld.AllSelect(da);
return dt;
}
public void AddQuestion(int groupid, string questiontext, string case1, string case2, string case3, string case4, int answer)
{
SqlCommand cmd = new SqlCommand("AddQuestion");
cmd.Parameters.AddWithValue("@groupid", groupid);
cmd.Parameters.AddWithValue("@questiontext", questiontext);
cmd.Parameters.AddWithValue("@case1", case1);
cmd.Parameters.AddWithValue("@case2", case2);
cmd.Parameters.AddWithValue("@case3", case3);
cmd.Parameters.AddWithValue("@case4", case4);
cmd.Parameters.AddWithValue("@answer", answer);
cld.AllCommand(cmd);
}

}
}


وکدهای فرم سوالات
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 Azmoon3Layer
{
public partial class FrmQuestion : Form
{
ClQuestion clquestion = new ClQuestion();
public FrmQuestion()
{
InitializeComponent();
}

private void FrmQuestion_Load(object sender, EventArgs e)
{
CmbAnswer.SelectedIndex = 0;
CmbGroup.DataSource = clquestion.CmbGrooup();
CmbGroup.DisplayMember = "GroupName";
CmbGroup.ValueMember = "GroupId";

}

private void BtnAdd_Click(object sender, EventArgs e)
{

clquestion.AddQuestion(Convert.ToInt32(CmbGroup.Se lectedValue), TxtQuestion.Text, TxtCase1.Text, TxtCase2.Text, TxtCase3.Text, TxtCase4.Text,Convert.ToInt32(CmbAnswer.SelectedVa lue));
MessageBox.Show("سوال مورد نظر با موفقیت ثبت گردید");
FrmQuestion_Load(null, null);
}

private void CmbGroup_SelectedIndexChanged(object sender, EventArgs e)
{
GridQuestion.DataSource = clquestion.GridQuestion(CmbGroup.SelectedIndex);
}
}
}

shm184
جمعه 26 مهر 1392, 17:20 عصر
داخل دیتابیس از نظر ثبت کاملا درست با همون کد گروه ثبت میشه اما موقع نمایش داده شدن در گرید فقط با انتخاب گزینه دوم از کمبوباکس همه مقادیر داخل دیتابیس دیده میشه و هرکدوم از گزینه های دیگه رو انتخاب میکنم چیزی نشون نمیده

veniz2008
جمعه 26 مهر 1392, 17:42 عصر
داخل دیتابیس از نظر ثبت کاملا درست با همون کد گروه ثبت میشه اما موقع نمایش داده شدن در گرید فقط با انتخاب گزینه دوم از کمبوباکس همه مقادیر داخل دیتابیس دیده میشه و هرکدوم از گزینه های دیگه رو انتخاب میکنم چیزی نشون نمیده
چرا از selectedindex استفاده کردید وقتی که با valuemember کار میکنید؟

private void CmbGroup_SelectedIndexChanged(object sender, EventArgs e) {
GridQuestion.DataSource = clquestion.GridQuestion(Convert.ToInt32(CmbGroup.S electedValue));
}

veniz2008
جمعه 26 مهر 1392, 17:56 عصر
بخاطر اینکه اینجوری خطا میده
اگر آموزش رو دیده باشید بصورت زیر می تونید خطا رو رفع کنید.

private void CmbGroup_SelectedIndexChanged(object sender, EventArgs e)
{
GridQuestion.DataSource = clquestion.GridQuestion(Convert.ToInt32(((DataRowV iew)CmbGroup.SelectedItem)["GroupID"]));
}

shm184
جمعه 26 مهر 1392, 18:02 عصر
آموزش رو دیدم ولی تغییر همین خط توی سه لایه رو نمیدونستم چجوریه