none
用Findcontrol抓出來的control是空值 RRS feed

  • 問題

  •  

    我拉了一個detailview,但是因為無法將資料更新至資料庫,因此就將欄位都轉成TemplateField,

    像是

    <asp:TemplateField HeaderText="處理人員" SortExpression="process_admin">
        <EditItemTemplate>
           <asp:TextBox ID="TextBox11" runat="server" Text='<%# Bind("process_admin") %>'></asp:TextBox>
        </EditItemTemplate>
        <InsertItemTemplate>
           <asp:TextBox ID="process_admin" runat="server" Text='<%# Bind("process_admin") %>'></asp:TextBox>
        </InsertItemTemplate>
        <ItemTemplate>
           <asp:Label ID="Label12" runat="server" Text='<%# Bind("process_admin") %>'></asp:Label>
        </ItemTemplate>
    </asp:TemplateField> //我要抓textbox ID為process_admin的值然後新增入資料庫中

     

    然後在程式的部份寫了(我有搭master page)

    c#:

    TextBox e_admin = (TextBox)this.eventDV.FindControl("process_admin");//處理人員

     

    打算將process_admin抓出

    再把它的text值丟到sql裡再下update更新資料庫

     

    但執行出來的結果卻是 e_admin為null

    錯誤訊息顯示:並未將物件參考設定為物件的執行個體

     

    查了很多資料  也又試了很多方法

    但一直解決不了這個問題

     

    是findcontrol沒有辦法抓到detailview中的這個欄位嗎…還是有其他更好的方法可以將detailview中的值更新至資料庫

     

    因為原本的detailview updatecommand我沒辦法下…

     

    將所有的參數設定好之後還是寫不進資料庫

     


    而且在我的detailview中  不管是新增、編輯什麼的都沒辦法直接用原本的command執行

    不知道有沒有人遇到過這種問題  

    請大家給我點建議跟指導…謝謝大家。

                                                                                    by celeste

    2008年11月17日 下午 03:32

所有回覆

  • Hi

    您可試試這段程式碼:

    Code Snippet

        protected void DetailsView1_ItemUpdating(object sender, DetailsViewUpdateEventArgs e)
        {
            if (this.DetailsView1.CurrentMode == DetailsViewMode.Edit)
            {
                string CompanyName = ((TextBox)this.DetailsView1.FindControl("TextBox1")).Text;
                Response.Write(CompanyName);
                e.Cancel = true;
            }
        }

     

     

    2008年11月18日 上午 01:03
  • 我把上段程式碼修改了一下到程式裡執行

     

    if (this.eventDV.CurrentMode == DetailsViewMode.Edit)
            {
                string eclass = ((TextBox)this.eventDV.FindControl("event_class")).Text;
                Response.Write(eclass);

            }

     

    最後顯示錯誤訊息是:並未將物件參考設定為物件的執行個體

     

    在使用findcontrol時一直會遇到這個錯誤訊息

     

    謝謝您回應我  不過不知道您知不知道我是哪個地方出問題 …  謝謝您

    2008年11月18日 上午 02:45
  • Hi

    請您檢查一下您的DetailsViewMode,

    是Insert,還是Edit。

     

    MSDN說明:DetailsViewMode 列舉型別

     

    Code Snippet

    <InsertItemTemplate>
       <asp:TextBox ID="process_admin" runat="server" Text='<%# Bind("process_admin") %>'></asp:TextBox>
    </InsertItemTemplate>

     

    if (this.eventDV.CurrentMode == DetailsViewMode.Insert)

     

     

     

    2008年11月18日 上午 02:50
  • 因為是轉成template所以沒發現它改成insertitem了

    謝謝您

     

    改成了insert mode後似乎就找的到值…

    下面是我整個改寫後的程式

    Code Snippet

    if (this.eventDV.CurrentMode == DetailsViewMode.Insert)
      {
        string e_class = ((TextBox)this.eventDV.FindControl("event_id")).Text;
        string e_context = ((TextBox)this.eventDV.FindControl("event_context")).Text;//內容
        string e_link = ((TextBox)this.eventDV.FindControl("event_link")).Text;//連結
        string e_account = ((TextBox)this.eventDV.FindControl("account")).Text;//帳號
        string e_qn = ((TextBox)this.eventDV.FindControl("event_Qname")).Text;// 暱稱
        string e_add = ((TextBox)this.eventDV.FindControl("event_adddate")).Text;//申請日期
        string e_processdate = ((TextBox)this.eventDV.FindControl ("event_processdate")).Text;//處理日期
        string e_cmail = ((TextBox)this.eventDV.FindControl("connect_mail")).Text;//聯絡信箱
        string e_consult = ((TextBox)this.eventDV.FindControl("event_consult")).Text;//處理結果
        string e_admin = ((TextBox)this.eventDV.FindControl("process_admin")).Text;//處理人員
        string e_id = ((Label)this.eventDV.FindControl("event_id")).Text;//event id

        string str;
        str = "UPDATE EVENT SET event_class = '" + e_class + "', event_context = '" + e_context + "', event_link = '" + e_link +
                  "', account = '" + e_account + "', event_Qname = '" + e_qn + "', event_adddate = '" + e_add + "', event_processdate = '" +
                  e_processdate + "', connect_mail = '" + e_cmail + "', event_consult = '" + e_consult + "', process_admin = '" + e_admin + "' WHERE event_id ='" + e_id + "'";
              
               sqlDBEvent.UpdateCommand = str;

               Response.Write("已更新事件編號:" + e_id + "資料");
           
           
            }

     

     

    不過因為最主要的目的還是要把抓出來的string丟到SQL重新UPDATE

    但是現在值找到了,但是還是沒辦法更新資料到資料庫中

    還是因為現在的MODE是INSERT 而不是UPDATE

    所以我要改寫成insertcommand才可以…

    謝謝您!!

     

     

     

    ps:在執行的時候突然看到下面的狀態列有一行是

    " BLOCKED SCRIPT_doPostBack ...."

    這樣是不是表示在執行中呢…  因為我在資料庫中還是沒看到資料更新

     

    2008年11月18日 上午 03:24
  • Hi

    請問您的DetailView是否有撘配 SqlDataSource / ObjectDataSource?

    有的話您可參考SqlDataSource的Insert方法及Update方法。

    SqlDataSource 類別

    SqlDataSource.Insert 方法

    SqlDataSource.Update 方法

    2008年11月19日 上午 12:33
  • 您好:

     

    有  我有搭配sqldatasource

     

    但就是因為使用的時候沒辦法update

     

    所以才轉成樣版抓control裡的值下sql指令

     

    只是測了好久…又找了很多方法 

     

    還是沒辦法下…

     

    2008年11月19日 上午 03:00