C#从gridview读取用户输入 [英] C# read user input from gridview

查看:88
本文介绍了C#从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 Horizo​​ntalAlign = / >
< 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 method

SUBMIT_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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆