iT邦幫忙

0

RowDeleting

  • 分享至 

  • xImage

我在做GridView_RowDeleting時,設定完DataKeyName屬性、刪除行的索引之後,
想要重新LoadData時卻跳這個錯誤:

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

0
kw6732
iT邦研究生 5 級 ‧ 2022-08-18 12:19:31
最佳解答

問題在這裡 'das' ,請你先模擬查詢一下,確認查詢出來的結果是不是沒放'講師ID'這欄位進去?

private void LoadData()
    {

        IList<object> das = new List<object>();
        das = bll產品簡章.Get產品講師列表();   // 這裡
        產品線講師GridView.DataSource = das;  // 這裡
        產品線講師GridView.DataBind();

    }
看更多先前的回應...收起先前的回應...
sa851416 iT邦新手 5 級 ‧ 2022-08-18 13:45:31 檢舉

恩恩,剛剛模擬查詢後,das裡面有抓到我要的資料
但是到了產品線講師GridView.DataBind();那列之後就跳出一樣的錯誤。
我在想是不是因為我設了DataKeyNames="講師ID"
所以他變成抓不到,但是DataKeyNames是為了做下面的RowDeleting 事件,所以想問一下這個部分我應該怎麼處理...

<asp:GridView ID="產品線講師GridView" runat="server" EmptyDataText="無資料..." SkinID="GridViewHoverEffectStyle" OnRowCommand="產品線講師GridView_RowCommand" OnRowDeleting="產品線講師GridView_RowDeleting" DataKeyNames="講師ID">

kw6732 iT邦研究生 5 級 ‧ 2022-08-18 14:28:42 檢舉

這問題是這樣,如果你一開始Load的時候也是這一段的話,而且能成功Bind出GV表格的話,這DataKeyNames="講師ID"應該不是問題,但可以嘗試拿掉試試看。

protected void 產品線講師GridView_RowDeleting(object sender, GridViewDeleteEventArgs e)
        {
int teacherID = WebUtility.GetIntValue(產品線講師GridView.DataKeys[e.RowIndex].Value.ToString(), -1);

/// 改成以下 我把你的 "講師ID" 先認定成 Label
int teacherID = WebUtility.GetIntValue(((Label)產品線講師GridView.Rows[e.RowIndex].FindControl("講師ID")).Text, -1);
}

但通常我不是這樣去抓ID的,有時候要抓的資料比較多點,是把GV轉換成DataTable來抓取多筆資料。

另外問一點,在這GV內 "講師ID"這值應該是不會重複的,對吧?

sa851416 iT邦新手 5 級 ‧ 2022-08-18 15:08:24 檢舉

我嘗試拿掉DataKeyNames="講師ID"後GV就可以正常Bind了,應該真的是DataKeyName在搞鬼....

嗯嗯對的,講師ID是流水編號,不會重複。

我剛剛改成把他寫到RowCommand就可以了
下面是我改過後的程式碼

  protected void 產品線講師GridView_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            if (e.CommandName == "編輯")
            {
                int Id = Convert.ToInt32(e.CommandArgument);
                學員專區產品線講師Info Data = ins講師.Get學員專區產品線講師(Id);
                產品線IDTextBox.Text = Data.產品線Id.ToString();
                講師編號TextBox.Text = Data.講師編號.ToString();
                排列TextBox.Text = Data.排列.ToString();
                產品線講師新增Button.Text = "確認修改";

            }
            if (e.CommandName == "刪除")
            {
                int Id = Convert.ToInt32(e.CommandArgument);
                ins講師.Delete學員專區產品線講師(Id);
                ShowMsg("已刪除");
                LoadData();

            }
        }

不過想虛心請教一個問題,
為什麼刪除資料為什麼不在RowCommand裡面做就好,
有些頁面會做在RowDeleting裡呢?
這兩者有什麼不同QQ

kw6732 iT邦研究生 5 級 ‧ 2022-08-18 16:11:30 檢舉

通常我都是用RowCommand來解決的,因為實際上不管是Insert、Update、Delete也都是RowCommand的一種,但是ing和"ed" (沒有ing的)的執行時機也是不同的,會以ing執行後跟著執行"ed",之後還會跑一次RowCommand,所以你說這部分用法,這是看寫code的人怎麼去架構它。

kw6732 iT邦研究生 5 級 ‧ 2022-08-18 17:29:40 檢舉

以你的例子來看,主因應該是 GridView_RowDeleting 才對,另外你已經回答我"講師ID是流水編號,不會重複。",這代表DataKeyNames="講師ID" 這段應該不是問題,有時間的話你可以測試看看。

sa851416 iT邦新手 5 級 ‧ 2022-08-19 09:03:26 檢舉

了解! 謝謝你! 每次都耐心不吝嗇地講解,感恩的心

我要發表回答

立即登入回答