如何通过 ASP Button 从 Gridview 中的特定单元格获取值? ASP.NET C#
How do I grab values from specific cells in a Gridview via ASP Button ? ASP.NET C#
当我单击 ASP 按钮启动我的函数时,它会遍历 gridview,但值为空字符串。我想要做的是允许我的用户通过 "Drag and Drop" 对 gridview 重新排序,然后让他们将新的项目顺序保存在 gridview 中。这是问题所在,当他们单击按钮时,我想遍历 Gridview 中的第一列以查看在重新排序方面是否违反了任何规则,如果没有违反规则...... sortOrder(隐藏列)将被更新。然后新的重新排序和更新的 SortOrder 值将通过存储过程传回数据库 table。
到目前为止,我正处于单击按钮通过嵌套 for 循环遍历 gridview 的第一列的位置,并且在我遍历时,没有值被拾取。它们都被视为空字符串。
这是 Gridview ASPX 代码:
<asp:GridView ID="gridComments" runat="server" BackColor="White" BorderColor="#999999" DataKeyNames="RecNo" OnRowDeleting="gridComments_RowDelete" OnSelectedIndexChanged="gridComments_SelectedIndexChanged"
OnRowDataBound="gridComments_RowDataBound" OnRowUpdating="gridComments_RowUpdating" BorderStyle="Solid" BorderWidth="1px" CellPadding="3" ForeColor="Black" GridLines="Vertical" AutoGenerateColumns="False" Width="90%">
<FooterStyle BackColor="#CCCCCC" />
<SelectedRowStyle BackColor="#000099" Font-Bold="True" ForeColor="White" />
<PagerStyle BackColor="#999999" ForeColor="Black" HorizontalAlign="Center" />
<HeaderStyle BackColor="Black" Font-Bold="True" ForeColor="White" />
<AlternatingRowStyle BackColor="#CCCCCC" />
<Columns>
<asp:TemplateField HeaderText="Edit">
<ItemStyle Wrap="false" />
<ItemTemplate>
<asp:LinkButton runat="server" ID="lnkEdit" CommandName="select" Text='<%# Eval("Program") %>' CausesValidation="false"></asp:LinkButton>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Description">
<ItemStyle Width="80%" HorizontalAlign="Left" />
<ItemTemplate>
<asp:Label runat="server" ID="lblDescription" Text='<%# Eval("Preview") %>'></asp:Label>
<asp:LinkButton runat="server" ID="lnkEditComment" Text="Edit"></asp:LinkButton>
<ajaxToolkit:ModalPopupExtender ID="modalPopup" runat="server" PopupControlID="pnlCommentInfo" TargetControlID="lnkEditComment" BackgroundCssClass="modalBackground" CancelControlID="btnCancel"></ajaxToolkit:ModalPopupExtender>
<asp:Panel ID="pnlCommentInfo" runat="server" Style="display: none; text-align: left" CssClass="pnlPop" BorderStyle="Double" Width="500px" ScrollBars="Auto">
<asp:Label runat="server" ID="lblCommentNumber"></asp:Label><br />
<br />
Comment:<br />
<asp:TextBox ID="txtEditComment" runat="server" Rows="6" TextMode="MultiLine" Columns="58" /><br />
<br />
<asp:Button ID="btnSave" runat="server" Text="Save" CausesValidation="false" CommandName="Update" />
<asp:Button ID="btnCancel" runat="server" Text="Cancel" CausesValidation="false" />
</asp:Panel>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField>
<ItemTemplate>
<asp:LinkButton runat="server" ID="lnkDelete" CommandName="delete" Text="Delete"></asp:LinkButton>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField >
<HeaderStyle CssClass =" HiddenCol"/>
<ItemStyle CssClass ="HiddenCol" />
<ItemTemplate >
<%# Eval("SortOrder") %>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
<div style="clear:both">
<asp:Button ID="HiddenButton" runat="server" Text="" style="display:none" BackColor="Transparent" Width="30px"/>
<asp:Button ID="Button1" runat="server" OnClick="SaveReorder_Click" Text="Save Ordering Changes" />
</div>
<asp:Panel ID="StatusPanel" runat="server" CssClass="modalPopup" Height="123px" Width="292px" style="display:none">
<div style="text-align: center">
<p> ERROR: Please place comments by program in numerical order from least to greatest. Please try again.
</p>
<div style="text-align: center; height: 21px" >
<input id="OK" type="button" value="OK" />
</div>
</div>
</asp:Panel>
<ajaxToolkit:ModalPopupExtender ID="ModalPopupExtender1" runat="server" BackgroundCssClass="modalBackground" PopupControlID="StatusPanel" OkControlID="OK" CancelControlID="OK" TargetControlID="HiddenButton">
</ajaxToolkit:ModalPopupExtender>
</div>
这是我在代码隐藏文件中创建的函数:
我只是在这一步,如果他们对数据重新排序错误,则会出现一个弹出窗口。如果他们做得正确,那么更新可以在更新 SortOrder 列(隐藏列)后保存到数据库
protected void SaveReorder_Click(object sender, EventArgs e)
{
for (int i = 0; i < gridComments.Rows.Count -1; i++ )
{
for(int j = i+1; j < gridComments.Columns.Count ; j++)
{
//if (Convert.ToInt32(gridComments.Rows[i].Cells[0].Text) > Convert.ToInt32(gridComments.Rows[j].Cells[0].Text))
if (Convert.ToInt32(gridComments.Rows[i].Cells[0].Text) > Convert.ToInt32(gridComments.Rows[j].Cells[0].Text))
{
ModalPopupExtender1.Show();
}
}
}
}```
如果您尝试访问该行的第一个单元格,我认为您 return 不会基于 Text
任何内容,因为第一列呈现控件。也就是说,除非您的 OnRowDataBound
中还有更多内容可以更简单地填充第一列。
如果你看这里: 他们正在考虑提取列的值,并且在尝试通过他们的列的 Cell.Text
访问它时 运行 遇到了问题TemplateField
。链接的答案建议在单元格内找到控件,如下所示以访问文本 属性(如果您尝试使用第一列的 LinkButton 的文本字段,则更改为匹配):
LinkButton lb = (LinkButton)gridComments.Rows[i].Cells[0].FindControl("lnkEdit");
// use lb.Text as you see fit
此外,我不确定它是否重要,但看起来您正在使用 j
的列数来遍历一系列行,这似乎有问题。
当我单击 ASP 按钮启动我的函数时,它会遍历 gridview,但值为空字符串。我想要做的是允许我的用户通过 "Drag and Drop" 对 gridview 重新排序,然后让他们将新的项目顺序保存在 gridview 中。这是问题所在,当他们单击按钮时,我想遍历 Gridview 中的第一列以查看在重新排序方面是否违反了任何规则,如果没有违反规则...... sortOrder(隐藏列)将被更新。然后新的重新排序和更新的 SortOrder 值将通过存储过程传回数据库 table。
到目前为止,我正处于单击按钮通过嵌套 for 循环遍历 gridview 的第一列的位置,并且在我遍历时,没有值被拾取。它们都被视为空字符串。
这是 Gridview ASPX 代码:
<asp:GridView ID="gridComments" runat="server" BackColor="White" BorderColor="#999999" DataKeyNames="RecNo" OnRowDeleting="gridComments_RowDelete" OnSelectedIndexChanged="gridComments_SelectedIndexChanged"
OnRowDataBound="gridComments_RowDataBound" OnRowUpdating="gridComments_RowUpdating" BorderStyle="Solid" BorderWidth="1px" CellPadding="3" ForeColor="Black" GridLines="Vertical" AutoGenerateColumns="False" Width="90%">
<FooterStyle BackColor="#CCCCCC" />
<SelectedRowStyle BackColor="#000099" Font-Bold="True" ForeColor="White" />
<PagerStyle BackColor="#999999" ForeColor="Black" HorizontalAlign="Center" />
<HeaderStyle BackColor="Black" Font-Bold="True" ForeColor="White" />
<AlternatingRowStyle BackColor="#CCCCCC" />
<Columns>
<asp:TemplateField HeaderText="Edit">
<ItemStyle Wrap="false" />
<ItemTemplate>
<asp:LinkButton runat="server" ID="lnkEdit" CommandName="select" Text='<%# Eval("Program") %>' CausesValidation="false"></asp:LinkButton>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Description">
<ItemStyle Width="80%" HorizontalAlign="Left" />
<ItemTemplate>
<asp:Label runat="server" ID="lblDescription" Text='<%# Eval("Preview") %>'></asp:Label>
<asp:LinkButton runat="server" ID="lnkEditComment" Text="Edit"></asp:LinkButton>
<ajaxToolkit:ModalPopupExtender ID="modalPopup" runat="server" PopupControlID="pnlCommentInfo" TargetControlID="lnkEditComment" BackgroundCssClass="modalBackground" CancelControlID="btnCancel"></ajaxToolkit:ModalPopupExtender>
<asp:Panel ID="pnlCommentInfo" runat="server" Style="display: none; text-align: left" CssClass="pnlPop" BorderStyle="Double" Width="500px" ScrollBars="Auto">
<asp:Label runat="server" ID="lblCommentNumber"></asp:Label><br />
<br />
Comment:<br />
<asp:TextBox ID="txtEditComment" runat="server" Rows="6" TextMode="MultiLine" Columns="58" /><br />
<br />
<asp:Button ID="btnSave" runat="server" Text="Save" CausesValidation="false" CommandName="Update" />
<asp:Button ID="btnCancel" runat="server" Text="Cancel" CausesValidation="false" />
</asp:Panel>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField>
<ItemTemplate>
<asp:LinkButton runat="server" ID="lnkDelete" CommandName="delete" Text="Delete"></asp:LinkButton>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField >
<HeaderStyle CssClass =" HiddenCol"/>
<ItemStyle CssClass ="HiddenCol" />
<ItemTemplate >
<%# Eval("SortOrder") %>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
<div style="clear:both">
<asp:Button ID="HiddenButton" runat="server" Text="" style="display:none" BackColor="Transparent" Width="30px"/>
<asp:Button ID="Button1" runat="server" OnClick="SaveReorder_Click" Text="Save Ordering Changes" />
</div>
<asp:Panel ID="StatusPanel" runat="server" CssClass="modalPopup" Height="123px" Width="292px" style="display:none">
<div style="text-align: center">
<p> ERROR: Please place comments by program in numerical order from least to greatest. Please try again.
</p>
<div style="text-align: center; height: 21px" >
<input id="OK" type="button" value="OK" />
</div>
</div>
</asp:Panel>
<ajaxToolkit:ModalPopupExtender ID="ModalPopupExtender1" runat="server" BackgroundCssClass="modalBackground" PopupControlID="StatusPanel" OkControlID="OK" CancelControlID="OK" TargetControlID="HiddenButton">
</ajaxToolkit:ModalPopupExtender>
</div>
这是我在代码隐藏文件中创建的函数:
我只是在这一步,如果他们对数据重新排序错误,则会出现一个弹出窗口。如果他们做得正确,那么更新可以在更新 SortOrder 列(隐藏列)后保存到数据库
protected void SaveReorder_Click(object sender, EventArgs e)
{
for (int i = 0; i < gridComments.Rows.Count -1; i++ )
{
for(int j = i+1; j < gridComments.Columns.Count ; j++)
{
//if (Convert.ToInt32(gridComments.Rows[i].Cells[0].Text) > Convert.ToInt32(gridComments.Rows[j].Cells[0].Text))
if (Convert.ToInt32(gridComments.Rows[i].Cells[0].Text) > Convert.ToInt32(gridComments.Rows[j].Cells[0].Text))
{
ModalPopupExtender1.Show();
}
}
}
}```
如果您尝试访问该行的第一个单元格,我认为您 return 不会基于 Text
任何内容,因为第一列呈现控件。也就是说,除非您的 OnRowDataBound
中还有更多内容可以更简单地填充第一列。
如果你看这里: 他们正在考虑提取列的值,并且在尝试通过他们的列的 Cell.Text
访问它时 运行 遇到了问题TemplateField
。链接的答案建议在单元格内找到控件,如下所示以访问文本 属性(如果您尝试使用第一列的 LinkButton 的文本字段,则更改为匹配):
LinkButton lb = (LinkButton)gridComments.Rows[i].Cells[0].FindControl("lnkEdit");
// use lb.Text as you see fit
此外,我不确定它是否重要,但看起来您正在使用 j
的列数来遍历一系列行,这似乎有问题。