PDA

View Full Version : سوال: مشکل در پر نشدن TextBox های ساخته شده در DataGridView



Nima_kyan
چهارشنبه 29 شهریور 1391, 00:22 صبح
سلام دوستان
در فرم زیر بعد از زدن دکمه ادامه باید نمراتی که قبلا برای کارنامه درسی داوطلب ثبت شده در گرید لود بشن.
93070
واسه این کار کد زیر رو نوشتم. (در بانکم یه فیلد به نام نمره دارم ولی در گرید میخوام قسمت صحیح و اعشار نمره رو تو دو ستون مجزا نمایش بدم)

SqlConnection conn = new SqlConnection(FrmMain.strcon);
SqlCommand cmdd = new SqlCommand();
cmdd.Connection = conn;
cmdd.CommandText = "select Tbl_Karname_Darsi.ID_Dars,Name_Dars,Nomre from Tbl_Karname_Darsi inner join Tbl_Dars on Tbl_Karname_Darsi.ID_Dars=Tbl_Dars.ID_Dars where ID_STD=" + int.Parse(txtIDSTD.Text) + " and Azmoon_Year=" + Properties.Settings.Default.Azmoon_Year + " and ID_Azmoon=" + int.Parse(comboBox1.SelectedValue.ToString());

conn.Open();
cmdd.ExecuteNonQuery();
conn.Close();

SqlDataAdapter daa = new SqlDataAdapter(cmdd);
DataTable dtt = new DataTable();
dtt.Clear();
daa.Fill(dtt);
dataGridView1.DataSource = dtt;


dataGridView1.Columns["Nomre"].Visible = false;

DataGridViewTextBoxColumn grdtxt1 = new DataGridViewTextBoxColumn();
grdtxt1.Name = "Nomre_Ashar";
dataGridView1.Columns.Add(grdtxt1);
grdtxt1.HeaderText = "اعشار";

DataGridViewTextBoxColumn grdtxt2 = new DataGridViewTextBoxColumn();
grdtxt2.Name = "Nomre_Sahih";
dataGridView1.Columns.Add(grdtxt2);
grdtxt2.HeaderText = "صحیح";

int count = dtt.Rows.Count;
string str_Nomre_Sahih="", str_Nomre_Ashar = "";
for (int i = 0; i < count; i++)
{
string s = dtt.Rows[i]["Nomre"].ToString();
int x = s.IndexOf(".", 0, s.Length - 1);
str_Nomre_Sahih = s.Substring(0,x);
str_Nomre_Ashar = s.Substring(x+1,s.Length-x-1);

dataGridView1.Rows[i].Cells["Nomre_Sahih"].Value = str_Nomre_Sahih;
dataGridView1.Rows[i].Cells["Nomre_Ashar"].Value = str_Nomre_Ashar;
}
حالا مشکل اینه که بار اول که دکمه ادامه رو میزنم گریدم پر میشه ولی دو ستون نمره اعشار و نمره صحیح خالی میمونه. جالبش اینه که یه بار که دکمه انصراف رو میزنم و دوباره دکمه ادامه رو میزنم اون دوتا ستون هم پر میشن. چرااااا اینجوری؟؟؟ کلی باهاش ور رفتم ولی هیچ

SharpSabre
چهارشنبه 29 شهریور 1391, 01:26 صبح
جوابش تو زمان Adapter.Fill کردن هست.

Nima_kyan
چهارشنبه 29 شهریور 1391, 02:16 صبح
جوابش تو زمان Adapter.Fill کردن هست.
ممنون بابت توجه کردنت.
ولی فک نمیکنم مشکل اون باشه. همون طور که در عکس مشخصه دو ستون اول گرید مقداردهی شده پس DataTable ام پر میشه.

Mahmoud.Afrad
چهارشنبه 29 شهریور 1391, 02:23 صبح
دیتاتیبل را در سطح کلاس تعریف کنید تا از همین یک نمونه دیتاتیبل استفاده کنید چون بعدا میخواهید محتوای دیتاتیبلی که از قبل وجود داشته را clear کنید.
جدا کردن قسمت صحیح و اعشار را در کد sql انجام بدید. به کامند (cmd) توجه کنید:
DataTable dt = new DataTable();
private void button12_Click(object sender, EventArgs e)
{
using (SqlConnection conn = new SqlConnection(FrmMain.strcon))
{
using (SqlCommand cmd = new SqlCommand())
{
cmd.Connection = conn;
cmd.CommandText = "select Tbl_Karname_Darsi.ID_Dars,Name_Dars,Nomre ,Nomre ,FLOOR(Nomre)as Nomre_sahih ,CAST((Nomre - FLOOR(Nomre))*100 as int)as Nomre_ashar from Tbl_Karname_Darsi inner join Tbl_Dars on Tbl_Karname_Darsi.ID_Dars=Tbl_Dars.ID_Dars where ID_STD=" + txtIDSTD.Text + " and Azmoon_Year=" + Properties.Settings.Default.Azmoon_Year + " and ID_Azmoon=" + comboBox1.SelectedValue;

using (SqlDataAdapter da = new SqlDataAdapter(cmd))
{
dt.Clear();
da.Fill(dt);
dataGridView1.DataSource = dt;
}
}
}
}

nomre_sahih و nomre_ashar دو ستون از نوع int هستند و در برنامه تون برای استفاده دیگه نیاز به تبدیل به int نیست. البته میتونید نوع این ستونها را در قسمت cast تغییر بدید.

txtIDSTD.Text و ... هم نیاز به تبدیل شدن به عدد ندارند چون آخر سر به رشته کامند الحاق میشن.

دستور select را برای جلوگیری از sql injection و بالا بردن سرعت به صورت یک پروسیجر با پارامترهای مناسب در دیتابیس تعریف کنید و در کدتون اون storedprocedure را فراخوانی کنید.

FastCode
چهارشنبه 29 شهریور 1391, 02:28 صبح
بعد از fill دو تا ستون به دیتاتیبل اضافه کن واطلاعات رو بریز توی اونها.خیلی بهتره
از نظر طراحی, سرعت, حافظه

Nima_kyan
چهارشنبه 29 شهریور 1391, 02:53 صبح
ممنون mafaman2003 (http://barnamenevis.org/member.php?71297-mafaman2003) و FastCode (http://barnamenevis.org/member.php?109710-FastCode)
با کد mafaman2003 (http://barnamenevis.org/member.php?71297-mafaman2003) مشکل حل شد. ولی درست متوجه نشدم که مشکل کدم کجا بود که..

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

Nima_kyan
چهارشنبه 29 شهریور 1391, 03:00 صبح
یه مشکل دیگه..
من واسه دو ستون نمره صحیح و نمره اعشار Textbox گذاشته بودم که بتونم ویرایششون کنم و همچنین بتونم محدودش کنم که فقط عدد وارد کنه
با کد جدید mafaman2003 (http://barnamenevis.org/member.php?71297-mafaman2003) این امکان وجود داره؟؟؟

Nima_kyan
چهارشنبه 29 شهریور 1391, 03:04 صبح
بعد از fill دو تا ستون به دیتاتیبل اضافه کن واطلاعات رو بریز توی اونها.خیلی بهتره
از نظر طراحی, سرعت, حافظه
خوب من هم در همون کد اولم این کار رو کردم. بعد از fill دوستون از نوع Textbox اضافه کردم و اطلاعات رو ریختم توشون.(اگه منظورتون رو درست متوجه شده باشم)

FastCode
چهارشنبه 29 شهریور 1391, 14:00 عصر
(اگه منظورتون رو درست متوجه شده باشم)
دو ستون به DataTable نوشتم