PDA

View Full Version : حرفه ای: طراحی فرم ورود اطلاعات از چند جدول ؟



nice_boy_a
شنبه 31 خرداد 1393, 14:50 عصر
سلام.
یه فرم ورود اطلاعات میخوام درست کنم که از ترکیب چند تا جدول درست شده باشه!
مثلا فرض کنید جداولی مثله اینا داریم:
جداول دانشجو، درس و نمره
فرض رو بر این بگیرین که یک استاد چند تا درس برداشته و همزمان میخواد به همه ی دانشجوهاش نمره بده(مثلا 4 تا درس برداشته و n تا دانشجو) عکس زیر رو ببینید
120373
ستون اول که لیست دانشجوها هست، از جدول دانشجو میاد، ستون های بعد که لیست دروس هستن، از جدول درس(دقت کنید که در جدول درس، لیست دروس به صورت رکورد هستن ولی اینجا باید به صورت ستون باشه، یعنی به ازای هر سطر در جدول درس باید یک ستون اینجا اضافه بشه) اون عددها هم TextBox هستن، یعنی کاربر میتونه هر درسی رو که خواست برای هر دانشجو نمره بده و در آخر دکمه ی ثبت رو که زد همه ی اطلاعات ذخیره بشه(تو جدول نمره ذخیره میشه که شامل کد دانشجو و کد درس و نمره هست)

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

aroshanzamir
شنبه 31 خرداد 1393, 16:21 عصر
من منظور شما را درست متوجه نشدم .. یعنی همه n تا دانشجو این 4 تا درس را دارند .. به طور معمول اینگونه نیست ..ممکنه یک سری درس هوش مصنوعی نداشته باشند یک سری الگوریتم نداشته باشند و...
در این حالت ستون های خالی زیاد داریم و یک نمونه افزونگی در فرم داریم ... به نظر من بهتره یک لست داشته باشی که لیست دروسی که استاد داره تدریس می کنه نمایش بده بعد هر درس را که انتخاب کرد لیست دانشجویانی که این درس را گرفته باشند نمایش بده ......

nice_boy_a
شنبه 31 خرداد 1393, 16:52 عصر
من منظور شما را درست متوجه نشدم .. یعنی همه n تا دانشجو این 4 تا درس را دارند .. به طور معمول اینگونه نیست ..ممکنه یک سری درس هوش مصنوعی نداشته باشند یک سری الگوریتم نداشته باشند و...
در این حالت ستون های خالی زیاد داریم و یک نمونه افزونگی در فرم داریم ... به نظر من بهتره یک لست داشته باشی که لیست دروسی که استاد داره تدریس می کنه نمایش بده بعد هر درس را که انتخاب کرد لیست دانشجویانی که این درس را گرفته باشند نمایش بده ......

به تحلیل و افزونگی و ... کار نداریم، این سناریوی دانشجو، درس و نمره رو مثال زدم که دوستان مطلب رو متوجه بشن و تو پیاده سازی راهنمایی کنن.گفتم شما فرض رو بر این بگیرین که یک استاد چند تا درس برداشته و همزمان میخواد به همه ی دانشجوهاش نمره بده.......................
شما فرض کنید تو اون عکسی که گذاشتم همه ی دانشجو ها همه ی درس ها رو دارن و همه ی درس ها توسط یک استاد ارائه میشه!(با این فرض راهنمایی بفرمایین)

Mohammadm
شنبه 31 خرداد 1393, 17:32 عصر
ابتدا یک کنترل جدول مانند

<asp:Table ID="tblnews" runat="server" Width="100%" BorderColor="#99CCFF">
</asp:Table>
رو به فرمت اضافه کن
سپس اسامی دانشجویان و درسها رو از منبع داده دریافت کن
برای ایجاد عناوین اولین سطر از کد زیر استفاده کن

System.Web.UI.WebControls.TableRow oTableRow = null;

System.Web.UI.WebControls.TableHeaderCell oTableHeaderCell = null;

oTableRow = new System.Web.UI.WebControls.TableRow();
oTableRow.CssClass = "row";

oTableHeaderCell = new System.Web.UI.WebControls.TableHeaderCell();
oTableHeaderCell.Text = "اسامی دانشجویان";
oTableHeaderCell.HorizontalAlign = System.Web.UI.WebControls.HorizontalAlign.Right;
oTableHeaderCell.Height = System.Web.UI.WebControls.Unit.Pixel(25);
oTableRow.Cells.Add(oTableHeaderCell);

oTableHeaderCell = new System.Web.UI.WebControls.TableHeaderCell();
oTableHeaderCell.Text = "هوش مصنوعی";
oTableHeaderCell.HorizontalAlign = System.Web.UI.WebControls.HorizontalAlign.Right;
oTableHeaderCell.Height = System.Web.UI.WebControls.Unit.Pixel(25);
oTableRow.Cells.Add(oTableHeaderCell);

البته در این مثال فقط دو ستون رو ایجاد کردم
برای اضافه کردن سطر ایجاد شده به جدول از کد زیر استفاده کنید

tblnews.Rows.Add(oTableRow);


توی سطرهای بعدی نیاز به کنترل textbox داریم که کدش رو بصورت زیر میتونیم بنویسیم

oTableRow = new System.Web.UI.WebControls.TableRow();

oTableCell = new System.Web.UI.WebControls.TableCell();
System.Web.UI.WebControls.TextBox txt = new System.Web.UI.WebControls.TextBox();
oTableCell.Controls.Add(txt);

nice_boy_a
شنبه 31 خرداد 1393, 17:35 عصر
ممنون از پاسخت. ولی من میخوام با دیتابیس در ارتباط باشه هـــآ! فکر نمیکنی این روش بسیار سنتی و وقت گیره ؟

Mohammadm
شنبه 31 خرداد 1393, 18:29 عصر
عرض کردم داده ها رو از دیتابیس میخونی و با استفاده از حلقه foreach از کدهایی که نوشتم استفاده میکنید.
نگران نباش سنتی نیست. و کاملا جواب میده
اگر mvc رو مطالعه کرده باشید کدنویسیش به این سمت اومده منظورم همون سنتی که شما فرمودید یعنی همچیو خودتون مینویسید.
البته میتونید از gridview هم استفاده کنید و از templatefield برای قرار دادن textbox استفاده کنید ولی من روش فوق رو ترجیح میدم.

nice_boy_a
شنبه 31 خرداد 1393, 23:42 عصر
با gridview به صورت معمولی نمیشه، چون ستون های دوم به بعد از جدول درس میاد (رکورد باید تبدیل بشه به ستون)
مشکلی با gridview و templatefield ندارم، مشکلم تبدیل سطرهای جدول درس به ستون هست.

Mohammadm
یک شنبه 01 تیر 1393, 00:49 صبح
درسته
بنابراین باتوجه به پست 4 انجام بدید

nice_boy_a
یک شنبه 01 تیر 1393, 11:08 صبح
راستش با این روش حال نکردم! یه جوری لقمه دور سر می پیچه بعدشم میره تو گوش!خخخخ :لبخند:
دوستان روش دیگه ای دارن پیشنهاد بدن ؟

shaparak631
دوشنبه 02 تیر 1393, 00:09 صبح
ببین من قبلا یه چیزی مثل این تصویر درست کردم شاید به دردت بخوره
http://www.4shared.com/download/aeQeNm-aba/compare.bmp?lgfp=3000

یه دیتاگرید ساده اضافه میکنی:


<asp:GridView ID="GridView1" runat="server"></asp:GridView>

تو کد صفحه:


using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;


public partial class compare : System.Web.UI.Page
{

protected void Page_Load(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection("Data Source=.;Initial Catalog=asayesh;Integrated Security=True");
string str = "select * from car_detector";
con.Open();
SqlDataAdapter da = new SqlDataAdapter(str, con);
DataSet ds = new DataSet();
da.Fill(ds, "car_detector");

GridView1.DataSource = FlipDataSet(ds);
GridView1.DataBind();
con.Close();
}


public DataSet FlipDataSet(DataSet my_DataSet)
{
DataSet ds = new DataSet();
DataTable table = new DataTable();
DataRow r = null;
foreach (DataTable dt in my_DataSet.Tables)
{


for (int i = 0; i <= dt.Rows.Count; i++)// add columns as much as rows count
{
table.Columns.Add(Convert.ToString(i));
}
for (int k = 0; k < dt.Columns.Count; k++)
{
r = table.NewRow();
r[0] = dt.Columns[k].ToString();
for (int j = 1; j <= dt.Rows.Count; j++)
r[j] = dt.Rows[j - 1][k];
table.Rows.Add(r);
}
ds.Tables.Add(table);
}


return ds;
}


}

به این روش میگن pivot data

رکورد اولش رو هم که هدر گرید ویو هست میتونی با false کردن خاصیت ShowHeader گرید ویو حذف کنی