我有一个返回匿名类型的 Linq 查询,然后我将其用作 GridView 的数据源。这些列中只有 1 个需要可编辑。我只想能够单击一个编辑按钮并使该 1 列的所有行都成为文本框(理想情况下)。我将满足于为每一行设置一个 CommandField。问题是,如果不创建自定义类或手动处理所有字段,我不知道该怎么做。此列还必须以特定方式更新数据库中的值(因此我需要为该查询编写自定义代码)。
目前,我可以轻松地将整个内容显示在网格视图中。我什至创建了一个自定义 DataTable 用作数据源,并且工作正常。但是我仍然不知道如何添加编辑功能。我发现的教程要么用于 DataSource 控件,要么涉及制作扩展 GridView 的自定义类等等。我在 aspx 页面中添加了一个 CommandField,它可以正常工作,但 DataTable 中的 ReadOnly 列仍然是可编辑的。
我宁愿有一个简单的解决方案...例如,在 .aspx 页面中创建一个 TemplateField,我可以提供一个 Item 和 EditItem 模板,并以某种方式绑定到我的 Linq 查询返回的字段。
我在下面包含了一些伪代码,它们创建了 2 个 GridView。一个只是显示所有信息,但不可编辑。另一个使用显示 ColA 的 DataTable、带有空行的 aspx 页面中的 ColB 和来自页面背后代码的 ColB,已填充。
将查询绑定到 GridView:
var qry = from t in database
...
select new { colA, colB };
GridView2.DataSource = qry; // not shown in pseudocode
GridView2.DataBind();
制作数据表
const string ColA = "ColA";
const string ColB = "ColB";
DataTable dt = new DataTable();
DataColumn dc = new DataColumn(ColA, typeof(System.String));
dt.Columns.Add(dc);
dc = new DataColumn(ColB, typeof(System.String));
dt.Columns.Add(dc);
foreach (var item in qry) {
DataRow dr = dt.NewRow();
dr[ColA] = item.ColA;
dt.Rows.Add(dr);
}
foreach (DataColumn col in dt.Columns) {
col.ReadOnly = false;
BoundField bf = new BoundField();
bf.DataField = col.ColumnName;
bf.HeaderText = col.ColumnName;
GridView1.Columns.Add(bf);
}
GridView1.DataSource = dt;
GridView1.DataBind();
在aspx页面中制作GridView控件
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" >
<Columns>
<asp:TemplateField HeaderText="ColB">
<EditItemTemplate>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label1" runat="server" ></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:CommandField ButtonType="Button" ShowDeleteButton="True"
ShowEditButton="True" ShowInsertButton="True" UpdateText="Save">
</asp:CommandField>
</Columns>
</asp:GridView>