- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在制作一个 GenericTable
作为 GridView
的自定义实现,它将显示插入的任何对象列表的值。
要在 aspx 页面上使用该控件,它需要是一个 UserControl,因此 GridView
作为一个组件包含在 GenericTable
中:
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="GenericTable.ascx.cs" Inherits="CASH.WebApplication.Controls.GenericTable" %>
<div style="width: 100%; overflow: scroll">
<asp:GridView ID="grid" runat="server"></asp:GridView>
</div>
第一次使用我的控件时效果很好,它已添加到 aspx 页面上。这样做似乎增加了某种魔法来启动控制组件。当用户单击具有其自身属性的项目时,GenericTable
应在当前行下方插入一行并生成一个将显示所述属性的新 GenericTable
。 table
是我用来设置 GridView
内容的 DataTable:
var data = table.NewRow();
var child = new GenericTable();
data[0] = child;
table.Rows.InsertAt(data, row);
grid.DataSource = table;
grid.DataBind(); // The extra row is displayed now, initialize components in the aspx code?
child.MakeTable(); // Throws exception because it's `grid` property is null.
当我尝试激活新制作的 GenericTable
时,在这段代码之后,它的 grid
为空。
有没有办法初始化当此控件位于 aspx 代码中时发生的相同魔术?
更新:也许问题在于表在回发之间的存储方式,目前我正在使用 session ,也许有更好的方法来记住用户输入?整个 GenericTable
代码:
using Project.DomainModel.Models;
using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace CASH.WebApplication.Controls
{
public partial class GenericTable : UserControl
{
private PropertyInfo[] properties;
//private GridView gridView;
private DataTable table = new DataTable();
private Dictionary<int, int> ingedrukt = new Dictionary<int, int>();
protected void Page_Init(object sender, EventArgs e)
{
grid.RowCommand += WeergaveDossiers_RowCommand;
}
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
for (int i = 0; i < grid.Rows.Count; i++)
{
grid.Rows[i].Cells[0].ColumnSpan = 0;
}
}
else
{
properties = (PropertyInfo[])Session["properties"];
table = (DataTable)Session["table"];
ingedrukt = (Dictionary<int, int>)Session["ingedrukt"];
foreach (var knop in ingedrukt)
{
DetailRijToevoegen(knop.Key, knop.Value);
}
}
grid.DataBind();
}
protected void SaveInSession()
{
Session["properties"] = properties;
Session["table"] = table;
Session["ingedrukt"] = ingedrukt;
}
protected void WeergaveDossiers_RowCommand(object sender, GridViewCommandEventArgs e)
{
int row = int.Parse((string)e.CommandArgument) + 1;
int col = GetKolomIndex(e.CommandName) + 1;
if (ingedrukt.ContainsKey(row))
{
if (ingedrukt[row] != col)
{
//DetailRijVerwijderen(row);
//ingedrukt.Remove(row);
//ingedrukt[row] = col;
}
}
else
{
ingedrukt[row] = col;
}
//DetailRijToevoegen(row, col);
SaveInSession();
}
protected void DetailRijToevoegen(int row, int col)
{
var data = table.NewRow();
var child = new GenericTable();
child.grid = new GridView();
data[0] = child;
table.Rows.InsertAt(data, row);
grid.DataSource = table;
grid.DataBind();
var cells = grid.Rows[row].Cells;
// Only keep the first cell
while (cells.Count > 1)
{
cells.RemoveAt(1);
}
child.MaakTable(new List<object>() { table.Rows[row][col] });
grid.Columns[0].Visible = true;
grid.Rows[row].Cells[0].ColumnSpan = table.Columns.Count;
}
protected void DetailRijVerwijderen(int row)
{
}
protected int GetKolomIndex(string naam)
{
for (int i = 0; i < properties.Length; i++)
{
if (properties[i].Name == naam)
{
return i;
}
}
throw new InvalidDataException("Kolom naam " + naam + " niet bekend");
}
public void MaakTable(IEnumerable<object> data)
{
properties = data.First().GetType().GetProperties().Where(p => p.CanRead).ToArray();
grid.AutoGenerateColumns = false;
var details = new BoundField();
details.DataField = "Details";
grid.Columns.Add(details);
table.Columns.Add(new DataColumn("Details", typeof(object)));
foreach (var veld in properties)
{
table.Columns.Add(new DataColumn(veld.Name, (veld.Name == "Id" ? typeof(object) : veld.PropertyType)));
grid.Columns.Add(MaakKolom(veld));
}
foreach (var entry in data)
{
var row = table.NewRow();
int col = 0;
foreach (var veld in properties)
{
row[++col] = veld.GetValue(entry);
}
table.Rows.Add(row);
}
grid.DataSource = table;
SaveInSession();
}
protected DataControlField MaakKolom(PropertyInfo veld)
{
DataControlField field;
if (typeof(Entity).IsAssignableFrom(veld.PropertyType))
{
field = new ButtonField();
((ButtonField)field).DataTextField = veld.Name;
((ButtonField)field).ButtonType = ButtonType.Button;
((ButtonField)field).CommandName = veld.Name;
}
else if (veld.PropertyType == typeof(bool))
{
field = new CheckBoxField();
((CheckBoxField)field).DataField = veld.Name;
}
else if (veld.PropertyType.IsEnum)
{
field = new TemplateField();
//((TemplateField)field).ItemTemplate = (ITemplate)new Label()
//{
// Text = "#DataBinder.Eval(\"" + veld.Name + "\")",
//};
}
else if (veld.PropertyType == typeof(DateTime))
{
field = new TemplateField();
//field.DatePicker = true;
}
else
{
field = new BoundField();
((BoundField)field).DataField = veld.Name;
}
field.HeaderText = veld.Name;
return field;
}
protected void OnRowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
}
}
}
}
最佳答案
我不太确定你想要达到什么目的,我只知道你所做的从根本上是错误的(好吧,就 ASP.NET 的世界观而言......)。
Session
绝对是存储大量页面相关数据的错误位置。我将从最后一点开始:如果这是需要在两次访问站点之间保留的数据,那么您必须将其放入数据库中。如果这是仅从某人登录时到他们注销时存在的数据,那么是的,Session
可能是合适的地方。否则,如果它特定于页面并且在用户访问另一个页面时应该被丢弃,那么您应该每次都从数据库中重新加载它或者也许将它存储在 ViewState
中。 .
接下来,是否所有的对象都是同一类型/它们是否具有相同的字段?如果是这样,那么默认行为(由 AutoGenerateColumns
显式控制)将为您完成这项工作,无需额外工作:
<asp:GridView runat="server"
ID="grid"
AutoGenerateColumns="true" />
如果不有相同的列,那么它们应该在单独的网格中;一个GridView
是一种创建 HTTP <table>
的方法元素。表格元素应该只包含相关数据;您不会使用一个表格来显示鱼的价格和汽车的颜色。由此得出结论,如果您有不同的表和不相关的数据,那么您应该有不同的数据源……一个更简单的解决方案,这意味着您不需要实现您的控制正在尝试实现。
最后,为了完整起见,当您定义一个控件时,您只是在创建一个类。如果您希望能够以您尝试的方式实例化控件,那么您需要确保其所有数据成员都在构造函数中实例化或任何引用都由 null- 保护引用检查:
if (grid != null)
{
// Do stuff with grid
}
关于c# - 为什么我的自定义控件的组件没有启动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21337312/
我错过了什么,我已完成 的安装指南中要求的所有步骤 native 脚本 运行 tns doctor 给我以下输出... C:\abc\xyz>tns doctor √ Getting environm
尝试从 {addToCart(book)}}/>}> 传递数据至}> 问题: 购物车 ( render={()=> ) 收到 null,但没有收到我尝试发送的对象 已放置“console.log...
这是 _app.tsx 的外观: function MyApp({ Component, pageProps }: AppProps) { return } 我在构建项目时遇到了这个错误: Ty
我的 Laravel Vue 组件收到以下警告: [Vue warn]: Avoid mutating a prop directly since the value will be overwrit
根据这个example更详细this one我刚刚遇到了一件奇怪的事情...... 如果我使用方法作为 addTab(title,icon,component) 并且下一步想使用 setTabComp
目前我有一个捕获登录数据的表单,一个带有 TIWDBGrid 的表单,它应该返回与我从我的 mysql 数据库登录时创建的 user_id 关联的任何主机,以及一个共享数据模块。 下面是我的登录页面代
在我的react-native应用程序中,我目前有一个本地Android View (用java编写)正确渲染。当我尝试将我的react-native javascript 组件之一放入其中时,出现以
我为作业编写了简单的代码。我引用了文档和几个 youtube 视频教程系列。我的 react 代码是正确的我在运行代码时没有收到任何错误。但是这些 react-boostrap 元素没有渲染。此代码仅
几周前我刚刚开始使用 Flow,从一周前开始我就遇到了 Flow 错误,我不知道如何修复。 代码如下: // @flow import React, { Component } from "react
我想在同一个 View 中加载不同的 web2py 组件,但不是同时加载。我有 5 个 .load 文件,它们具有用于不同场景的表单字段,这些文件由 onchange 选择脚本动态调用。 web2py
关闭。这个问题是opinion-based .它目前不接受答案。 想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题. 6年前关闭。 Improve t
Blazor 有 InputNumber将输入限制为数字的组件。然而,这呈现了一个 firefox 不尊重(它允许任何文本)。 所以我尝试创建一个过滤输入的自定义组件: @inherits Inpu
我在学习 AngularDART 组件时编写了以下简单代码,但没有显示任何内容,任何人都可以帮助我知道我犯了什么错误: 我的 html 主文件:
我想在初始安装组件时或之后为 div 设置动画(淡入)。动画完成后,div 不应消失。我正在尝试使用 CSSTransition 组件并查看 reactcommunity.org 上的示例,但我根本无
我需要一个 JSF 组件来表示甘特图。是否有任何组件库(如 RichFaces)包含这样的组件? 最佳答案 JFreeChart有甘特图和PrimeFaces有一个图像组件,允许您动态地流式传输内容。
从软件工程的角度来看,组件、模块和子系统之间有什么区别? 提前致谢! 最佳答案 以下是 UML 2.5 的一些发现: 组件:该子句指定一组结构,可用于定义任意大小和复杂性的软件系统。特别是,它将组件指
我有使用非托管程序集(名为 unmanaged.dll)的托管应用程序(名为 managed.exe)。到目前为止,我们已经创建了 Interop.unmanaged.dll,managed.exe
我有一个跨多个应用程序复制的 DAL(我知道它的设计很糟糕,但现在忽略它),我想做的是这个...... 创建一个将通过所有桌面应用程序访问的 WCF DAL 组件。任何人都可以分享他们对关注的想法吗?
我有一个 ComboBox 的集合声明如下。 val cmbAll = for (i /** action here **/ } 所有这些都放在一个 TabbedPane 中。我想这不是问题。那么我
使用 VB6 创建一个 VB 应用程序。应用程序的一部分显示内部的闪存。 当我使用 printform它只是打印整个应用程序。我不知道如何单独打印闪光部分。任何帮助,将不胜感激!.. 谢谢。 最佳答案
我是一名优秀的程序员,十分优秀!