none
GridView動態產生之textbox,使用button讓它+-值 RRS feed

  • 問題

  • 我的GridView內有動態產生一textbox
    textbox有從資料庫中抓出一個數值
    而textbox旁有兩個按鈕
    希望這兩個按鈕被按下時,textbox內的值能+-1

    請問各位前輩
    如果設定比較流暢呢?

    應該把程式寫在GridView裏,還是寫在button裏呢?

    謝謝指導
    2009年7月27日 上午 07:25

解答

  • 您可以參考這樣的語法 :

     protected void ImageButtonUp_Click(object sender, ImageClickEventArgs e)

        {

            int addInt = Convert.ToInt16(((TextBox)((GridViewRow)((ImageButton)sender).Parent.Parent).FindControl("TextBox1")).Text);

            addInt += 1;

            ((TextBox)((GridViewRow)((ImageButton)sender).Parent.Parent).FindControl("TextBox1")).Text = addInt.ToString();

        }

        protected void ImageButtonDown_Click(object sender, ImageClickEventArgs e)

        {

            int minInt = Convert.ToInt16(((TextBox)((GridViewRow)((ImageButton)sender).Parent.Parent).FindControl("TextBox1")).Text);

            minInt -= 1;

            ((TextBox)((GridViewRow)((ImageButton)sender).Parent.Parent).FindControl("TextBox1")).Text = minInt.ToString();

        }


    微軟技術支援中心(CSS) - http://www.dotblogs.com.tw/lolota/
    • 已標示為解答 Lolota Lee 2009年7月28日 上午 05:37
    2009年7月27日 上午 10:42

所有回覆

  • 用 script 來寫比較好,也比較快(因為不會有PostBack)。
    小人物一枚。
    2009年7月27日 上午 07:29
    版主
  • 您可以考慮用這個ASP.NET AJAX TOOLKIT中的NumbericUpDown控制項:
    http://www.asp.net/AJAX/AjaxControlToolkit/Samples/NumericUpDown/NumericUpDown.aspx


    微軟技術支援中心(CSS) - http://www.dotblogs.com.tw/lolota/
    2009年7月27日 上午 07:32
  • 用 script 來寫比較好,也比較快(因為不會有PostBack)。
    小人物一枚。

    不好意思,可以請問一下script來寫的話應該是怎麼寫呢?
    (我還不太會...新手@@)
    2009年7月27日 上午 07:41
  • 您可以考慮用這個ASP.NET AJAX TOOLKIT中的NumbericUpDown控制項:
    http://www.asp.net/AJAX/AjaxControlToolkit/Samples/NumericUpDown/NumericUpDown.aspx


    微軟技術支援中心(CSS) - http://www.dotblogs.com.tw/lolota/

    恩恩 我進去看了
    但這是一個教學網站嗎?
    英文不太好...
    還是他只有展示?
    2009年7月27日 上午 07:43
  • 以下為概念程式:

    // jQuery Core required.
    
    function add(textboxid, num)
    {
        $("#" + textboxid).value +=
            parseInt($("#" + textboxid).value) + num;
    }
    
    function subtract(textboxid, num)
    {
        $("#" + textboxid).value -=
            parseInt($("#" + textboxid).value) + num;
    }
    然後在 Server 端:

    cmdAdd.OnClientClick = "add('" + cmdAdd.ClientID + "', 1); return false";
    cmdSubtract.OnClientClick = "subtract('" + cmdSubtract.ClientID + "', 1); return false";

    小人物一枚。
    2009年7月27日 上午 07:56
    版主
  • 以下為概念程式:

    // jQuery Core required.
    
    
    
    function add(textboxid, num)
    
    {
    
        $("#" + textboxid).value +=
    
            parseInt($("#" + textboxid).value) + num;
    
    }
    
    
    
    function subtract(textboxid, num)
    
    {
    
        $("#" + textboxid).value -=
    
            parseInt($("#" + textboxid).value) + num;
    
    }
    
    
    然後在 Server 端:

    cmdAdd.OnClientClick = "add('" + cmdAdd.ClientID + "', 1); return false";
    
    cmdSubtract.OnClientClick = "subtract('" + cmdSubtract.ClientID + "', 1); return false";

    小人物一枚。
    ㄜ....
    完全不了解它們的使用時機....
    function add(textboxid, num)
    function subtract(textboxid, num)
    這兩個是加在aspx.cs頁嗎?

    cmdAdd.OnClientClick = "add('" + cmdAdd.ClientID + "', 1); return false";
    是放在哪裏呢?

    sorry這問題一定很笨...

    2009年7月27日 上午 08:08
  • 您可以考慮用這個ASP.NET AJAX TOOLKIT中的NumbericUpDown控制項:
    http://www.asp.net/AJAX/AjaxControlToolkit/Samples/NumericUpDown/NumericUpDown.aspx


    微軟技術支援中心(CSS) - http://www.dotblogs.com.tw/lolota/

    恩恩 我進去看了
    但這是一個教學網站嗎?
    英文不太好...
    還是他只有展示?

    這裡面也有屬性的設定方式:

    <ajaxToolkit:NumericUpDownExtender ID="NUD1" runat="server"
        TargetControlID="TextBox1" 
        Width="100"
        RefValues="January;February;March;April"
        TargetButtonDownID="Button1"
        TargetButtonUpID="Button2"
        ServiceDownPath="WebService1.asmx"
        ServiceDownMethod="PrevValue"
        ServiceUpPath="WebService1.asmx"
        ServiceUpMethod="NextValue"
        Tag="1" />
    • TargetControlID - The ID of the TextBox to modify
    • Width - Combined size of the TextBox and Up/Down buttons (min value 25). This property is not used if you provide custom buttons.
    • RefValues - A list of strings separated by semicolons (;) to be used as an enumeration by NumericUpDown
    • Step - Step used for simple numeric incrementing and decrementing. The default value is 1.
    • TargetButtonDownID/TargetButtonUpID - Reference to custom Up/Down buttons.
    • ServiceDownPath/ServiceUpPath - Path to a web service that returns the data used to get the next or previous value. This property should be left null if ServiceUpMethod or ServiceDownMethod refers to a page method. The web service should be decorated with the System.Web.Script.Services.ScriptService attribute.
    • ServiceDownMethod/ServiceUpMethod - Web service method that returns the data used to get the next or previous value, or the name of a method declared on the Page which is decorated with the WebMethodAttribute. The signature of this method must match the following:
      [System.Web.Services.WebMethod]
      [System.Web.Script.Services.ScriptMethod]
      public int NextValue(int current, string tag) { ... }
      Note you can replace "NextValue" with a name of your choice, but the return type and parameter name and type must exactly match, including case.
    • Tag - Specifies a custom parameter to pass to the Web Service
    • Minimum - The minimum value allowed by the extender. Currently, it does not prevent out of range values from being entered into the textbox even if Minimum or Maximum are specified on the extender, but using the up/down buttons should bring the value into the allowed range when clicked.
    • Maximum - The maximum value allowed by the extender.
    http://ajaxcontroltoolkit.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=27326

    不過, 我建議您還是先從button著手, 先做出這個功能.
    可以在Button的Click事件中做+1/-1



    微軟技術支援中心(CSS) - http://www.dotblogs.com.tw/lolota/
    2009年7月27日 上午 08:28
  • 喔 所以是下載組件的方式囉@@"

    其實我還是比較想用寫程式的方式,但我一直錯誤@@
        protected void ImageButton4_Click(object sender, ImageClickEventArgs e)
        {
            TextBox t;
            t = (TextBox)((GridViewRow)((ImageButton)sender).Parent.Parent).FindControl("TextBox18");
            t.Text = Convert.ToString(Convert.ToInt32(t.Text) + 1);
         }
    

     

    目前語法為以上,但按下去之後,完全不起任何反應
    還請前輩指導^^"

    2009年7月27日 上午 09:03
  • 您可以參考這樣的語法 :

     protected void ImageButtonUp_Click(object sender, ImageClickEventArgs e)

        {

            int addInt = Convert.ToInt16(((TextBox)((GridViewRow)((ImageButton)sender).Parent.Parent).FindControl("TextBox1")).Text);

            addInt += 1;

            ((TextBox)((GridViewRow)((ImageButton)sender).Parent.Parent).FindControl("TextBox1")).Text = addInt.ToString();

        }

        protected void ImageButtonDown_Click(object sender, ImageClickEventArgs e)

        {

            int minInt = Convert.ToInt16(((TextBox)((GridViewRow)((ImageButton)sender).Parent.Parent).FindControl("TextBox1")).Text);

            minInt -= 1;

            ((TextBox)((GridViewRow)((ImageButton)sender).Parent.Parent).FindControl("TextBox1")).Text = minInt.ToString();

        }


    微軟技術支援中心(CSS) - http://www.dotblogs.com.tw/lolota/
    • 已標示為解答 Lolota Lee 2009年7月28日 上午 05:37
    2009年7月27日 上午 10:42
  • 謝謝前輩指導,的確成功了,感謝^^

    另外想請問有在不重整頁面的情況低下刪除gridview的row的方法嗎?

    因為另外還有一個刪除的按鈕

    謝謝指導^^"
    2009年7月28日 上午 02:40
  • 要刪除gridView的資料列, 一定會回到Server處理後再傳到Client,
    如果您要刪除資料列, 可以從資料的來源下手.


    微軟技術支援中心(CSS) - http://www.dotblogs.com.tw/lolota/
    2009年7月28日 上午 05:37
  • 要刪除gridView的資料列, 一定會回到Server處理後再傳到Client,
    如果您要刪除資料列, 可以從資料的來源下手.


    微軟技術支援中心(CSS) - http://www.dotblogs.com.tw/lolota/
    但是因為現在資料列裏有+-按鈕所帶動的textbox,而這個textbox裏的值在被+-後是我所而要的,但資料列中又有一個刪除鈕,而這個刪除按鈕按下後,頁面又重整了,textbox裏得值又會重整了,所以這下該怎麼辦呢...
    2009年7月28日 上午 05:56
  • 可以用HiddenFiled控制項去存控制項內容.


    微軟技術支援中心(CSS) - http://www.dotblogs.com.tw/lolota/
    2009年7月28日 上午 05:58
  • 可以用HiddenFiled控制項去存控制項內容.


    微軟技術支援中心(CSS) - http://www.dotblogs.com.tw/lolota/

    還不大會運用HiddenFiled,是把它放在同一列中嗎?
    它要設定value,那應該如何設定?

    sorry,一定又是一個笨問題@@"
    2009年7月28日 上午 06:11
  • 放到跟TextBox同一個cell中, 然後指定Textbox選定後的值給它.
    刪除後再回寫給TextBox


    微軟技術支援中心(CSS) - http://www.dotblogs.com.tw/lolota/
    2009年7月28日 上午 06:13
  • 放到跟TextBox同一個cell中, 然後指定Textbox選定後的值給它.
    刪除後再回寫給TextBox


    微軟技術支援中心(CSS) - http://www.dotblogs.com.tw/lolota/
    第一次使用HiddenField 不知道這樣用正不正確

    .aspx
    <asp:GridView ID="GridView1" runat="server" OnRowDataBound="GV_RowDataBound"
    autogeneratecolumns="False">
    <columns>
                          <asp:TemplateField HeaderText="MOQ">
                        <ItemTemplate>  
                             <asp:ImageButton ID="btnSub" runat="server" ImageUrl="bk_images/MinusButton.jpg" ValidationGroup="Group5" />  
                             <asp:TextBox ID="TextBox18" runat="server" Text='<%# Eval("moq") %>' Width="30px" ValidationGroup="Group5" Enabled="False"></asp:TextBox>  
                             <asp:ImageButton ID="btnAdd" runat="server" ImageUrl="bk_images/AddButton.jpg" ValidationGroup="Group5" />  
                             <asp:HiddenField ID="HiddenField1" runat="server" Visible="True" />
                         </ItemTemplate>  
                              <EditItemTemplate>
                                  <asp:Label ID="Label1" runat="server" Text='<%# Eval("moq") %>'></asp:Label>
                              </EditItemTemplate>
                              <ItemStyle Width="90px" />
                    </asp:TemplateField>
            </columns>
            </asp:GridView>


    .aspx.cs
       protected void GV_RowDataBound(object sender, GridViewRowEventArgs e)
        {
           if (e.Row.RowType == DataControlRowType.DataRow)
            {
                HiddenField hf = (HiddenField)e.Row.FindControl("HiddenField1");
                TextBox txtQuantity = (TextBox)e.Row.FindControl("TextBox18");
    
                hf.Value = txtQuantity.Text;
            }
         }

    但這樣之後,要如何在重整後,textbox能自動抓到HiddenField裏的值我就完全沒有頭緒了
    還請前輩指教,謝謝^^"
    2009年7月28日 上午 07:23
  •  protected void GV_RowDataBound(object sender, GridViewRowEventArgs e)
        {
           if (e.Row.RowType == DataControlRowType.DataRow)
            {   
                 //將HiddenField的值給予textBox18
                 ((TextBox)e.Row.FindControl("TextBox18")).Text = ((HiddenField)e.Row.FindControl("HiddenField1")).Value;
            
            }
         }



    不用再弄一個變數來處理.
    微軟技術支援中心(CSS) - http://www.dotblogs.com.tw/lolota/
    2009年7月28日 上午 07:32
  •  protected void GV_RowDataBound(object sender, GridViewRowEventArgs e)
        {
           if (e.Row.RowType == DataControlRowType.DataRow)
            {   
                 //將HiddenField的值給予textBox18
                 ((TextBox)e.Row.FindControl("TextBox18")).Text = ((HiddenField)e.Row.FindControl("HiddenField1")).Value;
            
            }
         }



    不用再弄一個變數來處理.
    微軟技術支援中心(CSS) - http://www.dotblogs.com.tw/lolota/

    恩恩 簡潔多了
    那再請問
    我現在頁面第一次產生的時候,HiddenField裏就有值了嗎?

    我應該是ispostback還是用if (HiddenFidld.Value !="")來寫我重整後的textbox呢?
    謝謝回答
    2009年7月28日 上午 07:37
  • HiddenFiled在剛產生時是沒有值的. 所以您可以用(HiddenFidld.Value !="") 來判斷.


    微軟技術支援中心(CSS) - http://www.dotblogs.com.tw/lolota/
    2009年7月28日 上午 07:43
  • HiddenFiled在剛產生時是沒有值的. 所以您可以用(HiddenFidld.Value !="") 來判斷.


    微軟技術支援中心(CSS) - http://www.dotblogs.com.tw/lolota/

    恩恩

    那此段程式應該在Page_Load裏對嗎?

    可請請教一下,在Page_Load裏如何FindControl GridView裏的控制項?

    還是說不用其實不是在Page_Load丫@@?
    2009年7月28日 上午 08:08
  • 如果要處理應該是在RowDataBound事件.


    微軟技術支援中心(CSS) - http://www.dotblogs.com.tw/lolota/
    2009年7月28日 上午 08:10
  • 如果要處理應該是在RowDataBound事件.


    微軟技術支援中心(CSS) - http://www.dotblogs.com.tw/lolota/

    恩恩
    我是這樣寫的
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                if (((HiddenField)e.Row.FindControl("HiddenField1")).Value != "") //有東西
                {
                    ((TextBox)e.Row.FindControl("TextBox18")).Text = ((HiddenField)e.Row.FindControl("HiddenField1")).Value; //hidden寫進textbox
                }
                else
                {
                    ((HiddenField)e.Row.FindControl("HiddenField1")).Value = ((TextBox)e.Row.FindControl("TextBox18")).Text; //textbox寫進hidden
                }
            }

    實際執行時,我在按完+後重整,數字還是回到原本的數目了
    請問我是否有哪邊語法不正確?
    謝謝
    2009年7月28日 上午 08:28
  • 如果要處理應該是在RowDataBound事件.


    微軟技術支援中心(CSS) - http://www.dotblogs.com.tw/lolota/

    請問我這樣寫正確嗎?
    2009年7月29日 上午 01:10
  • 您寫的正不正確, 我無法從這一個事件中就看出來. 這個事件看起來沒錯, 我建議您設定中斷點, 然後每各相關事件都去看.

    微軟技術支援中心(CSS) - http://www.dotblogs.com.tw/lolota/
    2009年7月29日 上午 01:14
  • 恩恩 好的 謝謝^^"
    2009年7月29日 上午 01:19