使用 C# 使用主 GridView 和子 GridView 的网站 ASP.NET

Web site that uses a main GridView with child GridView using C# ASP.NET

所以我有一个使用主 GridView 和子 GridView 的网站。

我想复制(克隆)现有行并将其粘贴回主 GridView。

使用下面的代码我得到了这个错误,因为填充子 GridView 的 MySql 中的 SProc 找不到预期的参数

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 事件中的 return 值是正确的

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();
}

你得到gv索引,然后从索引中,你可以得到该行的datakey(隐藏的PK值)。 datakeys 的整个想法是您可以获得主键行值,但不必将其包含在标记中。

因此,对于该“副本”,您获取了索引,然后为了获取 customerID(数据键),您将索引用于 DataKeys 数组。

行索引很简单,行从 0 开始,然后是 1,然后是 2 表示行数 - 行索引因此为您提供行号,而不是 PK 或数据键值。

例如:

GridViewRow gvRow = (sender as ImageButton).NamingContainer as GridViewRow;
int index = gvRow.RowIndex;

int CustomerId = (int)MyGrid.DataKeys[index]["CustomerID"];

现在您可以用您的数据密钥设置替换 CustomerID,但是您没有共享 asp:GridView 行的 GV 标记,所以我们看不到。

但是,我看不出如何使用行数据绑定,因为它每次都会针对每一行触发 - 因此设置全局字符串 customerId 在这里会产生零意义。因此,声明CustomerID,并使用行索引获取数据键设置。

如前所述,我必须猜测 datakeys 设置,但使用任何名称,通过使用行索引,您可以获得该 PK 行值。

并且行数据绑定仅在绑定期间触发。所以你的单独的行点击事件你永远不会看到也不会得到页面范围的宽字符串 CustomerID,因为它只会 have/hold 最后一行数据绑定事件,我看不到它有任何价值或使用关于行点击复制事件。两起事件关系不大。