ABA


"צריך עזרה | ASP.NET"
גירסת הדפסה        
קבוצות דיון בניית אתרים נושא #14692 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 14692
ronen333 
חבר מתאריך 20.2.03
6069 הודעות
   20:57   22.12.08   
אל הפורום  
  צריך עזרה | ASP.NET  
 
   היי חברים .
יש לי REPEATER שמציג מוצרים ב'סל הקניות' מDATASET שמכיל את המוצרים שנבררו.
עכשיו, הבעיה שלי היא שאני רוצה להוסיף שדה טקסט (TEXTBOX) ושיהיה קשר בין בעצם השורה באותו DATATABLE לבין השדה טקסט הזה כדי שהמשתמש יוכל לבחור את הכמות של אותו מוצר אותו הוא מזמין.
ואני לא יכול לעשות את זה.. כאילו להכניס TEXTBOX לא קשור לREAPTER ואז נגיד להגיד לשורה מסוימת בDATATABLE לקחת את הTEXTBOX המסוים הזה שבאותו שורה איתו.
המחשה וויזואלית שאולי תעזור (?):
http://rotter.name/User_files/nor/494fe2771df5634d.gif

קצת מסובך להסביר את זה אבל אני מקווה שהבנתם. אני ממש חייב עזרה בדבר הזה חבר'ה אני אהיה אסיר תודה לעוזרים


                                שתף        
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

  האשכול     מחבר     תאריך כתיבה     מספר  
  לא ממש מובן.. בלשון המעטה.. lior066 23.12.08 00:32 1
     וודאי :) ronen333  23.12.08 09:26 2
         ניסתי לעשות ככה'' ronen333  23.12.08 09:46 3
             תוסיף אותו כ TEXTBOX של המערכת lior066 23.12.08 14:52 4
                 אני מקווה שהבנתי אותך ronen333  23.12.08 16:21 5
                     הפתרון: ronen333  23.12.08 16:45 6
                         יפה אחי ידעתי שתבין את זה בסוף.. lior066 24.12.08 03:42 7
                             שוב תודה רבה אחי :) ronen333  24.12.08 10:32 8
                                 לפי הקוד שהראת ... lior066 24.12.08 13:21 9

       
lior066

   00:32   23.12.08   
אל הפורום  
  1. לא ממש מובן.. בלשון המעטה..  
בתגובה להודעה מספר 0
 
   ערכתי לאחרונה בתאריך 23.12.08 בשעה 00:32 בברכה, lior066
 
תנסה לעשות חיפוש של קונטרול ואז לשייך אותו , תתן ל TEXTBOX ID ייחודי שתוכל לקשר בינו לבין ה DATATABLE , זה הדבר היחיד שאני יכול להגיד לך כי לא הבנתי ממש מה התכוונת...

אם תוכל להוסיף טיפה קוד מקור של ה ASPX ושל ה.CS ..


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ronen333 
חבר מתאריך 20.2.03
6069 הודעות
   09:26   23.12.08   
אל הפורום  
  2. וודאי :)  
בתגובה להודעה מספר 1
 
   ערכתי לאחרונה בתאריך 23.12.08 בשעה 09:27 בברכה, ronen333
 
הנה החלק של הREPEATER בSOURCE-

<table border="1">
<tr>

<td>
#
</td>

<td>
מוצר
</td>

<td>
כמות
</td>

<td>
מחיר
</td>

<td>
מחק
</td>

</tr>
<asp:Repeater ID="Bucket_Repeater" runat="server">
<ItemTemplate>
<tr>

<td>
<img src="<%#DataBinder.Eval(Container.DataItem, "item_picture")%>" height="120px" width="120px" alt="" />
</td>

<td>
<%#DataBinder.Eval(Container.DataItem, "item_name")%>
</td>

<td>
<input id="amountbox<%#DataBinder.Eval(Container.DataItem, "item_id")%>" type="text" value="1" />
</td>

<td>
<%#DataBinder.Eval(Container.DataItem, "item_price")%>
</td>

<td>
<a href='Order.aspx?DeleteID=<%#DataBinder.Eval(Container.DataItem, "item_id")%>'>X</a>
</td>
</tr>
</ItemTemplate>
</asp:Repeater>
<tr >
<td>מחיר כולל:</td>
<td colspan="4">
<asp:Label ID="TotalPrice_LBL" runat="server" Text=""></asp:Label>
</td>
</tr>

</table>


עכשיו לי דווקא נדמה שהבנת את הבעיה.. אין ID שיכול לקשר בין הDATATABLE לTEXTBOX. אן אני שם פקד INPUT TEXT אז אני יכול לשרשר אילו ID של המוצר אך אני לא יכול לגשת בCODE BEHIND אילו(הוא ללא RUNAT=SERVER, ואם אני שם פקד TEXTBOX של ASP.NET זה ביכלל לא יתן לי כי הפקד רץ כנראה לפני ה<%#DataBinder.Eval(Container.DataItem, "item_id")%> ולא ניתן לשרשר לID שלו את זה.


נניח שיש לי בסל עכשיו כמה מוצרים, ובמוצר הראשון שמים כמות 2 ובמוצר השני שמשאירים כמות 1. המשך הליך קניה. בהמשך הליך קניה אני רוצה בעצם להשים בשורה משוימת שבDATATABLE שלי את הכמות שמשתייחת לכל מוצר. וזאת הבעיה.

הקובץ CS לדעתי קצת יהיה מיותר להוסיף כי הוא פשוט מבצע כל כך הרבה פעולות ובתכ'לס הוא לא משנה כי אין מימוש למה שלא הצלחתי XD וחשוב רק להבין איך ניתן להכניס פקד לא קשור לחלק מREAPTER. אבל אם את רוצה אז בבקשה :


public partial class Order : System.Web.UI.Page
{
private Stack MakeCollection()
{
string st = Session["StoreBucket"].ToString();
string id = "";
Stack mystack = new Stack();
bool Nofirst = false;
for (int i = 0; i < st.Length; i++)
{
if (st[i] == ',')
{
if (Nofirst == true)
{
mystack.Push(id);
}
id = "";
Nofirst = true;
}
else
id += st[i];


}
return mystack;
}
private DataSet GetSelectedProducts(Stack mystack)
{

if (mystack.Count >0)
{
DataSet newds = new DataSet();
localhost.Service ms = new localhost.Service();

DataSet products = ms.GetProducts();
DataTable dt = products.Tables[0].Clone();
for (int i = 0; i < products.Tables[0].Rows.Count; i++)
{
foreach (string id in mystack)
{
if (id.ToString() == products.Tables[0].Rows[i][0].ToString())
{
dt.ImportRow(products.Tables[0].Rows[i]);
}

}

}

newds.Tables.Add(dt);
return newds;
}
return null;


}
private void BindRepeater(DataSet ds)
{
Bucket_Repeater.DataSource = ds;
Bucket_Repeater.DataBind();
}
private Stack DeleteIDFromStack(string id, Stack sta)
{
Stack sta2 = new Stack();
string stackid;
while (sta.Count != 0)
{
stackid=sta.Peek().ToString();
if (id != stackid)
sta2.Push(sta.Pop());
else
sta.Pop();
}
while (sta2.Count != 0)
{
sta.Push(sta2.Pop());
}
return sta;

}
static Stack mystack;
static DataSet SelectedProducts;
protected void Page_Load(object sender, EventArgs e)
{
if (Session["StorePermission"] != null && Session["username"] != null)
{
Panel1.Visible = true;
Buttons_Panel.Visible = false;
if (Request.QueryString["DeleteID"] != null)
{
string delid = Request.QueryString["DeleteID"].ToString();
mystack = DeleteIDFromStack(delid, mystack);
SelectedProducts = GetSelectedProducts(mystack);
if (SelectedProducts != null)
{
BindRepeater(SelectedProducts);
SumTotalPrice();
}
}
else
{


if (Page.IsPostBack == false)
{
mystack = MakeCollection();

SelectedProducts = GetSelectedProducts(mystack);
if (SelectedProducts != null)
{
BindRepeater(SelectedProducts);
SumTotalPrice();
}
else
Response.Write("סלך ריק");

}
}


}
else
{
Panel1.Visible = false;
Response.Write("אינך לקוח בחנות");
}
}
private void SumTotalPrice()
{
//3
double sum = 0;
for (int i = 0; i < SelectedProducts.Tables[0].Rows.Count; i++)
{
sum += int.Parse(SelectedProducts.Tables[0].Rows[i][3].ToString());
}
TotalPrice_LBL.Text = sum.ToString();

}
protected void BuyButton_Click(object sender, EventArgs e)
{
Buttons_Panel.Visible = true;
}

protected void MakeOrderButton_Click(object sender, EventArgs e)
{
localhost.Service ms = new localhost.Service();
int customer_id = int.Parse(Session["StorePermission"].ToString());
int credit_type=int.Parse(card_type.SelectedItem.Value.ToString());
string date = System.DateTime.Now.Day + "/" + System.DateTime.Now.Month + "/" + System.DateTime.Now.Year;

ms.AddOrder(date, SelectedProducts, customer_id,credit_type , expires_date.Text);
OrderMessage.Text = "הזמנתך התבצעה בהצלחה";
}
}

בפעולה BuyButton_Click אני רוצה בעצם להשים בSelectedProducts.Tables[0].Rows[i][2] את הכמות המתאימה לו.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ronen333 
חבר מתאריך 20.2.03
6069 הודעות
   09:46   23.12.08   
אל הפורום  
  3. ניסתי לעשות ככה''  
בתגובה להודעה מספר 2
 
   ערכתי לאחרונה בתאריך 23.12.08 בשעה 10:20 בברכה, ronen333
 
תיכננתי למצוא את הפקד ואז פשוט להוסיף אותו לשורה בDATATABLE אבל זה רושם לי שהCONTROL שלי NULL. הוא לא קולט INPUT כפקד?

protected void BuyButton_Click(object sender, EventArgs e)
{
Buttons_Panel.Visible = true;
for(int i=0;i<SelectedProducts.Tables[0].Rows.Count;i++)
{
Control control=Bucket_Repeater.FindControl("amountbox" + SelectedProducts.Tables[0].Rows[i][0].ToString());
if (control != null)
{
TextBox textbox = (TextBox)control;
SelectedProducts.Tables[0].Rows[i][2] = textbox.Text;
Response.Write(SelectedProducts.Tables[0].Rows[i][2].ToString());
}
else
Response.Write("control is null");
}

}


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
lior066

   14:52   23.12.08   
אל הפורום  
  4. תוסיף אותו כ TEXTBOX של המערכת  
בתגובה להודעה מספר 3
 
   ערכתי לאחרונה בתאריך 23.12.08 בשעה 14:56 בברכה, lior066
 
אחרי שאתה מוסיף אותו כפקד של המערכת אתה יכול לעשות קאסטינג לפקד ולקחת ממנו את הנתונים , כשאתה בונה את זה בתוך הטמפלט פשוט תגרור פקד של TEXTBOX ואז בריפיטר אתה אמור לעשות חיפוש של קונטרולים , אם הקוטנרול הוא TEXTBOX , ויש לו מאפיין מסויים ( כאן אתה לא צריך כי אתה עובד עם 1 נכון?! ) אז אתה פשוט מבקש ממנו את הערך שבתוך הקונטרול עצמו... וואלה! נגמר הסיפור..

עכשיו אני לא בטוח שהקומפיילר ייתן לך לתת לו ID משתנה לפקד כי הוא אמור להתקמפל בזמן ריצה אז אמור להיות לו ID אחד משתנה עבור כל הריפיטרים אתה צריך לעשות מעבר על כל הקונטרולים בריפיטר , לא לפי חיפוש ספציפי..


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ronen333 
חבר מתאריך 20.2.03
6069 הודעות
   16:21   23.12.08   
אל הפורום  
  5. אני מקווה שהבנתי אותך  
בתגובה להודעה מספר 4
 
   ערכתי לאחרונה בתאריך 23.12.08 בשעה 16:34 בברכה, ronen333
 
עשיתי כך: (לאחר שהחלפתי את הפקד מINPUT לTEXTBOX כמובן)

protected void BuyButton_Click(object sender, EventArgs e)
{
if (SelectedProducts != null)
{
Buttons_Panel.Visible = true;
for (int i = 0; i < SelectedProducts.Tables[0].Rows.Count; i++)
{
TextBox mybox = ((Bucket_Repeater.Items[i].Controls[0]) as TextBox);
if (mybox != null)
Response.Write(mybox.Text);
else
Response.Write("null");

}
}

}

מדפיס לי NULL.
אחי תוכל להתחבר למסנג'ר?

עריכה:
בדקתי דרך BREAK POINT כמה CONTROLS יש.. וזה מראה לי 5. כאשר הראשון זה
= {System.Web.UI.DataBoundLiteralControl}
השני זה
= {System.Web.UI.WebControls.TextBox}
מה שאני זקוק לו..
השלישי זה-
= {System.Web.UI.DataBoundLiteralControl}
והרביעי והחמישי זה NULL.
עכשיו שאני יודע שהשני זה הTEXTBOX שלי זה עובד.. אבל הייתי רוצה לדעת למה יש 5 CONTROLS..
יש לך מושג למה?


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ronen333 
חבר מתאריך 20.2.03
6069 הודעות
   16:45   23.12.08   
אל הפורום  
  6. הפתרון:  
בתגובה להודעה מספר 5
 
   ערכתי לאחרונה בתאריך 23.12.08 בשעה 16:46 בברכה, ronen333
 

protected void BuyButton_Click(object sender, EventArgs e)
{
if (SelectedProducts != null)
{
try
{
Buttons_Panel.Visible = true;
for (int i = 0; i < SelectedProducts.Tables[0].Rows.Count; i++)
{
TextBox mybox = ((Bucket_Repeater.Items[i].Controls[1]) as TextBox);
if (mybox != null)
{
SelectedProducts.Tables[0].Rows[i][2] = mybox.Text;
}
else
throw new Exception("TextBox can not be null");
}
}
catch (Exception ex)
{
OrderMessage.Text = ex.Message;
}
}

}

השאלה לגבי הCONTOLS אבל עדיין תקפה .
ותודה רבה ליאור, אתה גדול!


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
lior066

   03:42   24.12.08   
אל הפורום  
  7. יפה אחי ידעתי שתבין את זה בסוף..  
בתגובה להודעה מספר 6
 
   בקשר ל5 קונטרולים ,
יש לך דרך פשוטה לבדוק איזה קונטרולים הם פשוט להדפיס את ה TYPE שלהם, אבל לפי דתעתי זה קונטרולים של הטמפלט של הריפיטר ובטח של הקריאות לDATASET


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ronen333 
חבר מתאריך 20.2.03
6069 הודעות
   10:32   24.12.08   
אל הפורום  
  8. שוב תודה רבה אחי :)  
בתגובה להודעה מספר 7
 
   אבל אם זה באמת לפי הקריאות לDATASET אז למה זה לא יצא מקום 3? יש שני DATABOUND לפניו.. התמונה של המוצר, והשם של המוצר.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
lior066

   13:21   24.12.08   
אל הפורום  
  9. לפי הקוד שהראת ...  
בתגובה להודעה מספר 8
 
   זה נראה כמו תגיות פתיחה וסגירה של הרפיטר.. לא יודע אם זה משהו אחר.. אם בא לך לחקור , תעשה קאסטינג לקונטרולים ותעביר ל TOSTRING ותראה מה יש בפנים..


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

תגובה מהירה  למכתב מספר: 
 
___________________________________________________________________

___________________________________________________________________
למנהלים:  נעל | תייק בארכיון | מחק | העבר לפורום אחר | מחק תגובות | עגן אשכול
       



© כל הזכויות שמורות ל-רוטר.נט בע"מ rotter.net