PDA

View Full Version : مبتدی: RequiredFieldValidator در گریدویو کار نمیکند



mahsa.n
یک شنبه 21 شهریور 1389, 00:01 صبح
سلام

من از این کد برای قرار دادن RequiredFieldValidator استفاده کردم:



<asp:TemplateFieldHeaderText="تعداد سفارش">
<ItemTemplate>

<asp:TextBoxrunat="server"ID="TextBox"></asp:TextBox>
<asp:RequiredFieldValidatorID="rq"runat="server"ErrorMessage="*"
Display="Dynamic"ControlToValidate="TextBox"Font-Size="11px"SetFocusOnError="true"
></asp:RequiredFieldValidator>
</ItemTemplate>
</asp:TemplateField>

<asp:ButtonFieldButtonType="Button"Text="اضافه "CommandName="Insert"/>



میخوام وقتی کاربر روی اضافه کلیک میکنه در صورتی که textbox خالی باشه RequiredFieldValidator کار کنه ولی کار نمیکنه
لطفا راهنمایی کنین

اوبالیت به بو
یک شنبه 21 شهریور 1389, 07:02 صبح
ControlToValidate="TextBox"سلام
اين كنترل شما اسمش درست هست؟ TextBox1 نيست؟

clover
یک شنبه 21 شهریور 1389, 11:19 صبح
دوست عزیز
گرید ویو قابلیت اضافه کردن رکورد نداره، باید از یک کنترل دیگه مثل دیتالیست استفاده کنید و یا اینکه خودتون با کد نویسی این قابلیت را ایجاد کنید
اما علت فعال نشدن RequiredFieldValidator این هست که CausesValidation به طور پیشفرض برای ButtonField ها برابر false هست و باید مقدار اون را به true ست کنید


<asp:ButtonField ButtonType="Button" Text="اضافه" CommandName="Insert" CausesValidation="True" />

aspismylove
یک شنبه 21 شهریور 1389, 11:32 صبح
اصلا چرا توی گرید گذاشتی تکست ها و... رو ؟؟؟؟؟؟؟؟؟؟؟ :متفکر:

mahsa.n
یک شنبه 21 شهریور 1389, 11:48 صبح
ControlToValidate="TextBox"سلام
اين كنترل شما اسمش درست هست؟ TextBox1 نيست؟

اسمش مشکلی نداره
----------------------

mahsa.n
یک شنبه 21 شهریور 1389, 12:09 عصر
دوست عزیز
گرید ویو قابلیت اضافه کردن رکورد نداره، باید از یک کنترل دیگه مثل دیتالیست استفاده کنید و یا اینکه خودتون با کد نویسی این قابلیت را ایجاد کنید
اما علت فعال نشدن RequiredFieldValidator این هست که CausesValidation به طور پیشفرض برای ButtonField ها برابر false هست و باید مقدار اون را به true ست کنید


<asp:ButtonField ButtonType="Button" Text="اضافه" CommandName="Insert" CausesValidation="True" />

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




گرید ویو قابلیت اضافه کردن رکورد نداره،

از دکمه اضافه برای ایجاد یک گرید ویو دیگه با اطلاعات سطر مربوط به دکمه اضافه استفاده میکنم

clover
یک شنبه 21 شهریور 1389, 13:19 عصر
وقتی مثلا دکمه اضافه مربوط به خط اول رو میزنم همه سطر ها req اشون فعال میشه چی کار کنم که فقط req مربوط به همون سطر فعال بشه؟
از دکمه اضافه برای ایجاد یک گرید ویو دیگه با اطلاعات سطر مربوط به دکمه اضافه استفاده میکنم

من متوجه نشدم، خب در این صورت اضافه چی معنی میده و چه نیازی به validation هست ؟
اگر دقیقا بفرمایید قصد دارید چه کاری انجام بدید بهتر میشه راهنمایی کرد.

mahsa.n
یک شنبه 21 شهریور 1389, 13:38 عصر
من همچین صفحه ای دارم
میخوام وقتی کاربر روی دکمه 'اضافه کردن به سبد' کلیک میکنه در صورتی که textbox خالی باشه req کنار textbox ظاهر بشه
ولی وقتی روی 'اضافه کردن به سبد' سطر اول کلیک میکنم req کنار همه textbox ها ظاهر میشه

clover
یک شنبه 21 شهریور 1389, 14:10 عصر
ولی وقتی روی 'اضافه کردن به سبد' سطر اول کلیک میکنم req کنار همه textbox ها ظاهر میشه
این مورد را میشه حل کرد اما اصولی نیست
روش صحیح این هست که شما یک دکمه Edit بذارید و در EditItemTemplate اجازه ی ویرایش تعداد را بدید

mahsa.n
یک شنبه 21 شهریور 1389, 14:22 عصر
روش صحیح این هست که شما یک دکمه Edit بذارید و در EditItemTemplate اجازه ی ویرایش تعداد را بدید
منظورتون رو متوجه نشدم میشه بیشتر توضیح بدین؟





این مورد را میشه حل کرد اما اصولی نیست

این روش رو هم بگین لطفا:لبخندساده:

clover
یک شنبه 21 شهریور 1389, 16:23 عصر
منظورتون رو متوجه نشدم میشه بیشتر توضیح بدین؟
اگر این تکست باکس هم به یکی از فیلد ها بایند بود اونوقت می تونستید از یک دکمه ی Edit استفاده کنید و Validator را در EditItemTemplate استفاده کنید، مسلما در هر لحظه فقط یک خط را می تونید ویرایش کنید و یک Validator بیشتر وجود نداره


این روش رو هم بگین لطفا

<asp:TemplateField HeaderText="تعداد سفارش">
<ItemTemplate>
<asp:TextBox runat="server" ID="TextBox"></asp:TextBox>
<asp:RequiredFieldValidator ID="rq" runat="server" ErrorMessage="*" Display="Dynamic" ControlToValidate="TextBox" Font-Size="11px" SetFocusOnError="true" ValidationGroup='<%# Container.DataItemIndex %>'></asp:RequiredFieldValidator>
</ItemTemplate>
</asp:TemplateField>

<asp:TemplateField ShowHeader="False">
<ItemTemplate>
<asp:Button ID="Button2" runat="server" CausesValidation="true" CommandName="Insert" Text="اضافه" ValidationGroup='<%# Container.DataItemIndex %>' />
</ItemTemplate>
</asp:TemplateField>

Vahid_moghaddam
یک شنبه 21 شهریور 1389, 18:04 عصر
یه روش دیگه هم اینه که یک تابع javascript یا jQuery سمت کلاینت بنویسید و validation رو با اون انجام بدید.

mahsa.n
یک شنبه 21 شهریور 1389, 18:51 عصر
من برای دکمه insert این کد رو گذاشتم ولی حالا error میده



int i = Convert.ToInt32(e.CommandArgument); //get the row index
GridViewRow selectedrow = ((GridView)e.CommandSource).Rows[i];//get the gridviewrow where the command is raise


به خط اول ارور میگیره
--------------------

یه روش دیگه هم اینه که یک تابع javascript یا jQuery سمت کلاینت بنویسید و validation رو با اون انجام بدید.
بلد نیستم:خجالت:

clover
دوشنبه 22 شهریور 1389, 00:45 صبح
به خط اول ارور میگیره
لطفا متن خطا رو ذکر کنید
چه چیزی را در CommandArgument به تابع ارسال می کنید ؟

mahsa.n
دوشنبه 22 شهریور 1389, 01:03 صبح
ارور:Input string was not in a correct format.

این کدامه:


protectedvoid Insert(object sender, GridViewCommandEventArgs e)
{
DataRow dr = Cart.NewRow();
int i = Convert.ToInt32(e.CommandArgument); //get the row indexبه این خط ارور میگیره
GridViewRow selectedrow = ((GridView)e.CommandSource).Rows[i];//get the gridviewrow where the command is raise
tblKharidKala.SerialNum = Convert.ToInt32(selectedrow.Cells[0].Text);//selectedrow.cell[0]==SerialNum
string item = selectedrow.Cells[0].Text;
.
.
.

clover
دوشنبه 22 شهریور 1389, 01:05 صبح
چه چیزی را در CommandArgument به تابع ارسال می کنید ؟

mahsa.n
دوشنبه 22 شهریور 1389, 01:12 صبح
چه چیزی را در CommandArgument به تابع ارسال می کنید ؟

اندیس سطری که دکمه اضافه در اون سطر فشرده شده

و




<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" "
DataKeyNames="SerialNum" DataSourceID="SqlDataSource1" ."
OnRowCommand="Insert"

clover
دوشنبه 22 شهریور 1389, 01:17 صبح
اندیس سطری که دکمه اضافه در اون سطر فشرده شده
دوست عزیز
من هم قبل از اینکه شما بفرمایید متوجه این موضوع بودم، لطفا کد مربوط به دکمه Insert و حتی اگر مقدور هست کل گرید را قرار بدید تا بشه راهنمایی کرد

mahsa.n
دوشنبه 22 شهریور 1389, 01:20 صبح
protectedvoid Insert(object sender, GridViewCommandEventArgs e)
{
DataRow dr = Cart.NewRow();
int i = Convert.ToInt32(e.CommandArgument); //get the row index
GridViewRow selectedrow = ((GridView)e.CommandSource).Rows[i];//get the gridviewrow where the command is raise
tblKharidKala.SerialNum = Convert.ToInt32(selectedrow.Cells[0].Text);//selectedrow.cell[0]==SerialNum
string item = selectedrow.Cells[0].Text;
TextBox count = selectedrow.FindControl("txtTedadeKharid") asTextBox;
tblKharidKala.UserName = Session["username"].ToString();
DateTime d = DateTime.Now;
tblKharidKala.DateOfKharid = d;
tblKharidKala.TedadKharid =int.Parse(count.Text);
string Price = selectedrow.Cells[1].Text;//selectedrow.cell[1]==Price
if (e.CommandName == "Insert")
{
dr[0] = item;
dr[1] = Price;
dr[2]=count.Text;
Cart.Rows.Add(dr);
db.KharidKalas.InsertOnSubmit(tblKharidKala);
db.SubmitChanges();
}
else
{ // remove from Cart
CartView.RowFilter = "SerialNumber='" + item + "'";
if (CartView.Count > 0)
CartView.Delete(0);
CartView.RowFilter = "";
var q1 = (from k1 in db.KharidKalas
where k1.SerialNum == int.Parse(item) && k1.UserName == Session["username"].ToString()
select k1).FirstOrDefault();
db.KharidKalas.DeleteOnSubmit(q1);
db.SubmitChanges();
}
shopCart.DataBind();
}

mahsa.n
دوشنبه 22 شهریور 1389, 01:27 صبح
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" gridlines="horizontal"
DataKeyNames="SerialNum" DataSourceID="SqlDataSource1" EmptyDataText="There are no data records to display."
OnRowCommand="Insert"
cellpadding="5" font-size="8pt"
headerstyle-backcolor="darkslategray"
headerstyle-forecolor="khaki"
rowstyle-backcolor="ivory"
rowstyle-verticalalign="top">
<Columns>
<asp:BoundField DataField="SerialNum" HeaderText="شماره سریال" ReadOnly="True"
SortExpression="SerialNum" />
<asp:BoundField DataField="Price" HeaderText="قیمت" SortExpression="Price" />
<asp:BoundField DataField="Tedad" HeaderText="تعداد" SortExpression="Tedad" />
<asp:BoundField DataField="Date" HeaderText="تاریخ" SortExpression="Date" />
<asp:BoundField DataField="Name" HeaderText="نام" SortExpression="Name" />
<asp:BoundField DataField="Color" HeaderText="رنگ" SortExpression="Color" />

mahsa.n
دوشنبه 22 شهریور 1389, 01:29 صبح
بقیه گرید:



<asp:TemplateField HeaderText="تعداد سفارش">
<ItemTemplate>

<asp:TextBox runat="server" ID="txtTedadeKharid"></asp:TextBox>
<asp:RequiredFieldValidator ID="rq" runat="server" ErrorMessage="*" Display="Dynamic" ControlToValidate="txtTedadeKharid" Font-Size="11px"
SetFocusOnError="true" ValidationGroup='<%# Container.DataItemIndex %>'></asp:RequiredFieldValidator>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField ShowHeader="False">
<ItemTemplate>
<asp:Button ID="Button2" runat="server" CausesValidation="true" CommandName="Insert" Text="اضافه" ValidationGroup='<%# Container.DataItemIndex %>' />
</ItemTemplate>
</asp:TemplateField>

<asp:ButtonField ButtonType="Button" Text="حذف" CommandName="Del" />

</Columns>
</asp:GridView>
<asp:SqlDataSource ID="SqlDataSource1" runat="server"
ConnectionString="<%$ ConnectionStrings:ConnectionString %>"
SelectCommand="SELECT * FROM [Kala]"></asp:SqlDataSource>

clover
دوشنبه 22 شهریور 1389, 01:59 صبح
اندیس مورد نظر را باید توسط خصوصیت CommandArgument به تابع ارسال کنید، خصوصیت CommandArgument دکمه ی Button2 را به صورت زیر ست کنید:

CommandArgument='<%# Container.DataItemIndex %>'

موفق باشید

mahsa.n
دوشنبه 22 شهریور 1389, 02:18 صبح
پس به جای
int i = Convert.ToInt32(e.CommandArgument); //get the row index
GridViewRow selectedrow = ((GridView)e.CommandSource).Rows[i];
چی بذارم؟
آخه بازم ارور گرفته:Unable to cast object of type 'System.Web.UI.WebControls.Button' to type 'System.Web.UI.WebControls.GridView'.

clover
دوشنبه 22 شهریور 1389, 02:51 صبح
پس به جای
int i = Convert.ToInt32(e.CommandArgument); //get the row index
GridViewRow selectedrow = ((GridView)e.CommandSource).Rows[i];
چی بذارم؟
آخه بازم ارور گرفته:Unable to cast object of type 'System.Web.UI.WebControls.Button' to type 'System.Web.UI.WebControls.GridView'.

خب شما اگر به متن خطاها دقت کنید و همینطور از امکانات دیباگر استفاده کنید به سادگی می تونید مشکلات و خطاها رو برطرف کنید. این باعث بالا رفتن سرعت کارتون میشه.

در اینجا e.CommandSource همان منبع فرمان هست که یک شی از نوع Button هست در حالی که شما می خواهید به عنوان یک GridView ازش استفاده کنید
شما باید از پارامتر sender برای این منظور استفاده کنید