gpt4 book ai didi

c# - DataTable的数据

转载 作者:行者123 更新时间:2023-11-30 17:57:21 25 4
gpt4 key购买 nike

我有一个现成的库 (dll),其中包含重要数据,我可以将该数据放入 Datatable 并在 GridView 上成功显示。

现在我的进一步任务是它在 GridView 中显示的数据应该是可过滤的,这意味着如果我单击一行中的任何列,它应该过滤类似列的结果。

这是我的 GridView 结果

HeaderCol1        HeaderCol2       HeaderCol3      HeaderCol4 
Name1 Info1 ID1 Time1
Name2 Info2 ID2 Time2
Name1 Info3 ID3 Time3
Name3 Info2 ID4 Time4
Name4 Info4 ID3 Time5
Name5 Info5 ID5 Time5

现在我想要的是如果我点击 Name1 它应该显示

HeaderCol1        HeaderCol2       HeaderCol3      HeaderCol4 
Name1 Info1 ID1 Time1
Name1 Info3 ID3 Time3

如果我点击 Info2,它应该会显示

HeaderCol1        HeaderCol2       HeaderCol3      HeaderCol4 
Name2 Info2 ID2 Time2
Name3 Info2 ID4 Time4

我想我的问题现在很清楚了。我怎样才能做到这一点?提前致谢

最佳答案

因此,您想通过用户单击的单元格的值来过滤 GridView 的 DataSource。这些是多项任务合二为一,我会尽力解释所有内容。

主要任务是使 GridView 中的每个单元格都能对用户的点击使用react,在服务器端处理该点击事件并以某种方式从该单元格中获取值。

我在下面的示例中使用了 DataTable,将其替换为您的数据源类型。如果您需要将自定义事件/控件添加到 GridViewRows,最好的地方是 RowCreated,因为它在每次回发时调用,而不仅仅是在数据绑定(bind)时调用。请注意,您在此阶段没有 DataItem

protected void gridView1_RowCreated(Object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
for(int i = 0; i < e.Row.Cells.Count; i++)
{
TableCell cell = e.Row.Cells[i];
cell.ToolTip = "Click to filter by this value";
string js = string.Format("var txt=document.getElementById('{0}');txt.value='{1} {2}';{3}"
, TxtFilter.ClientID, e.Row.RowIndex, i
, ClientScript.GetPostBackClientHyperlink(TxtFilter, null));
cell.Attributes["onclick"] = js;
}
}
}

如您所见,我已将客户端 onclick 事件添加到每个单元格。我使用隐藏的 TextBox(display:none) 和 AutoPostBack=true 来存储用户点击的行和单元格。现在您可以在服务器端处理和处理点击事件了。

protected void FilterGrid(object sender, EventArgs e)
{
TextBox txtFilter = (TextBox)sender;
string[] parts = txtFilter.Text.Split();
int row = int.Parse(parts[0]);
int col = int.Parse(parts[1]);
gridView1.DataSource = GetData(row, col);
gridView1.DataBind();
}

// replace with your DAL, used a DataTable for testing
private DataTable GetData(int rowIndex = -1, int colIndex = -1)
{
DataTable tblData = getDataSource();
if (rowIndex > -1 && colIndex > -1)
{
var field = tblData.Columns[colIndex];
var row = tblData.Rows[rowIndex];
var value = row[field];
// now use Linq-To-DataSet to filter the table, remember to add 'using System.Linq'
tblData = tblData.AsEnumerable()
.Where(r => !r.IsNull(field) && r[field].Equals(value))
.CopyToDataTable();
}

return tblData;
}

这是我的示例页面的 aspx:

<asp:TextBox ID="TxtFilter" runat="server" style="display:none" AutoPostBack="true" OnTextChanged="FilterGrid" />
<asp:GridView ID="gridView1" runat="server" AutoGenerateColumns="False" OnRowCreated="gridView1_RowCreated" >
<Columns>
<asp:TemplateField HeaderText="HeaderCol1">
<ItemTemplate>
<asp:Label ID="LblHeaderCol1" runat="server" Text='<%#Eval("HeaderCol1") %>' />
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="HeaderCol2">
<ItemTemplate>
<asp:Label ID="LblHeaderCol2" runat="server" Text='<%#Eval("HeaderCol2") %>' />
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="HeaderCol3">
<ItemTemplate>
<asp:Label ID="LblHeaderCol3" runat="server" Text='<%#Eval("HeaderCol3") %>' />
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="HeaderCol4">
<ItemTemplate>
<asp:Label ID="LblHeaderCol4" runat="server" Text='<%#Eval("HeaderCol4") %>' />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>

关于c# - DataTable的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13287275/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com