PDA

View Full Version : سوال: ایجاد فرم ثبت نام بصورت داینامیک



mehdin69
دوشنبه 21 فروردین 1391, 19:41 عصر
سلام دوستان
اگه بخوایم فرم های سایت بصورت داینامیک تغییر کنن و یه جورایی خود مدیر سایت اون ها رو درست کنه باید چکار کنیم؟
یعنی صفحه ثبت نام رو مدیر سایت درست کنه و هر سری هم عوض کنه...
با این شرط که اطلاعاتی که کاربرا ارد می کنن خیلی مهم هستن و توی گزارش گیری ها بهشون نیاز دارم.!!!:متفکر:

raziee
دوشنبه 21 فروردین 1391, 21:28 عصر
با سلام.
شما نیاز به یک فرم ساز دارید.
اطلاعات مربوط به فرم در یک جدول و اطلاعات مربوط به فیلد ها در یک جدول ، اطلاعات مربوطه به رکورد ها در یک جدول و اطلاعات مربوط به مقادیر ستون ها در یک جدول دیگه ذخیره میشوند.
بوسیله ی این 4 جدول شما میتونید فرم های داینامیک رو تولید کنید.

به صورت خیلی ساده:
جدول فرم :

Id
Name
Description
...

جدول فیلد ها :

Id
FormId
PropertyName
PropertyType
DefaultValue
RegEx
...

در این جدول اطلاعات مربوط به فیلد های یک فرم ذخیره میشوند(مثلا: نام،نام خانوادگی و ...)
جدول سطر ها :

Id
FormId
CreateByUserId
CreateOn
...

و جدول مقادیر :

Id
FormId
RowId
FildeId
Value
...


بوسیله ی این 4 جدول شما میتونید فرم های داینامیک تولید کنید.
در رمان درخواست یک فرم، اطلاعات مربوط به فیلد های اون فرم رو میگیرید و بر اساس اون اشیاء مرتبط رو به صفحه اضافه میکنید.
زمانی که کاربر ، اطلاعات فرم رو ارسال کرد اطلاعات بررسی شده و ابتدا یک رکورد به جدول Rows اضافه میشود و بر اساس Id بدست آمده اطلاعات مربوط به مقادیر هر یک از Property ها در جدول 4 ذخیر میشوند.

saadi2
دوشنبه 04 اردیبهشت 1391, 03:32 صبح
جناب raziee (http://barnamenevis.org/member.php?95909-raziee) ممکنه یک sample ساده در اینجا قرار بدید؟

mehdin69
دوشنبه 04 اردیبهشت 1391, 13:39 عصر
سلام
مرسی ازتون.
فقط یه سوال
برای ثبت گزینه های ایجاد شده باید چطور عمل کرد؟
یعنی دکمه ثبت اطلاعات چطوری باید نوشته بشه؟
توی یه فرم 20 تا textbox , radiobutton و checkbox داریم حالا چطور بفهمیم کدوم ها تیک خورده و توش مطلب نوشته شده؟؟
پس توی دکمه ثبت اطلاعات هم باید داینامیک کار بشه؟؟؟
میشه یه راهنمایی هم در این مورد بکنین؟
مرسی ارتون.

raziee
دوشنبه 04 اردیبهشت 1391, 22:06 عصر
86201
سلام
مرسی ازتون.
فقط یه سوال
برای ثبت گزینه های ایجاد شده باید چطور عمل کرد؟
یعنی دکمه ثبت اطلاعات چطوری باید نوشته بشه؟
توی یه فرم 20 تا textbox , radiobutton و checkbox داریم حالا چطور بفهمیم کدوم ها تیک خورده و توش مطلب نوشته شده؟؟
پس توی دکمه ثبت اطلاعات هم باید داینامیک کار بشه؟؟؟
میشه یه راهنمایی هم در این مورد بکنین؟
مرسی ارتون.

با درود
هر یک از فیلد هایی که توسط کاربر ایجاد می شود دارای یک شناسه هستند.
در زمان Render کردن فرم بعد از بررسی DataType فیلد مربوطه و ساخت اون شیئ ، شناسه فیلد همراه با یک پیشوند رو به عنوان Id اون Object در نظر می گیرید
زمانی که End User فرم مربوطه رو به سرور Post میکنه، در شیء Request تمامی اون Object ها ارسال خواهند شد.
بسته به اینکه نحوه ی اضافه کردن Object های فرم شما به چه صورت هست (استفاده از کنترل های دات نت و یا کنترل های Html معمولی)، باید اطلاعاتی که از Request میگیرید رو بررسی کنید و مقدار مروبطه رو بگیرید و ذخیره کنید.
نمونه ی زیر رو بررسی کنید:
86201

majid.mp
شنبه 31 تیر 1391, 00:17 صبح
86201

با درود
هر یک از فیلد هایی که توسط کاربر ایجاد می شود دارای یک شناسه هستند.
در زمان Render کردن فرم بعد از بررسی DataType فیلد مربوطه و ساخت اون شیئ ، شناسه فیلد همراه با یک پیشوند رو به عنوان Id اون Object در نظر می گیرید
زمانی که End User فرم مربوطه رو به سرور Post میکنه، در شیء Request تمامی اون Object ها ارسال خواهند شد.
بسته به اینکه نحوه ی اضافه کردن Object های فرم شما به چه صورت هست (استفاده از کنترل های دات نت و یا کنترل های Html معمولی)، باید اطلاعاتی که از Request میگیرید رو بررسی کنید و مقدار مروبطه رو بگیرید و ذخیره کنید.
نمونه ی زیر رو بررسی کنید:
86201
با سلام
آقای رضیئی من روی فرمم سه باتن دارم که به صورت داینامیک با توجه به توضیحات شما به صفحه اضافه شده اند حال چگونه میتوانم تعیین کنم در صورتی که روی باتن دلخواهم کلیک کردم اطلاعات وارد شده در فرم در جدول ذخیره شوند؟
با تشکر.

mehrzad_ali
سه شنبه 17 مرداد 1391, 15:35 عصر
باتشکر از آقای Raziee
نمونه ی این کد رو داخل یوزر کنترل ندارید ؟ چون داخل یوزرکنترل کار نمیده .

raziee
چهارشنبه 18 مرداد 1391, 09:41 صبح
با سلام
آقای رضیئی من روی فرمم سه باتن دارم که به صورت داینامیک با توجه به توضیحات شما به صفحه اضافه شده اند حال چگونه میتوانم تعیین کنم در صورتی که روی باتن دلخواهم کلیک کردم اطلاعات وارد شده در فرم در جدول ذخیره شوند؟
با تشکر.

از کنترل های خود دات نت استفاده کنید و میتونید برای رویداد کلیک هر Button عملیات دلخواه رو بنویسید.

نمونه ی این کد رو داخل یوزر کنترل ندارید ؟ چون داخل یوزرکنترل کار نمیده .
مشکلی نیست در استفاده از UserControl نیست. شما با چه مشکلی رو به رو شدید.

توجه: این نمونه ای که گذاشتم نمونه ای کاملا ابتدائی هست و قابل استفاده نیست. نمونه های مفیدی رو میتونید با جستجو کردن بدست بیارید.
بهتره هر کدوم از DataType ها یک کلاس باشند که از کلاس پایه ای مشتق شده و متد های ویژه دوباره پیاده سازی بشند.

mehrzad_ali
چهارشنبه 18 مرداد 1391, 17:40 عصر
متاسفانه نمونه ی خوبی پیدا نکردم
توی ادیتور تلریک این قابلیت با استفاده از FormElements وجود داره شما تجربه ی کار با این مورد رو ندارید

raziee
چهارشنبه 18 مرداد 1391, 18:41 عصر
توی ادیتور تلریک این قابلیت با استفاده از FormElements وجود داره شما تجربه ی کار با این مورد رو ندارید
ارتباطی با موضوع بحث تاپیک نداره.

azam2005
شنبه 17 فروردین 1392, 10:08 صبح
آیا نمونه Sample
از DataBase یک فرم ساز دارید که اطلاعات کاملتری داشته باشد؟

azam2005
شنبه 17 فروردین 1392, 11:07 صبح
لطفا راجع به اطلاعات وابسته و طراحی DataBase آن بیشتر توضیح دهید. اطلاعات وابسته به فیلدهای دیگر یا به فرمهای دیگر

مثلا اگر مقدار فیلد A =1 بود فیلدهای Cو B را کاربر باید وارد کند
اگر مقدار فیلد A=2 بود و مقدار B=1 کاربر فیلدهای DوF را پر کند

لطفا راجع به فیلدهایی که مقدارهای وابسته دارند مثل منطقه جغرافیایی که اطلاعات را از یک جدول وابسته مثل کشور - استان - شهر می گیرد بیشتر توضیح دهید و یا اطلاعات یک فرم که وابسته به اطلاعات یک فرم دیگر است.
مخصوصا موقع نمایش فرم و ساخت دستور Select این اطلاعات وابسته

azam2005
شنبه 31 فروردین 1392, 20:31 عصر
برای طراحی یک فرم ساز و نحوه چیدمان فیلدها چکار باید کرد؟
آیا کنترل خاصی باید استفاده کرد؟

moferferi
شنبه 02 آذر 1392, 14:19 عصر
سلام
چند وقت پیش بود که دنبال اموزش ساخت یه فرم ساز میگشتم.تا اینکه این تایپیک را دیدم.و تونستم یه فرم ساز خیلی عالی طراحی کنم.
مثل
113150
بخش گزارش را هم با استفاده از ef نوشتم و خروجی را اون را با تولید یک تیبل و تگ های th.td طراحی کردم


113151

اما حالا میخوام همین گزارش را به وسیله دستورات sql تولید کنم.
شما میتونید راهنمایی کنید.
البته من یه تغییر کوچیک هم تو برنامه دادم.توی جدول مربوط به مقادیر یه فیلد کد رهگیری هم گذاشتم که بتونم هر فرم ارسالی را از بقیه جدا کنم.

raziee
شنبه 02 آذر 1392, 22:36 عصر
سلام
چند وقت پیش بود که دنبال اموزش ساخت یه فرم ساز میگشتم.تا اینکه این تایپیک را دیدم.و تونستم یه فرم ساز خیلی عالی طراحی کنم.
مثل
113150
بخش گزارش را هم با استفاده از ef نوشتم و خروجی را اون را با تولید یک تیبل و تگ های th.td طراحی کردم


113151

اما حالا میخوام همین گزارش را به وسیله دستورات sql تولید کنم.
شما میتونید راهنمایی کنید.
البته من یه تغییر کوچیک هم تو برنامه دادم.توی جدول مربوط به مقادیر یه فیلد کد رهگیری هم گذاشتم که بتونم هر فرم ارسالی را از بقیه جدا کنم.

با درود
میتونید اطلاعات رو از دیتابیس دریافت کنید اون رو به یک DataTable تبدیل کنید و DataTable ایجاد شده رو به GridView و یا Repeater بدید.

به تعداد ستون ها (فیلد ها) ی موجود به DataTable ستون اضافه کنید و مقدایر مربوطه رو داخل هر Column بریزید.
به تعداد سطر های ذخیره شده به DataTable ایجاد شده Row اضافه کنید. DataTable.NewRow.

در این حالت Paging باید بر اساس RowId باشه و اگه بخواهید Sorting رو داشته باشید (مثلا بر اساس فیلد نام مرتب شوند) میبایست کل دیتا ها رو به داخل DataTable بیارید و سپس Sort کنید که این کار، بار زیادی رو داره(اگه تعداد سطر ها زیاد باشه).
راهکار های دیگه هم هست، به عنوان مثال داده های جدول فیلد رو فیلتر کنید (که فقط فیلد نام رو داشته باشه) و بعد روی اون Sort کنید ، سپس RowId اون ها رو بگیرید (به تعداد PageSize) و بعد بقیه داستان.

moferferi
یک شنبه 03 آذر 1392, 07:28 صبح
ممنون
مشکلم اینه که چطوری هر سطر یک فرم را بر اساس rowid مشخص کنم.
من خودم فعلا این مشکل را حل کردم.(البته فکر کنم به یه روش غیر اصولی)

حالا اگه زحمت نیست و وقت داشتنین کدش را واسم بزارین.

این هم کد من
using (MehadEntities db = new MehadEntities()) {

var lst = (from d in db.FormControls
where d.FormID == formid && d.BranchID_FK==bid
orderby d.ID
select new { d.ID,d.CntName}).ToList();
if (lst.Count > 0)
{

_html = " <table class='tbReportForm'><thead><tr>";
foreach (var item in lst)
{
_html = _html + "<th>{0}</th>";
_html = string.Format(_html, item.CntName);

}

_html = _html + "</tr>";

var lst2 = (from d in db.FormValues
where d.FormiD_FK == formid && d.BranchID_FK == bid
select new { d.ID, d.CntVal, d.CodeRah, d.FormControls.CntDataType }).ToList();
if (lst2.Count > 0)
{
_html = _html + "<tr>";

lblResult.Text = (lst2.Count / lst.Count).ToString();
int coderah = (int)lst2[0].CodeRah;
foreach (var item in lst2)
{
if (item.CntDataType == 4 && item.CntVal == "on" || item.CntDataType == 2 && item.CntVal == "on")
{
if (coderah == (int)item.CodeRah)
{

_html = _html + "<td>{0}</td>";
_html = string.Format(_html, "*");

}
else
{

coderah = (int)item.CodeRah;
_html = _html + "</tr>";
_html = _html + "<td>{0}</td>";
_html = string.Format(_html, "*");

}
}
else
{
if (coderah == (int)item.CodeRah)
{

_html = _html + "<td>{0}</td>";
_html = string.Format(_html, item.CntVal);

}
else
{

coderah = (int)item.CodeRah;
_html = _html + "</tr>";
_html = _html + "<td>{0}</td>";
_html = string.Format(_html, item.CntVal);

}

}


}



}
else {
lblResult.Text = "هنوز فرمی ارسال نشده است";
return;
}

}

else {
lblResult.Text = "برای فرم مورد نظر هیچ آیتمی طراحی نشده است";
return;
}
ltr.Text = _html+"</tr></table>";
}

raziee
یک شنبه 03 آذر 1392, 23:20 عصر
مشکلم اینه که چطوری هر سطر یک فرم را بر اساس rowid مشخص کنم.
راستش من دقیقا مشکل شما رو متوجه نشدم.
شما یک جدول دارید که اطلاعات کلی هر سطر (هر فرم وارد شده) رو نگه داری میکنه(مثل اینکه چه کاربری در چه زمانی با چه IP ای و...)
تعداد رکورد های این جدول برابر با تعداد فرم های Submit شده هست. Primary Key این جدول رو میتونید به نوان RowId در نظر بگیرید.
----------------------
در تولید خروجی به روش شما چند نکته قابل ذکر هست.
تعداد درخواست بازیابی اطلاعات از دیتابیس که زیاد هست.
این روش تنها برای تولید خروجی HTML (البته اون هم نه چندان جالب) قابل استفاده است. فکر کنید که از اطلاعات قرار هست خروجی Excel یا PDF تهیه بشه. میبایست برای هر نوع خروجی کد های مربوط به دریافت اطلاعات از بانک رو بنویسید و..

پیشنهاد میکنم در یک کلاس جدا متدی داشته باشید شبیه به متد زیر:

Public DataTable GetData(int formId, int pageIndex,int pageSize,string search, string sort)
{
// گرفتن داده ها از دیتابیس و تولید دیتا تیبل و برگشت دادن
}


کد های ایجاد خروجی (html,pdf,...) نباید با کد های تولید datatable یکجا باشند.
به طور کلی همیشه سعی کنید متد هایی که مینویسید تنها بلد باشند یک کار انجام بدن نه بیشتر. اگه قرار دیتا رو از دیتابیس بگره فقط همین کار رو انجام بده، اگه قرار تولید کنه فقط همین کار رو انجام بده

moferferi
دوشنبه 04 آذر 1392, 07:00 صبح
بازم ممنون که وقت گذاشتین و جواب دادین.
خودم هم میدونم که کدی که نوشتم باعث رفت و برگشت خیلی زیادی به دیتابیس میشه.و اصلا بهینه نیست.
و یکی دیگه اینکه اگه بخوام به عنوان یه دیتاسورس اونا به یک گریدویو یا کنترلی شبیه به اون پاس بدم نمیشه.

سعی میکنم طبق گفته شما عمل کنم.

ولی با عرض شرمندگی اگه شما وقت داشتین و امکانش هست کدش را واسم بنویسین.

moferferi
دوشنبه 04 آذر 1392, 08:15 صبح
من اینا نوشتم

DataTable dt = new DataTable();
using (MehadEntities db = new MehadEntities()) {
//گرفتن نام کنترل ها و تعیین ان به عنوان عنوان ستون
var MyControls = (from d in db.FormControls
where d.FormID==6
select d).ToList();
foreach (var item in MyControls)
{

dt.Columns.Add(item.CntName);
}
//تولید سطرها
DataRow drow = dt.NewRow();
var MyValue = (from d in db.FormValues
where d.FormiD_FK == 6
select d).ToList();

foreach (var item in MyValue)
{
drow[item.FormControls.CntName] = item.CntVal;

}
dt.Rows.Add(drow);
GridView1.DataSource = dt;
GridView1.DataBind();
}
ولی فقط سطر آخر را برمیگردونه.فکر کنم باید یه foreach دیگه بنویسم.که دوباره تعداد درخواست از دیتابیس بالا میره.

و بحث paging هم که نمیدونم باید چی کار کنم

raziee
دوشنبه 04 آذر 1392, 20:54 عصر
ولی فقط سطر آخر را برمیگردونه.
خوب شما فقط یکبار dt.Rows.Add رو صدا میزنید!
Form And List (http://www.formandlist.com/) یکی از ماژول های دات نت نیوک هست.
پیشنهاد میکنم حتما روش وقت بگذارید. اطلاعات خوبی برای یادگیری داره. سورسش رو میتونید از این آدرس (http://dnnfnl.codeplex.com/) دریافت کنید.

moferferi
دوشنبه 04 آذر 1392, 21:13 عصر
مشکلم هم با همینه dt.Rows.Add(drow);
اگه بیام و توی foreach صداش بزنم پیغام خطا میده که شما یکبار DataRow drow ساختین و نمیشه ازش استفاده کنین
اگر هم بیام DataRow drow = dt.NewRow(); درون foreach صدا کنم به ازای هر مقدار یه سطر ایجاد میکنه

meysam-lamster
چهارشنبه 07 اسفند 1392, 18:53 عصر
سلام دوستان.
راستش من لزوم جدول سومی رو نمیتونم درک کنم کسی لطف میکنه واضح برام توضیح بده جدول سومی (مربوط به سطرها) به خاطر چی هست؟ میشه نادیدش گرفت؟ میخوام یه فرم ساز طراحی کنم موندم توش :)

mahan206
دوشنبه 03 آذر 1393, 23:03 عصر
اقا من اصلا متوجه مثال نشدم میشه یکی توضیح بده خط به خط اگه لطف کنین ممنون میشم یا یه مثال با بانک بزارین تا من بتونم گسترشش بدم

masoodinfo
سه شنبه 07 مهر 1394, 17:25 عصر
سلام دارم خدمت دوستان محترم
من این تاپیک رو امروز پیدا کردم و خوشحال شدم!
در ابتدا از مدیر بخش که جواب دوستان رو دادن هم تشکر می کنم هم اینکه یک سوال دارم

این روشی که شما گفتید به مدل EAV معروف هست!
میخواستم بدونم این روش دارای کارایی مناسب هست؟
در هنگام گزارش گیری و نمایش با تاخیر مواجه نخواهیم شد؟

به عنوان یک اتوماسیون اداری قابل استفاده می باشد؟به این شکل که کلیه فرم های کاغذی هر اداره ای دراین قالب تعریف و به گردش در آورده شود با کلیه امکانات هامش و پیوست و ارجاع وو و وو و و وو هر امکانی که برنامه مشابه دارند.


باتشکر

masoodinfo
چهارشنبه 08 مهر 1394, 22:22 عصر
سلام مجدد
از دوستان کسی دیگه نیست جواب سوال های من رو لطف کنه؟

باتشکر

7asemoon
پنج شنبه 24 تیر 1395, 17:22 عصر
این نمونه خیلی ساده هست اگر کاربر یک لیست باکس رو انتخاب کنه چطور باید مقادیر اون رو وارد کنه