如何从 aspx 中的 Gridview 行中检索主键以在 userControl.ascx 中使用?

Posted

技术标签:

【中文标题】如何从 aspx 中的 Gridview 行中检索主键以在 userControl.ascx 中使用?【英文标题】:How can i retrieve the primary key from a Gridview row in aspx to use in a userControl.ascx? 【发布时间】:2017-06-20 13:04:54 【问题描述】:

我有一个 GridView,其中包含来自 mysql 数据库的数据绑定字段。它包含两列IdTask(主键), TaskName 和一个打开 jQuery 对话框的按钮。 我需要根据我单击按钮的行中的任务 ID 来填充此对话框。 我有一个带有另一个 Gridview 的用户控件,其中包含我需要在对话框中显示的所述数据。

这是我目前所拥有的:

aspx页面:

  <script>
    $(document).ready(function () 
        $(".modalFiles").click(function () 
            var id = $(this).data("activitateId");
            console.log(id);
            $("#divModalFiles").dialog(
                dialogClass: "no-close",
                modal: true,
                title: "Files",
                width: 450,
                height: 440,
                buttons: 
                    Close: function () 
                        $(this).dialog('close');
                    
                ,
                open: function (type, data) 
                    $(this).parent().appendTo("form");
                

            );
            return false;
        );
    );
</script> 
    <form id="form1" runat="server" style="padding: 10px; width: 550px">
        <asp:GridView DataKeyNames="IdTask" ID="gvTask" runat="server"
            AutoGenerateColumns="false">
            <Columns>
                    <asp:BoundField DataField="IdTask" HeaderText="ID" />
                    <asp:BoundField DataField="Name" HeaderText="Task"  />
            <asp:TemplateField>
                            <ItemTemplate>
                                <asp:ImageButton ID="btnFile" CssClass="btnFiles" runat="server" ImageUrl="img/files.png.png"/>
                            </ItemTemplate>
                    </asp:TemplateField>
            </Columns>
            </asp:GridView>
        <div id="divModalFiles" style="display:none">
                <ucFiles:Files runat="server"/>
            </div>
    </form>
    </body>

ascx 用户控件:

<div id="file">
          <asp:Literal ID="litMesaj" runat="server" Visible="false"></asp:Literal>
          <asp:FileUpload ID="fUpload" runat="server" />

          <br />
          <br />
          <asp:Label ID="lblDescFile" runat="server" Text="Description"></asp:Label>
          <asp:TextBox ID="txtDescFile" runat="server" ></asp:TextBox>
          <asp:Button ID="btnUpload" runat="server" Text="Upload" OnClick="btnUpload_Click" />
          <br />
          <br />

          <asp:GridView ID="gvFiles" DataKeyNames="IdFiles" runat="server" AutoGenerateColumns="false" EmptyDataText="No files uploaded">
              <Columns>
                  <asp:BoundField DataField="IdFiles" HeaderText="ID" />
                  <asp:BoundField DataField="IdTask" HeaderText="IdTask" />
                  <asp:BoundField DataField="Name" HeaderText="File Name" />
                  <asp:BoundField DataField="Description" HeaderText="Description" />

                  <asp:TemplateField>
                      <ItemTemplate>
                          <asp:LinkButton ID="lnkDownload" runat="server" Text="Download File" OnClick="lnkDownload_Click" CommandArgument='<%# Eval("Url") %>'></asp:LinkButton>
                      </ItemTemplate>
                  </asp:TemplateField>
                  <asp:TemplateField>
                      <ItemTemplate>
                          <asp:ImageButton runat="server" ID="btnDelFile" ImageUrl="~/delete.png.png" OnClientClick="return confirm('Sure?');" OnClick="btnDelFile_Click"/>
                      </ItemTemplate>
                  </asp:TemplateField>
              </Columns>              
          </asp:GridView>
      </div>  

ascx.cs 用户控件

 // the function i call in page load to display the files
 private void loadFiles()
    
        string sqlFiles = "select * from files where IdTask=" + ?? ;// here is where i need the help how can i retrieve the IdTask from the gridview on the aspx Page? 
        MySqlCommand cmd = new MySqlCommand(sqlFiles, conn);

    MySqlDataAdapter adp = new MySqlDataAdapter(cmd);
    DataTable dtFiles = new DataTable();
    adp.Fill(dtFiles);
        gvFiles.DataSource = dtFiles;
        gvFiles.DataBind();
      

你能帮帮我吗?如果没有该 ID,我也无法使用下载或上传文件功能。它目前仅显示带有文件上传和上传按钮的表单 如果我没有说清楚(英语不是我的第一语言)我需要什么,请随时提出任何问题,我会解释

【问题讨论】:

【参考方案1】:

您遇到的第一个问题是您需要回发才能填充弹出窗口。这意味着&lt;iframe&gt; 中的弹出窗口使用另一个单独的.aspx 页面,该页面包含您的用户.ascx 控件。您通过 URL 传递 activitateId。注意:&lt;iframe&gt; 不会回发,但它确实运行 popup.aspx 页面的页面生命周期,而不刷新您的主页。

<div id="divModalFiles" style="display:none">
    <iframe id="iframe_id" runat=server src="popup.aspx" ... />
</div>

其中popup.aspx 包含:

<html>
<head> 
    whatever you need here
</head>
<body>  
  <ucFiles:Files runat="server"/>
</body>
</html>

在 JS/JQuery 中,您在调用弹出窗口之前修改 iframe src 属性:

function AlterIframeSrc( ID ) 

  $('#iframe_id').attr( 'src', 'popup.aspx?id=' + ID; );


选项 2

或者,根据弹出窗口可能包含的数据量,您可以在主网格视图的每一行中创建预加载的隐藏 div。 像任何其他服务器控件一样将您的 .ascx 拖放到主 Gridview 中,并将 activitateId 作为控件参数传递给它。

但是在每个activitateId 只获得少量数据的情况下执行此操作,因为这会影响性能。 但是您不再需要回发来获取数据。

这是对初始性能影响的权衡。 优点是您可以使用简单的 javascript 来连接弹出窗口。

<asp:TemplateField>
  <ItemTemplate>
     <asp:ImageButton runat="server" ID="btnDelFile" ImageUrl="~/delete.png.png" OnClientClick="return confirm('Sure?');" OnClick="btnDelFile_Click"/>
     <div id="divModalFiles" style="display:none">
       <ucFiles:Files runat="server" IDTask='<%# Eval("activitateId") %>'/>
     </div>
  </ItemTemplate>
</asp:TemplateField>

我添加的用户控制属性 IDTask 将在您的 .ascx 中定义为可绑定的公共属性。

【讨论】:

以上是关于如何从 aspx 中的 Gridview 行中检索主键以在 userControl.ascx 中使用?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 C# 从 ASP.NET 中的 SQL Server 数据库中检索和显示 GridView 中的值

从其他aspx页面导航到GridView的某个页面

如何从后面的代码中的页面方法更新 GridView?

行中的 Gridview 计算字段

如何在 aspx 按钮单击上弹出模式并使用 gridview 加载数据?

如何使用 Python 从 .aspx 页面检索数据?