所以我有一個使用主 GridView 和子 GridView 的網站。
我想復制(克隆)現有行并將其粘貼回主 GridView。
使用下面的代碼,我得到了這個錯誤,因為填充子 GridView 的SProcinMySql找不到預期的引數
Exception Details:
MySql.Data.MySqlClient.MySqlException:
Incorrect integer value: '' for column 'tcustomerId' at row 1
在我設定的主 GridView
DataKeyNames="CustomerId"
在子 GridView 上(進入gvProducts_RowDataBound)
string CustomerId = gvProducts.DataKeys[e.Row.RowIndex].Value.ToString();
在 VS 2019 上除錯cmdCopy_Click正確的回傳值
CustomerId = Convert.ToInt32(index).ToString();
線路錯誤為 1027
Line 1025: MySqlDataAdapter adapter = new MySqlDataAdapter();
Line 1026: adapter = new MySqlDataAdapter(cmd);
Line 1027: adapter.Fill(ds);
Line 1028: cmd.Connection.Close();
感謝您的任何建議。
protected void gvProducts_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
if (e.Row.DataItem != null)
{
GridView gv_Child = (GridView)e.Row.FindControl("gv_Child");
if (gv_Child != null)
{
string CustomerId = gvProducts.DataKeys[e.Row.RowIndex].Value.ToString();
DataSet ds = new DataSet();
using (MySqlConnection cn =
new MySqlConnection(ConfigurationManager.ConnectionStrings["cn"].ConnectionString))
{
using (MySqlCommand cmd =
new MySqlCommand("SProc", cn))
{
cmd.Connection.Open();
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("tcustomerId", customerId);
MySqlDataAdapter adapter = new MySqlDataAdapter();
adapter = new MySqlDataAdapter(cmd);
adapter.Fill(ds);
cmd.Connection.Close();
gv_Child.DataSource = ds.Tables[0];
gv_Child.DataBind();
}
}
}
}
}
}
protected void cmdCopy_Click(object sender, ImageClickEventArgs e)
{
GridViewRow gvRow = (sender as ImageButton).NamingContainer as GridViewRow;
int index = gvRow.RowIndex;
CustomerId = Convert.ToInt32(index).ToString();
HiddenField hd = gvRow.FindControl("hf") as HiddenField;
string hValue = hd.Value.ToString().Replace('.',',');
DataTable dt = RetrieveProducts();
DataRow dr = dt.NewRow();
dr["tValue"] = hValue;
dt.Rows.InsertAt(dr, index 1);
BindData();
}
uj5u.com熱心網友回復:
您獲取 gv 索引,然后從索引中,您可以獲取該行的資料鍵(隱藏的 PK 值)。datakeys 的整個想法是,您可以獲得 PK 行值,但不必將其包含在標記中。
因此,對于那個“副本”,您獲取索引,然后為了獲取 customerID(資料鍵),您使用 DataKeys 陣列中的索引。
行 idex 很簡單,行數從 0 開始,然后是 1,然后是 2 - rowindex 因此為您提供行號,而不是 PK 或 datakey 值。
例如像這樣:
GridViewRow gvRow = (sender as ImageButton).NamingContainer as GridViewRow;
int index = gvRow.RowIndex;
int CustomerId = (int)MyGrid.DataKeys[index]["CustomerID"];
現在您可以用您的 datakeys 設定替換 CustomerID,但您沒有共享 asp:GridView 行的 GV 標記,所以我們看不到。
但是,我看不到如何使用行資料系結,因為這會觸發每個時間和每個行 - 因此設定一個全域字串 customerId 在這里會產生零意義。因此,宣告 CustomerID,并使用行索引來獲取資料鍵設定。
如前所述,我必須猜測 datakeys 設定,但使用任何名稱,并且通過使用行索引,您可以獲得該 PK 行值。
并且行資料系結僅在系結期間觸發。因此,您將永遠不會看到或獲得頁面范圍的寬字串 CustomerID 的單獨行點擊事件,因為它只會擁有/保存最后一行資料系結事件,我看不到該事件是任何值或用于該行點擊復制事件。這兩件事彼此關系不大。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/435129.html
