【发布时间】:2015-06-28 09:51:44
【问题描述】:
我已经使用模板字段以编程方式设置了一个 DataGridView,如下所示。
class DayColumn : ITemplate
{
public void InstantiateIn(System.Web.UI.Control container)
{
DropDownList ddlEntryType = new DropDownList();
ddlEntryType.ID = "ddlEntryType";
ddlEntryType.DataValueField = "EntryTypeID";
ddlEntryType.DataTextField = "Title";
var entryTypes = EntryType.GetAll();
ddlEntryType.DataSource = entryTypes;
ddlEntryType.DataBind();
ddlEntryType.Width = 120;
container.Controls.Add(ddlEntryType);
TextBox txtHours = new TextBox();
txtHours.ID = "txtHours";
txtHours.Text = "0";
txtHours.Width = 100;
txtHours.ValidationGroup = "Validation";
container.Controls.Add(txtHours);
然后我使用此模板字段设置整个数据网格。
var storeID = Request.QueryString["storeID"];
var employees = Employee.GetForTimesheet(storeID.ToInt());
var boundField = new BoundField();
boundField.DataField = "Firstname";
boundField.HeaderText = "First Name";
grdTimesheet.Columns.Add(boundField);
boundField = new BoundField();
boundField.DataField = "Lastname";
boundField.HeaderText = "Second Name";
grdTimesheet.Columns.Add(boundField);
boundField = new BoundField();
boundField.DataField = "PayrollNumber";
boundField.HeaderText = "Payroll Number";
grdTimesheet.Columns.Add(boundField);
var templateField = new TemplateField();
templateField.ItemTemplate = new DayColumn();
templateField.HeaderText = "Monday";
grdTimesheet.Columns.Add(templateField);
templateField = new TemplateField();
templateField.ItemTemplate = new DayColumn();
templateField.HeaderText = "Tuesday";
grdTimesheet.Columns.Add(templateField);
我的问题是,当我想从每个单元格的文本框和下拉列表中获取数据时,它总是返回 null。
protected void SaveTimesheet(object sender, EventArgs e)
{
for (int i = 0; i < grdTimesheet.Rows.Count; i++)
{
TimesheetDataGridEmployee tsEmployee = new TimesheetDataGridEmployee();
tsEmployee.firstName = grdTimesheet.Rows[i].Cells[0].Text.ToString();
tsEmployee.lastName = grdTimesheet.Rows[i].Cells[1].Text.ToString();
tsEmployee.payrollNumber = grdTimesheet.Rows[i].Cells[2].Text.ToInt();
TextBox txtMonday = (TextBox) grdTimesheet.Rows[i].Cells[3].FindControl("txtHours");
tsEmployee.week.monday.hours = txtMonday.Text.ToDecimal();
DropDownList ddlMonday = grdTimesheet.Rows[i].Cells[3].FindControl("ddlEntryType") as DropDownList;
tsEmployee.week.monday.entryTypeID = ddlMonday.SelectedValue.ToInt();
}
}
txtMonday 和 ddlMonday 总是返回 null,尽管我使用了我认为和其他人所说的从数据网格获取控件的正确方法。行和单元格目标与 findControl 参数一样正确。如果有人可以帮助我,我将不胜感激,因为我似乎已经用尽了所有其他资源以希望找到解决方案,如果需要,我完全愿意改变它的结构。
这里是完整的代码:
public partial class EditTimesheet : BasePage
{
protected void Page_Load(object sender, EventArgs e)
{
this.Permissionstring = "Timesheets_Edit";
if (!IsPostBack)
{
}
LoadData();
}
protected void LoadDays()
{
var templateField = new TemplateField();
templateField.ItemTemplate = new DayColumn();
templateField.HeaderText = "Monday";
grdTimesheet.Columns.Add(templateField);
templateField = new TemplateField();
templateField.ItemTemplate = new DayColumn();
templateField.HeaderText = "Tuesday";
grdTimesheet.Columns.Add(templateField);
templateField = new TemplateField();
templateField.ItemTemplate = new DayColumn();
templateField.HeaderText = "Wednesday";
grdTimesheet.Columns.Add(templateField);
templateField = new TemplateField();
templateField.ItemTemplate = new DayColumn();
templateField.HeaderText = "Thursday";
grdTimesheet.Columns.Add(templateField);
templateField = new TemplateField();
templateField.ItemTemplate = new DayColumn();
templateField.HeaderText = "Friday";
grdTimesheet.Columns.Add(templateField);
templateField = new TemplateField();
templateField.ItemTemplate = new DayColumn();
templateField.HeaderText = "Saturday";
grdTimesheet.Columns.Add(templateField);
}
protected void LoadData()
{
grdTimesheet.Columns.Clear();
var boundField = new BoundField();
boundField.DataField = "Firstname";
boundField.HeaderText = "First Name";
grdTimesheet.Columns.Add(boundField);
boundField = new BoundField();
boundField.DataField = "Lastname";
boundField.HeaderText = "Second Name";
grdTimesheet.Columns.Add(boundField);
boundField = new BoundField();
boundField.DataField = "PayrollNumber";
boundField.HeaderText = "Payroll Number";
grdTimesheet.Columns.Add(boundField);
LoadDays();
SourceAndBind();
}
protected void SourceAndBind()
{
var storeID = Request.QueryString["storeID"];
var employees = Employee.GetForTimesheet(storeID.ToInt());
grdTimesheet.DataSource = employees;
grdTimesheet.DataBind();
}
protected void SaveTimesheet(object sender, EventArgs e)
{
for (int i = 0; i < grdTimesheet.Rows.Count; i++)
{
TimesheetDataGridEmployee tsEmployee = new TimesheetDataGridEmployee();
tsEmployee.firstName = grdTimesheet.Rows[i].Cells[0].Text.ToString();
tsEmployee.lastName = grdTimesheet.Rows[i].Cells[1].Text.ToString();
tsEmployee.payrollNumber = grdTimesheet.Rows[i].Cells[2].Text.ToInt();
DropDownList ddlMonday = grdTimesheet.Rows[i].Cells[3].FindControl("ddlEntryType") as DropDownList;
tsEmployee.week.monday.entryTypeID = ddlMonday.SelectedValue.ToInt();
TextBox txtMonday = (TextBox) grdTimesheet.Rows[i].Cells[3].FindControl("txtHours");
tsEmployee.week.monday.hours = txtMonday.Text.ToDecimal();
}
}
}
以及实例化:
public void InstantiateIn(System.Web.UI.Control container)
{
DropDownList ddlEntryType = new DropDownList();
ddlEntryType.ID = "ddlEntryType";
ddlEntryType.DataValueField = "EntryTypeID";
ddlEntryType.DataTextField = "Title";
var entryTypes = EntryType.GetAll();
ddlEntryType.DataSource = entryTypes;
ddlEntryType.DataBind();
ddlEntryType.Width = 120;
container.Controls.Add(ddlEntryType);
TextBox txtHours = new TextBox();
txtHours.ID = "txtHours";
txtHours.Text = "0";
txtHours.Width = 100;
txtHours.ValidationGroup = "Validation";
container.Controls.Add(txtHours);
}
网格视图:
<asp:GridView ID="grdTimesheet" runat="server" class="table table-striped table-bordered table-hover" AutoGenerateColumns="False" Font-Size="10"
Font-Names="Arial" GridLines="Vertical" Width="40%" OnRowDataBound="grdTimesheet_RowDataBound">
</asp:GridView>
【问题讨论】:
-
txtMonday 和 ddlMonday 控件在回发后是否可用?如果没有,那么您必须将 Page_Init 方法中的列添加到数据网格。
-
我已将数据加载从 Page_Load 切换到 Page_Init 但它仍然返回 null。
-
您的意思是在 UI 中回发后控件可用,但在事件处理程序中为空?
-
回发后,控件从数据网格中的字段中清除,因此在事件处理程序中也返回 null。顺便说一句,感谢您抽出宝贵时间帮我查看。
-
您必须在每次回帖时再次绑定数据网格。
标签: c# asp.net datagridview datagrid webforms