none
取得GridView中的ColumeIndex或ColumeName RRS feed

  • 問題


  • 小弟希望做到的功能是:讓使用者於GridView中更新資料

    目前卡在:無法得知使用者點選GridView中的哪個Colume


    目前是使用GridView中的CommandField去實作,

    但在使用者點選Update按鈕觸發GridView1_RowUpdating事件後,

    我的知識只有辦法讓我取得使用者點選哪欄row的Index,沒有辦法取得該Colume的Index或Colume的Name

    導致我無法寫回資料庫(不知道將更新後的資料set進哪個col中)

    在RowEditing事件中,也無法取得colume的Index或Colume的Name


    想請問 有什麼方法可以取得使用者點選的columeIndex或columeName

    還請前輩們指點迷津,謝謝
    2017年2月10日 上午 03:41

解答

  • 您好,

    您可以參考以下的link,先練習一下 CRUD  的example,希望對您有幫助。

    http://www.aspsnippets.com/Articles/GridView-CRUD-Select-Insert-Edit-Update-Delete-using-Single-Stored-Procedure-in-ASPNet.aspx

    https://www.codeproject.com/Articles/851092/ASP-NET-GridView-CRUD-Operations

    http://www.c-sharpcorner.com/UploadFile/009464/make-edit-update-and-delete-operation-in-gridview-in-Asp-Net/

    • 已標示為解答 HumorA 2017年2月14日 上午 02:11
    2017年2月14日 上午 01:31

所有回覆

  • 您好,

    請參考

    https://dotblogs.com.tw/rainmaker/2014/08/01/146131

    2017年2月10日 上午 06:35
  • 一般都是照儲存格的編號來取欄位內容, 所以您必須知道每一個欄位放的是什麼內容, 例如:GridView.RowUpdating 事件

    如果要依欄位名稱取內容, 可以參考這篇討論, 透過函式將欄位名稱轉成編號, 再取內容值:How to get the cell value by column name not by index in GridView in asp.net

    2017年2月10日 上午 08:51
  • 前輩你好,

    這幾天因為沒辦法使用電腦,抱歉那麼久才回

    我嘗試了您的方法,

    您的方法似乎是會抓取使用者所修改的value

    但我已經知道了value,不知道的是該value所屬哪個column中

    UPDATE Table
    SET 值 = 'NewValue'
    WHERE Column = 'OldValue';

    寫回資料庫時,我知道Table,知道NewValue和OldValue,但我無法得知Column,苦惱這好久阿..

    今天早上一直在嘗試使用比對的方法

    因為我的GridView中只有2個Colume要顯示,

    所以原本打算用寫死的方式寫入資料庫.

    例如

    //dtt為資料表中的資料,將資料表中的資料跟更新的資料比,若為不同,就知道是哪個col了

    dtt.Rows[e.RowIndex][0].ToString() == e.OldValues["DESCRIPTION"].ToString()

    但一直出現Exception 

    Object reference not set to an instance of an object.
       at GridView1_RowUpdating(Object sender, GridViewUpdateEventArgs e)

    還請前輩能繼續指點迷津,非常感謝前輩

    2017年2月13日 上午 03:54
  • 您好,

    where 條件應該是要為那筆資料的 key 值吧!

    另外, 您的 gridview 的datasource 是指給他 datatable? 

    感覺上 dtt 目前應該是 null 值吧!


    • 已編輯 亂馬客 2017年2月13日 上午 08:23
    2017年2月13日 上午 08:16
  • 前輩好,

    我知道了key值,但我在where column = key 時,不知道colume是哪個欄位

    所以知道key值我也沒辦法寫回資料庫中,

    我的步驟是

    1. 先去資料庫抓資料,將產生出的DataTable繫結到GridView1上

    2. 透過GridView中的CommanField功能,使用者直接點選GridView中的資料,點一下就可以輸入資料做更新

    但我知道使用者點選哪行,卻不知道使用者點選哪列,所以變成抓到Key抓到哪筆資料,我還是無法寫回去

    目前我改寫成點一下那行rows就出現

    Label1:TextBox1

    Label2:TextBox2

    Label1.Text = Column1,Label2.Text = Column2

    一次全寫回去,不過覺得這學不太到東西..

    非常感謝前輩


     

    我的gridview是給他動態產生的datatable

    Gridview1.Datasource = dt;

    2017年2月14日 上午 12:39
  • 您好,

    您可以參考以下的link,先練習一下 CRUD  的example,希望對您有幫助。

    http://www.aspsnippets.com/Articles/GridView-CRUD-Select-Insert-Edit-Update-Delete-using-Single-Stored-Procedure-in-ASPNet.aspx

    https://www.codeproject.com/Articles/851092/ASP-NET-GridView-CRUD-Operations

    http://www.c-sharpcorner.com/UploadFile/009464/make-edit-update-and-delete-operation-in-gridview-in-Asp-Net/

    • 已標示為解答 HumorA 2017年2月14日 上午 02:11
    2017年2月14日 上午 01:31
  • 抱歉前輩,是我錯了..

    以下是我的code

      protected void Button1_Click(object sender, EventArgs e)
            {
                string[] roleid = (string[])Session["RoleID"];
                string Description = TextBox1.Text;
                string Data = TextBox2.Text;
                string name = dtt.Rows[SelectIndex][0].ToString();
    
                if (Description == "" || Data == "")
                {
                    Label1.Text = "Description或data不得為空";
                }
    
                string updateStr = string.Format("UPDATE SETTING SET Description = @Description, Data = @Data WHERE NAME = @NAME;");
                SqlCommand cmd = new SqlCommand();
                try
                {
                    using (SqlConnection conn = new SqlConnection(Utils.Setting.DB.ConnectString))
                    {
                        Label1.Visible = true;
                        cmd = new SqlCommand(updateStr, conn);
                        cmd.Parameters.Add("Description", SqlDbType.NVarChar).Value = Description;
                        cmd.Parameters.Add("Data", SqlDbType.NVarChar).Value = Data;
                        cmd.Parameters.Add("NAME", SqlDbType.NVarChar).Value = name;
                        conn.Open();
                        int n = cmd.ExecuteNonQuery();
                        if (n > 0)
                        {
                            Label1.Text = "更新成功";
                            Utils.WriteLoginLog(Session["Name"].ToString(), "20", "0", roleid[0], "");
                        }
                        else
                        {
                            Label1.Text = "更新失敗";
                            Utils.WriteLoginLog(Session["Name"].ToString(), "20", "-1", roleid[0], "Edit Failed");
                            throw new Exception("Please check DataTable is exist");
                        }
                    }
                }
                catch (Exception ex)
                {
                    Label1.Text = "更新失敗";
                    log.Debug("System.Setting.Button1_Click.Exception message:" + ex.ToString());
                }
            }

    原本於範例中我想指的是

    UPDATE Customers
                SET Name = @NewName, Country = @Country

                WHERE Name = @OldName

    因為我不知道使用者於GridView中是點選Name這個欄位,還是Country這個欄位

    所以在Set的時候,我不知道要Set到Name還是Country這欄位

    也不知道該Where哪個欄位


    直到剛剛看到範例一次Set兩個才想到,我有辦法取得主鍵,全部塞進去就好,不用管使用者變更哪個欄位..

    update 資料表

    set 資料

    where column = @主鍵

    是我腦袋太死了,一直想著要抓到Column才可以寫入資料..

    謝謝前輩

    如果我還是觀念有錯,還請指教,真的謝謝了

    • 已編輯 HumorA 2017年2月14日 上午 02:14 怕打錯誤導別人
    2017年2月14日 上午 02:10