KyLim0211 Ответов: 2

В C# прочитать данные, вводимые пользователем с GridView в


У меня есть gridview, который будет генерировать новую строку, когда пользователь нажмет на нее добавить новую строку.
Но у меня возникла проблема при чтении пользовательского ввода из c#, мне нужно вставить весь пользовательский ввод по строке в мою базу данных.

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)
{

}


мой 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" />


Что я уже пробовал:

я пытался читать пользовательский ввод с помощью c#, но держать его держать не могу, не получится цикл, удается читать только строку 1,пожалуйста, направьте меня на это

Arasappan

Is Row генерируется успешно, братан..

2 Ответов

Рейтинг:
1

Member 12586674

Из того, что я понял, вы хотите вставить все строки gridview в таблицу базы данных.
Одна вещь, которую вы можете сделать, это выполнить итерацию в gridview с помощью цикла for/foreach и сохранить данные в datatable, а затем использовать SqlBulkCopy чтобы сразу вставить данные в базу данных.
Другой способ - использовать цикл и вставлять каждую строку одну за другой в базу данных.


Рейтинг:
1

vijeshkumarvijayan

Хай
я не совсем уверен, что это то,что вам нужно в качестве решения, вот мое то, что я нашел в вашем методе
Решение 1-измените свой код, как показано ниже

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++;
                    }
                }
            }
        }



Решение 2: Создайте такой метод и вызовите свой метод
SUBMIT_Click


Преимущества: - в то время как Вы читаете снизу строки кода : - если состояние просмотра истекло, то также вы можете прочитать все данные непосредственно из вашей datagrid
2: - после добавления второй строки в вашу сетку, если вы меняете данные в своей первой строке, то описанный выше метод даст вам головную боль от не обновленных данных в вашем состоянии просмотра

если U R с помощью метода ниже все обновленные данные будут

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)
            {
 
            }
        }


* Примечание : - пожалуйста, прокомментируйте, если это решило вашу проблему