none
為什麼我用DropDownList去資料繫結..結果寫回去竟然給我寫主鍵回去..=_=" RRS feed

  • 問題

  • 原因是這樣的..
    我在一塊FormView(DefaultMode=Edit)裡面擺了DropDownList物件..
    然後SelectedValue去繫結(Bind)"資料表"其中一個"欄位"..
    結果我要回寫回去竟然給我寫"主鍵值"回去耶..0_0"
    而不是我繫結的SelectedValue...
    有沒有人遇到這種情況呢?...

    如果再不行的話..
    只好動手寫囉..=_="
    2009年4月10日 上午 02:40

解答

  • 在你的程式中, 你指定值給 SdsOrders.UpdateParameters["order_Status"].DefaultValue; 你不覺得有點不對嗎?

    其實如果你已經決定使用 FormView 搭配 SqlDataSource 做資料的顯示及更新, 你為何不採用它已經提供的功能? 如此你一行程式也不用寫, 就足夠把資料寫回資料庫, 甚至可以連 Insert 與 Delete 也一併做掉了。或許你可以看看這段教學影片:

    http://www.asp.net/learn/videos/video-07.aspx
     
    ASP.NET 2Share - http://phone.idv.tw/cs2/
    • 已提議為解答 Lolota Lee 2009年4月14日 上午 01:13
    • 已標示為解答 Lolota Lee 2009年4月16日 上午 03:01
    2009年4月10日 上午 06:28

所有回覆

  • 你最好說明一下你的資料來源是什麼 (SqlDataSource, OjbectDataSource, 還是什麼?), 而且你應該把程式碼貼上來。

    依我的經驗, 不會有如你描述的事情發生。
    ASP.NET 2Share - http://phone.idv.tw/cs2/
    2009年4月10日 上午 02:50
  • 程式碼就是幾乎沒有這塊的程式碼(要貼的話都是無關的..!)..
    DataSource物件是用SqlDataSource...
    因為這個我是用IDE工具提供的功能去拉和設定的=.="...
    真要看的話在下面...=.=""
    應該和這個沒甚麼關連..
    本人剛碰ASP.NET和C#不到兩個月(原本是寫Java的)..請見諒..!Orz..

        private static string[] ORDER_TYPE_PAYMENT = new string[] {"便利商店","信用卡","ATM轉帳"};
        private static int ROW_INDEX_PRODUCT_ID=1;
        private static int ROW_INDEX_PRODUCT_PRICE = 3;
        private static string NEW_VALUE_ORDER_PRODUCT_TYPE = "1";
    
        private string PRE_URL = "order_list.aspx";
        protected void Page_Load(object sender, EventArgs e)
        {
            GvOrderContent.DataBind();
        }
        protected void GvOrderContent_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            DataView dataView;
            string productId;
            if (e.Row.RowIndex > -1) { 
                productId=e.Row.Cells[ROW_INDEX_PRODUCT_ID].Text;
                SdsProducts.FilterExpression="product_ID='"+productId+"'";
                dataView = (DataView)SdsProducts.Select(DataSourceSelectArguments.Empty);
                e.Row.Cells[ROW_INDEX_PRODUCT_ID].Text = dataView[0]["product_Name"].ToString();
                e.Row.Cells[ROW_INDEX_PRODUCT_PRICE].Text = dataView[0]["product_Internet_Price"].ToString();
               
            }
            
        }
        protected void LabelOrderPerformerId_DataBinding(object sender, EventArgs e)
        {
            Label label = (Label)sender;
            label.Text = Session["Account"].ToString();
        }
        protected void LinkButtonPerformerDate_Click(object sender, EventArgs e)
        {
            Finder.ControlFinder cFinder = new Finder.ControlFinder();//這是個人自行撰寫的"控制項遞迴尋找器"..所以可以不用理他!!
            Calendar calendarOrderPerformedDate = (Calendar)cFinder.FindBase(FormViewOrder, "CalendarOrderPerformedDate");
            calendarOrderPerformedDate.Visible = true;
        }
        protected void CalendarOrderPerformedDate_SelectionChanged(object sender, EventArgs e)
        {
            Calendar calendarOrderPerformedDate = (Calendar)sender;
            Finder.ControlFinder cFinder = new Finder.ControlFinder();
            LinkButton label = (LinkButton)cFinder.FindBase(FormViewOrder, "LinkButtonPerformedDate");
            if (calendarOrderPerformedDate.SelectedDate >= DateTime.Now)
            {
                label.Text = calendarOrderPerformedDate.SelectedDate.ToShortDateString();
                calendarOrderPerformedDate.Visible = false;
            }
            else
            {
                label.Text = DateTime.Now.ToShortDateString();
                calendarOrderPerformedDate.SelectedDate = DateTime.Now;
                Response.Write("<script>alert('你選擇的日期小於現在日期!')</script>");
            }
    
        }
        protected void FormView1_DataBound(object sender, EventArgs e)
        {
            Finder.ControlFinder cFinder=new Finder.ControlFinder();
            FormView formViewOrder = (FormView)sender;
            Label labelOrderTypePayment = cFinder.FindLabel(formViewOrder,"LabelOrderTypePayment");
            int index=Convert.ToInt32(labelOrderTypePayment.Text);
    
            labelOrderTypePayment.Text = ORDER_TYPE_PAYMENT[index];
            
        }
        protected void LabelOrderCreatorId_DataBinding(object sender, EventArgs e)
        {
            Label label = (Label)sender;
            label.Text = MapAccount.GetAccount("mem_Account", "mem_ID", label.Text,"Members", "Subutero20090217");
        }
        protected void OrderButton_Command(object sender, CommandEventArgs e)
        {
            Finder.ControlFinder cFinder = new Finder.ControlFinder();
            if (e.CommandName == "Update") {
                initUpdateParameters(FormViewOrder, cFinder);
                updateDataToDataBase();
            }
    
            if (e.CommandName == "Previous") {
                Response.Redirect(PRE_URL);
            }
        }
    
        private void initUpdateParameters(FormView formView,Finder.ControlFinder cFinder) { 
            //for orders
            LinkButton linkButtonPerformedDate=(LinkButton)cFinder.FindBase(formView,"LinkButtonPerformedDate");
            DropDownList dropDownListStatus=(DropDownList)cFinder.FindBase(formView,"DropDownListOrderStatus");
            SdsOrders.UpdateParameters["order_Performed_Date"].DefaultValue = linkButtonPerformedDate.Text;
            SdsOrders.UpdateParameters["order_Status"].DefaultValue = dropDownListStatus.SelectedValue;
            //for order_contents
            //nothing...!
        
        }
        private void updateDataToDataBase() {
            SdsOrders.Update();
           // SdsOrderContent.Update();
        }
    2009年4月10日 上午 03:01
  • 你是否在 PK 鍵後面的欄位,還有一欄以上索引是設定為唯一鍵?


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    2009年4月10日 上午 06:01
  • 在你的程式中, 你指定值給 SdsOrders.UpdateParameters["order_Status"].DefaultValue; 你不覺得有點不對嗎?

    其實如果你已經決定使用 FormView 搭配 SqlDataSource 做資料的顯示及更新, 你為何不採用它已經提供的功能? 如此你一行程式也不用寫, 就足夠把資料寫回資料庫, 甚至可以連 Insert 與 Delete 也一併做掉了。或許你可以看看這段教學影片:

    http://www.asp.net/learn/videos/video-07.aspx
     
    ASP.NET 2Share - http://phone.idv.tw/cs2/
    • 已提議為解答 Lolota Lee 2009年4月14日 上午 01:13
    • 已標示為解答 Lolota Lee 2009年4月16日 上午 03:01
    2009年4月10日 上午 06:28