C#从gridview读取用户输入 [英] C# read user input from gridview
问题描述
我有一个gridview,当用户点击添加新行时会生成新行。
但是当我从c#读取用户输入时遇到问题,我需要插入所有用户按行输入到我的数据库中。
受保护 < span class =code-keyword> void Page_Load( object sender,EventArgs e)
{
if (!Page.IsPostBack)
{
SetInitialRow();
}
}
私有 void SetInitialRow()
{
DataTable dt = new DataTable();
DataRow dr = null ;
dt.Columns.Add( new DataColumn( RowNumber, typeof ( string )));
dt.Columns.Add( new DataColumn( Column1, typeof ( string )));
dt.Columns.Add( new DataColumn( Column2, typeof ( string )));
dt.Columns.Add( new DataColumn( Column3, typeof ( string )));
dr = dt.NewRow();
dr [ RowNumber] = 1 跨度>;
dr [ Column1] = string 跨度> .Empty;
dr [ Column2] = string 跨度> .Empty;
dr [ Column3] = string 跨度> .Empty;
dt.Rows.Add(dr);
// 将DataTable存储在ViewState中
ViewState [< span class =code-string> CurrentTable] = dt;
Gridview1.DataSource = dt;
Gridview1.DataBind();
}
私有 void AddNewRowToGrid()
{
int rowIndex = 0 ;
if (ViewState [ CurrentTable]!= null )
{
DataTable dtCurrentTable =(DataTable)ViewState [ CurrentTable];
DataRow drCurrentRow = null ;
if (dtCurrentTable.Rows.Count > 0 )
{
for ( int i = < span class =code-digit> 1 ; i < = dtCurrentTable.Rows.Count; i ++)
{
// 提取TextBox值
TextBox box1 =(TextBox)Gridview1.Rows [rowIndex] .Cells [ 1 ]。FindControl( Date< /跨度>);
TextBox box2 =(TextBox)Gridview1.Rows [rowIndex] .Cells [ 2 ]。FindControl( 描述);
TextBox box3 =(TextBox)Gridview1.Rows [rowIndex] .Cells [ 3 ]。FindControl( 小时);
drCurrentRow = dtCurrentTable.NewRow();
drCurrentRow [ RowNumber] = i + 1 跨度>;
dtCurrentTable.Rows [i - 1 ] [ Column1] = box1.Text;
dtCurrentTable.Rows [i - 1 ] [ Column2] = box2.Text;
dtCurrentTable.Rows [i - 1 ] [ Column3] = box3.Text;
rowIndex ++;
}
dtCurrentTable.Rows.Add(drCurrentRow);
ViewState [ CurrentTable] = dtCurrentTable;
Gridview1.DataSource = dtCurrentTable;
Gridview1.DataBind();
}
}
else
{
Response.Write( ViewState为空);
}
// 在回发中设置以前的数据
SetPreviousData();
}
private void SetPreviousData()
{
int rowIndex = 0 ;
if (ViewState [ CurrentTable]!= null )
{
DataTable dt =(DataTable)ViewState [ CurrentTable];
if (dt.Rows.Count > 0 )
{
for ( int i = < span class =code-digit> 0 ; i < dt.Rows.Count; i ++)
{
TextBox box1 =(TextBox)Gridview1.Rows [rowIndex] .Cells [ 1 ]。FindControl( 日期跨度>);
TextBox box2 =(TextBox)Gridview1.Rows [rowIndex] .Cells [ 2 ]。FindControl( 描述);
TextBox box3 =(TextBox)Gridview1.Rows [rowIndex] .Cells [ 3 ]。FindControl( 小时);
box1.Text = dt.Rows [i] [ Column1 ]的ToString();
box2.Text = dt.Rows [i] [ Column2]。ToString( );
box3.Text = dt.Rows [i] [ Column3]。ToString( );
rowIndex ++;
}
}
}
}
受保护 void ButtonAdd_Click( object sender,EventArgs e)
{
AddNewRowToGrid();
}
受保护 void SUBMIT_Click( object sender,EventArgs e)
{
}
my html
< asp:gridview ID = Gridview1 runat = 服务器 ShowFooter = true AutoGenerateColumns = false <跨度class =code-keyword>>
< 列 < span class =code-keyword>>
< asp:BoundField DataField = RowNumber HeaderText = 否 / >
< asp :TemplateField HeaderText = 日期 >
< ItemTemplate >
< asp:TextBox ID = 日期 runat = server > < / asp:TextBox >
< ; / ItemTemplate >
< / asp :TemplateField >
< asp:TemplateField HeaderText = 培训说明 >
< ItemTemplate >
< asp:TextBox ID = 描述 runat = server > 跨度> < span class =code-keyword>< / asp:TextBox >
< / ItemTemplate >
< / asp:TemplateField > ;
< asp:TemplateField HeaderText = 小时 >
< ItemTemplate >
< ASP:文本框 ID = 小时 runat = 服务器 > < / asp:TextBox >
< / ItemTemplate >
< FooterStyle HorizontalAlign = 右 / >
< FooterTemplate >
< asp:按钮 ID = ButtonAdd runat = server 文字 = 添加新行
< span class =code-attribute> onclick = ButtonAdd_Click / >
< / FooterTemplate >
< / asp:TemplateField >
< /列 >
< / asp:gridview >
< asp:按钮 ID = SubmitBtn runat = server 文字 = 提交 onclick = SUBMIT_Click / < span class =code-keyword>>
我的尝试:
即时尝试使用c#读取用户输入,但保持它不能,失败循环,设法只读第1行,请指导我这个
根据我的理解,您希望在数据库表中插入所有gridview行。
您可以做的一件事是使用for来迭代gridview / foreach循环并将数据存储在数据表中,然后使用 SqlBulkCopy 立即将数据插入数据库。
其他方式是使用循环并插入每个ro w在数据库中一个接一个。
Hai
我不确定这是你需要的解决方案,这是我在你的方法中找到的东西
解决方案1 - 如下所示更改您的代码
private void SetPreviousData()
{
int rowIndex = 0 跨度>;
if (ViewState [ CurrentTable]!= null )
{
DataTable dt =(DataTable)ViewState [ CurrentTable];
if (dt.Rows.Count > 0 )
{
for ( int i = < span class =code-digit> 0 ; i < dt.Rows.Count; i ++)
{
TextBox box1 =(TextBox)Gridview1.Rows [rowIndex] .Cells [ 1 ]。FindControl( 日期跨度>);
TextBox box2 =(TextBox)Gridview1.Rows [rowIndex] .Cells [ 2 ]。FindControl( 描述);
TextBox box3 =(TextBox)Gridview1.Rows [rowIndex] .Cells [ 3 ]。FindControl( 小时);
if ( String .IsNullOrEmpty(dt.Rows [i] [ Column1]。ToString()))
{
if (!String.IsNullOrEmpty(box1.Text))
{
dt.Rows [i] [ < span class =code-string> Column1] = box1.Text;
}
}
if ( String .IsNullOrEmpty(dt。行[i] [ Column2]。ToString()))
{
if (!String.IsNullOrEmpty(box1.Text))
{
dt.Rows [i] [ Column2] = box2.Text;
}
}
if ( String .IsNullOrEmpty(dt。行[i] [ Column3]。ToString()))
{
if (!String.IsNullOrEmpty(box1.Text))
{
dt.Rows [i] [ Column3] = box3.Text;
}
}
box1.Text = dt.Rows [i] [ column1的跨度>]的ToString();
box2.Text = dt.Rows [i] [ Column2]。ToString( );
box3.Text = dt.Rows [i] [ Column3]。ToString( );
rowIndex ++;
}
}
}
}
解决方案2:创建一个这样的方法并调用方法SUBMIT_Click
优点: - 当你的是从下面的代码行中读取: - 如果查看状态已过期,那么您也可以直接从您的数据网格中读取所有数据
2: - 在网格中添加第二行后如果您更改了数据你的第一行然后上面的方法将给你一个头部疼痛的未更新数据在你的视图状态
如果你使用下面的方法所有更新的数据将
私人 DataTable ReadAllGridValues()
{
DataTable dt = InitializeDataTable();
int rowIndex = 1 ;
DataRow dr = null ;
for ( int rowCount = 0 ; rowCount< Gridview1.Rows.Count; rowCount ++)
{
TextBox box1 =(TextBox)Gridview1.Rows [rowCount] .Cells [ 1 ]。FindControl( Date);
TextBox box2 =(TextBox)Gridview1.Rows [rowCount] .Cells [ 2 ]。FindControl( 描述);
TextBox box3 =(TextBox)Gridview1.Rows [rowCount] .Cells [ 3 ]。FindControl( 小时);
dr = dt.NewRow();
dr [ RowNumber] = rowIndex + 1 跨度>;
dt.Rows [rowCount] [ Column1] = box1.Text;
dt.Rows [rowCount] [ Column2] = box2.Text;
dt.Rows [rowCount] [ Column3] = box3.Text;
dt.Rows.Add(dr);
}
return dt;
}
private DataTable InitializeDataTable()
{
DataTable dt = new DataTable();
DataRow dr = null ;
dt.Columns.Add( new DataColumn( RowNumber, typeof ( string )));
dt.Columns.Add( new DataColumn( Column1, typeof ( string )));
dt.Columns.Add( new DataColumn( Column2, typeof ( string )));
dt.Columns.Add( new DataColumn( Column3, typeof ( string )));
dr = dt.NewRow();
dr [ RowNumber] = 1 跨度>;
dr [ Column1] = string 跨度> .Empty;
dr [ Column2] = string 跨度> .Empty;
dr [ Column3] = string 跨度> .Empty;
dt.Rows.Add(dr);
return dt;
}
private void SetInitialRow()
{
DataTable dt = new DataTable();
dt = InitializeDataTable();
// 将DataTable存储在ViewState中
ViewState [ CurrentTable] = dt;
Gridview1.DataSource = dt;
Gridview1.DataBind();
}
protected void SUBMIT_Click( object sender,EventArgs e)
{
DataTable dt = ReadAllGridValues();
foreach (DataRow dr in dt.Rows)
{
}
}
*注意: - 请回复一下,如果它已经解决了你的问题
I have a gridview which will generate new line when user click on add new row.
But im having issue when read the user input from c# ,i need insert all the user input by row into my database.
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
SetInitialRow();
}
}
private void SetInitialRow()
{
DataTable dt = new DataTable();
DataRow dr = null;
dt.Columns.Add(new DataColumn("RowNumber", typeof(string)));
dt.Columns.Add(new DataColumn("Column1", typeof(string)));
dt.Columns.Add(new DataColumn("Column2", typeof(string)));
dt.Columns.Add(new DataColumn("Column3", typeof(string)));
dr = dt.NewRow();
dr["RowNumber"] = 1;
dr["Column1"] = string.Empty;
dr["Column2"] = string.Empty;
dr["Column3"] = string.Empty;
dt.Rows.Add(dr);
//Store the DataTable in ViewState
ViewState["CurrentTable"] = dt;
Gridview1.DataSource = dt;
Gridview1.DataBind();
}
private void AddNewRowToGrid()
{
int rowIndex = 0;
if (ViewState["CurrentTable"] != null)
{
DataTable dtCurrentTable = (DataTable)ViewState["CurrentTable"];
DataRow drCurrentRow = null;
if (dtCurrentTable.Rows.Count > 0)
{
for (int i = 1; i <= dtCurrentTable.Rows.Count; i++)
{
//extract the TextBox values
TextBox box1 = (TextBox)Gridview1.Rows[rowIndex].Cells[1].FindControl("Date");
TextBox box2 = (TextBox)Gridview1.Rows[rowIndex].Cells[2].FindControl("Description");
TextBox box3 = (TextBox)Gridview1.Rows[rowIndex].Cells[3].FindControl("Hours");
drCurrentRow = dtCurrentTable.NewRow();
drCurrentRow["RowNumber"] = i + 1;
dtCurrentTable.Rows[i - 1]["Column1"] = box1.Text;
dtCurrentTable.Rows[i - 1]["Column2"] = box2.Text;
dtCurrentTable.Rows[i - 1]["Column3"] = box3.Text;
rowIndex++;
}
dtCurrentTable.Rows.Add(drCurrentRow);
ViewState["CurrentTable"] = dtCurrentTable;
Gridview1.DataSource = dtCurrentTable;
Gridview1.DataBind();
}
}
else
{
Response.Write("ViewState 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)Gridview1.Rows[rowIndex].Cells[1].FindControl("Date");
TextBox box2 = (TextBox)Gridview1.Rows[rowIndex].Cells[2].FindControl("Description");
TextBox box3 = (TextBox)Gridview1.Rows[rowIndex].Cells[3].FindControl("Hours");
box1.Text = dt.Rows[i]["Column1"].ToString();
box2.Text = dt.Rows[i]["Column2"].ToString();
box3.Text = dt.Rows[i]["Column3"].ToString();
rowIndex++;
}
}
}
}
protected void ButtonAdd_Click(object sender, EventArgs e)
{
AddNewRowToGrid();
}
protected void SUBMIT_Click(object sender, EventArgs e)
{
}
my html
<asp:gridview ID="Gridview1" runat="server" ShowFooter="true" AutoGenerateColumns="false">
<Columns>
<asp:BoundField DataField="RowNumber" HeaderText="No" />
<asp:TemplateField HeaderText="Date">
<ItemTemplate>
<asp:TextBox ID="Date" runat="server"></asp:TextBox>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Training Description">
<ItemTemplate>
<asp:TextBox ID="Description" runat="server"></asp:TextBox>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Hours">
<ItemTemplate>
<asp:TextBox ID="Hours" runat="server"></asp:TextBox>
</ItemTemplate>
<FooterStyle HorizontalAlign="Right" />
<FooterTemplate>
<asp:Button ID="ButtonAdd" runat="server" Text="Add New Row"
onclick="ButtonAdd_Click" />
</FooterTemplate>
</asp:TemplateField>
</Columns>
</asp:gridview>
<asp:Button ID="SubmitBtn" runat="server" Text="Submit" onclick="SUBMIT_Click" />
What I have tried:
im tried to read user input using c# but keep it keep cant wont,fail loop,manage to read row 1 only,please guide me on this
From what I understood, you want to insert all the gridview rows in database table.
One thing you can do is to iterate on gridview using for/foreach loop and store data in a datatable and then use SqlBulkCopy to insert data into database at once.
Other way would be to use loop and insert each row one by one in database.
Hai
i'm not exactly sure this is what you need as solution,here is my what i found in your method
Solution 1 - Alter Your Code like below
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)Gridview1.Rows[rowIndex].Cells[1].FindControl("Date"); TextBox box2 = (TextBox)Gridview1.Rows[rowIndex].Cells[2].FindControl("Description"); TextBox box3 = (TextBox)Gridview1.Rows[rowIndex].Cells[3].FindControl("Hours"); if (String.IsNullOrEmpty(dt.Rows[i]["Column1"].ToString())) { if (!String.IsNullOrEmpty(box1.Text)) { dt.Rows[i]["Column1"] = box1.Text; } } if (String.IsNullOrEmpty(dt.Rows[i]["Column2"].ToString())) { if (!String.IsNullOrEmpty(box1.Text)) { dt.Rows[i]["Column2"] = box2.Text; } } if (String.IsNullOrEmpty(dt.Rows[i]["Column3"].ToString())) { if (!String.IsNullOrEmpty(box1.Text)) { dt.Rows[i]["Column3"] = box3.Text; } } box1.Text = dt.Rows[i]["Column1"].ToString(); box2.Text = dt.Rows[i]["Column2"].ToString(); box3.Text = dt.Rows[i]["Column3"].ToString(); rowIndex++; } } } }
Solution 2 : Create a Method like this and call in your methodSUBMIT_Click
Advantages : - While your are reading from below lines of code : - if view state is expired then also u are able to read all the data directly from your datagrid
2: - after adding second row in your grid if u r changing data in your first row then the above method will give you a head ache of un-updated data in your view state
if u r using below method all the updated data will be
private DataTable ReadAllGridValues() { DataTable dt = InitializeDataTable(); int rowIndex = 1; DataRow dr = null; for(int rowCount=0;rowCount<Gridview1.Rows.Count;rowCount++) { TextBox box1 = (TextBox)Gridview1.Rows[rowCount].Cells[1].FindControl("Date"); TextBox box2 = (TextBox)Gridview1.Rows[rowCount].Cells[2].FindControl("Description"); TextBox box3 = (TextBox)Gridview1.Rows[rowCount].Cells[3].FindControl("Hours"); dr = dt.NewRow(); dr["RowNumber"] = rowIndex + 1; dt.Rows[rowCount]["Column1"] = box1.Text; dt.Rows[rowCount]["Column2"] = box2.Text; dt.Rows[rowCount]["Column3"] = box3.Text; dt.Rows.Add(dr); } return dt; }
private DataTable InitializeDataTable() { DataTable dt = new DataTable(); DataRow dr = null; dt.Columns.Add(new DataColumn("RowNumber", typeof(string))); dt.Columns.Add(new DataColumn("Column1", typeof(string))); dt.Columns.Add(new DataColumn("Column2", typeof(string))); dt.Columns.Add(new DataColumn("Column3", typeof(string))); dr = dt.NewRow(); dr["RowNumber"] = 1; dr["Column1"] = string.Empty; dr["Column2"] = string.Empty; dr["Column3"] = string.Empty; dt.Rows.Add(dr); return dt; }
private void SetInitialRow() { DataTable dt = new DataTable(); dt = InitializeDataTable(); //Store the DataTable in ViewState ViewState["CurrentTable"] = dt; Gridview1.DataSource = dt; Gridview1.DataBind(); }
protected void SUBMIT_Click(object sender, EventArgs e) { DataTable dt = ReadAllGridValues(); foreach (DataRow dr in dt.Rows) { } }
*Note :- Kindly please Comment back if it had resolved your problem
这篇关于C#从gridview读取用户输入的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!