大家好日子,
我有一个基本输入表单的Web应用程序。输入表单具有动态网格视图,允许用户输入任意数量的行以输入行程信息。
除了两个方面外,大多数事情都运作良好;
我已经研究了一个星期了,我想我需要一套新的眼睛。在我的代码隐藏和aspx页面中,我可以忽略的是使我的gridview显示,以及CodeBehind页面识别设计器文件。
<%@ Page Language="C#" AutoEventWireup="True" MasterPageFile="~/Site.Master" CodeBehind="intakeTripDetails.aspx.cs" Inherits="WebApplication2.TravelerInformation" %>
<asp:Content ID="intakeTripDets" ContentPlaceHolderID="MainContent" runat="server">
<fieldset>
<legend>Trip Details</legend>
<div class="input">
<p>Please enter trip details on the below form. You can add additional rows as needed for each leg of our trip.</p>
<br />
<asp:Label runat="server" ID="lblMessage" Text="" ></asp:Label><br />
<label>Flight Number(s)</label><asp:TextBox runat="server"></asp:TextBox>
<br /><br /><br /><br />
<asp:GridView ID="tripDetails" runat="server" ShowFooter="True" ShowHeaderWhenEmpty="True">
<Columns>
<asp:BoundField DataField="RowNumber" HeaderText="" />
<asp:TemplateField HeaderText="Arrival Date & Time" >
<ItemTemplate>
<asp:TextBox ID="arrivalDateTime" runat="server"></asp:TextBox>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Departure Date & Time">
<ItemTemplate>
<asp:TextBox ID="departDateTime" runat="server"></asp:TextBox>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Country">
<ItemTemplate>
<asp:DropDownList ID="countryList" runat="server" AutoPostBack="true" AppendDataBoundItems="true">
<asp:ListItem Value="-1">--SELECT--</asp:ListItem>
</asp:DropDownList>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="City">
<ItemTemplate>
<asp:TextBox ID="city" runat="server">
</asp:TextBox>
</ItemTemplate>
<FooterStyle HorizontalAlign="Right" />
<FooterTemplate>
<asp:Button ID="btnAdd" runat="server" Text="Add New Row" />
</FooterTemplate>
</asp:TemplateField>
<asp:TemplateField>
<ItemTemplate>
<asp:LinkButton ID="lnkRemove" runat="server">Remove</asp:LinkButton>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
<div class="btnfmt"><%--<asp:Button ID="prev" runat="server" Text="Previous: Traveler Information" />--%>
<asp:Button ID="submit" runat="server" text="Submit Trip"/> </div>
</div>
</fieldset> </asp:Content>
代码隐藏:
using System;
using System.Configuration;
using System.Collections;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Text;
using System.Data;
using System.Data.Sql;
using System.Data.SqlClient;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
namespace travelDetails
{
public partial class DynamicGrid : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
SetInitialRow();
}
}
private ArrayList countryData()
{
ArrayList arr = new ArrayList();
arr.Add(new ListItem("Afghanistan", "1"));
arr.Add(new ListItem("Aland Islands", "2"));
arr.Add(new ListItem("Albania", "3"));
arr.Add(new ListItem("Algeria", "4"));
arr.Add(new ListItem("American Samoa", "5"));
arr.Add(new ListItem("Andorra", "6"));
arr.Add(new ListItem("Angola", "7"));
arr.Add(new ListItem("Anguilla", "8"));
arr.Add(new ListItem("Antarctica", "9"));
arr.Add(new ListItem("Antigua and Barbuda", "10"));
arr.Add(new ListItem("Argentina", "11"));
arr.Add(new ListItem("Armenia", "12"));
arr.Add(new ListItem("Aruba", "13"));
arr.Add(new ListItem("Australia", "14"));
arr.Add(new ListItem("Austria", "15"));
arr.Add(new ListItem("Azerbaijan", "16"));
arr.Add(new ListItem("Bahamas", "17"));
arr.Add(new ListItem("Bahrain", "18"));
arr.Add(new ListItem("Bangladesh", "19"));
arr.Add(new ListItem("Barbados", "20"));
return arr;
}
private void FillDropDownList(DropDownList ddl)
{
ArrayList arr = countryData();
foreach (ListItem item in arr)
{
ddl.Items.Add(item);
}
}
private void SetInitialRow()
{
DataTable dt = new DataTable();
DataRow dr = null;
dt.Columns.Add(new DataColumn("RowNumber", typeof(string)));
dt.Columns.Add(new DataColumn("arrivalDateTime", typeof(DateTime)));
dt.Columns.Add(new DataColumn("departDateTime", typeof(DateTime)));
dt.Columns.Add(new DataColumn("city", typeof(string)));
dt.Columns.Add(new DataColumn("countryList", typeof(string)));
dr = dt.NewRow();
dr["RowNumber"] = 1;
dr["arrivalDateTime"] = string.Empty;
dr["departDateTime"] = string.Empty;
dr["city"] = string.Empty;
dt.Rows.Add(dr);
//What if I want to see the data for future reference
ViewState["CurrentTable"] = dt;
//Data is stuck here
tripDetails.DataSource = dt;
tripDetails.DataBind();
DropDownList ddl1 = (DropDownList)tripDetails.Rows[0].Cells[4].FindControl("countryList");
FillDropDownList(ddl1);
}
private void AddNewRowToGrid()
{
int rowIndex = 0;
if (ViewState["CurrentTable"] != null)
{
DataTable dtCurrentTable = (DataTable)ViewState["CurrentTable"];
DataRow drCurrentRow = null;
if (dtCurrentTable.Rows.Count > 0)
{
drCurrentRow = dtCurrentTable.NewRow();
drCurrentRow["RowNumber"] = dtCurrentTable.Rows.Count + 1;
for (int i = 0; i < dtCurrentTable.Rows.Count - 1; i++)
{
//extract the textbox values
TextBox box1 = (TextBox)tripDetails.Rows[i].Cells[1].FindControl("arrivalDateTime");
TextBox box2 = (TextBox)tripDetails.Rows[i].Cells[2].FindControl("departDateTime");
TextBox box3 = (TextBox)tripDetails.Rows[i].Cells[3].FindControl("city");
dtCurrentTable.Rows[i]["arrivalDateTime"] = box1.Text;
dtCurrentTable.Rows[i]["departDateTime"] = box2.Text;
dtCurrentTable.Rows[i]["city"] = box3.Text;
//extract the ddl values
DropDownList ddl1 = (DropDownList)tripDetails.Rows[i].Cells[4].FindControl("countryList");
//Update the DataRow with the ddl items selected
dtCurrentTable.Rows[i]["countryList"] = ddl1.SelectedItem.Text;
}
//Adds new row to the data table
dtCurrentTable.Rows.Add(drCurrentRow);
//Again...we probably want to refer to this again
ViewState["CurrentTable"] = dtCurrentTable;
//Rebind the grid with the current data
tripDetails.DataSource = dtCurrentTable;
tripDetails.DataBind();
}
else
{
Response.Write("View State is Null");
}
//Set previous data on postbacks
SetPreviousData();
}
}
private void SetPreviousData()
{
int rowIndex = 0;
if (ViewState["CurrentTable"] != null)
{
DataTable dt = (DataTable)ViewState["CurrentTable"];
if (dt.Rows.Count > 0)
{
for (int i = 0; i < dt.Rows.Count; i++)
{
TextBox box1 = (TextBox)tripDetails.Rows[i].Cells[2].FindControl("arrivalDateTime");
TextBox box2 = (TextBox)tripDetails.Rows[i].Cells[3].FindControl("departDateTime");
TextBox box3 = (TextBox)tripDetails.Rows[i].Cells[4].FindControl("city");
DropDownList ddl1 = (DropDownList)tripDetails.Rows[rowIndex].Cells[4].FindControl("countryList");
//Fill the ddl with data
FillDropDownList(ddl1);
if (i < dt.Rows.Count - 1)
{
//Assign the value from the datatable to the textbox
box1.Text = dt.Rows[i]["arrivalDateTime"].ToString();
box2.Text = dt.Rows[i]["departDateTime"].ToString();
box3.Text = dt.Rows[i]["city"].ToString();
//Set the previously selected items to each ddl
ddl1.ClearSelection();
ddl1.Items.FindByText(dt.Rows[i]["countryList"].ToString()).Selected = true;
}
rowIndex++;
}
}
}
}
protected void btnAdd_Click(object sender, EventArgs e)
{
AddNewRowToGrid();
}
protected void tripDetails_RowCreated(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
DataTable dt = (DataTable)ViewState["CurrentTable"];
LinkButton lb = (LinkButton)e.Row.FindControl("lnkRemove");
if (lb != null)
{
if (dt.Rows.Count > 1)
{
if (e.Row.RowIndex == dt.Rows.Count - 1)
{
lb.Visible = true;
}
}
else
{
lb.Visible = true;
}
}
}
}
protected void lnkRemove_Click(object sender, EventArgs e)
{
LinkButton lb = (LinkButton)sender;
GridViewRow gvRow = (GridViewRow)lb.NamingContainer;
int rowID = gvRow.RowIndex;
if (ViewState["CurrentTable"] != null)
{
DataTable dt = (DataTable)ViewState["CurrentTable"];
if (dt.Rows.Count > 1)
{
if (gvRow.RowIndex < dt.Rows.Count - 1)
{
//Remove selected row data and reset row number
dt.Rows.Remove(dt.Rows[rowID]);
ResetRowID(dt);
}
}
//And another future reference
ViewState["CurrentTable"] = dt;
//Bind the data to the gridview again with updated data
tripDetails.DataSource = dt;
tripDetails.DataBind();
}
//Set previous data on postback
SetPreviousData();
}
private void ResetRowID(DataTable dt)
{
int rowNumber = 1;
if (dt.Rows.Count > 0)
{
foreach (DataRow row in dt.Rows)
{
row[0] = rowNumber;
rowNumber++;
}
}
}
我已经尝试过我能想到的一切 - 1.删除Designer文件和“转换为Web应用程序” 2.在另一个文件中重做代码 3.重新创建整个项目 4.使一切可见/不可见
任何帮助都会很棒!
修改
好的更新,我做了一些更改,现在我有错误表明The type or namespace name 'DataBind' does not exist in the namespace 'tripDetails' (are you missing an assembly reference?)
。此错误显示'DataBind''DataSource'和'Rows。
我可能导致这些错误的引用或命名空间中缺少什么。我没有对这个区域做任何改动。
更新我能够最终清除所有错误,但我仍然无法在浏览器中看到我的空gridview。任何人吗?
答案 0 :(得分:0)
我认为你混淆了ID和名字。名称允许从控件分配或检索数据。
更改ID="tripDetails"
to name="tripDetails"
,它应该有效。同样,我建议对其余的控件做同样的事情。