如何从 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】:您遇到的第一个问题是您需要回发才能填充弹出窗口。这意味着<iframe>
中的弹出窗口使用另一个单独的.aspx 页面,该页面包含您的用户.ascx 控件。您通过 URL 传递 activitateId
。注意:<iframe>
不会回发,但它确实运行 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 中的值