#c# #asp.net #gridview #sql-update #sqldatasource
#c# #asp.net #gridview #sql-обновление #sqldatasource
Вопрос:
Я использую asp.net 4.0 C # и Sql server 2008r2.
Я нашел и использую код из здесь для создания моего gridview с текстовыми полями и из здесь для сохранения в моей базе данных с небольшими изменениями, как показано ниже.
Мне нужно отозвать эти данные из базы данных и заполнить динамически созданные текстовые поля в gridview.
Я получаю сообщение об ошибке «Поле или свойство с именем ‘RowNumber’ не найдено в выбранном источнике данных». Ошибка находится в строке Gridview.DataBind(); в методе Fillmygrid.
Как мне увеличить строку для каждой возвращаемой строки. Этого столбца нет в базе данных.
Мой текущий код:
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
SetInitialRow();
querytable();
}
}
protected void querytable()
{
string id = Session["ID"] as string;
using (SqlConnection con = new SqlConnection(connection string))
{
using (SqlCommand cmd = new SqlCommand("SELECT * FROM table WHERE column1 = @c1 AND column3 = 'A'", con))
cmd.Parameters.AddWithValue("@c1", id);
con.Open();
SqlDataReader reader = cmd.ExecuteReader();
if (reader.hasRows)
{
FillGrid();
}
}
}
}
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 )
{
TextBox box1 = (TextBox)Gridview1.Rows[rowIndex].Cells[1].FindControl("TextBox1");
drCurrentRow = dtCurrentTable.NewRow();
drCurrentRow["RowNumber"] = i 1;
dtCurrentTable.Rows[i - 1]["Column1"] = box1.Text;
rowIndex ;
}
dtCurrentTable.Rows.Add(drCurrentRow);
ViewState["CurrentTable"] = dtCurrentTable;
Gridview1.DataSource = dtCurrentTable;
Gridview1.DataBind();
}
}
else
{
Response.Write("ViewState is null");
}
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("TextBox1");
box1.Text = dt.Rows[i]["Column1"].ToString();
rowIndex ;
}
}
}
}
protected void ButtonAdd_Click(object sender, EventArgs e)
{
AddNewRowToGrid();
}
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)));
dr = dt.NewRow();
dr["RowNumber"] = 1;
dr["Column1"] = string.Empty;
dt.Rows.Add(dr);
dr = dt.NewRow();
ViewState["CurrentTable"] = dt;
Gridview1.DataSource = dt;
Gridview1.DataBind();
}
private void InsertRecords(StringCollection sc)
{
SqlConnection conn = new SqlConnection(GetConnectionString());
StringBuilder sb = new StringBuilder(string.Empty);
string[] splitItems = null;
foreach (string item in sc)
{
const string sqlStatement = "INSERT INTO SampleTable (Column1,Column2,Column3) VALUES";
if (item.Contains(","))
{
splitItems = item.Split(",".ToCharArray());
sb.AppendFormat("{0}('{1}','{2}','{3}'); ", sqlStatement, splitItems[0], splitItems[1], splitItems[2]);
}
}
try
{
conn.Open();
SqlCommand cmd = new SqlCommand(sb.ToString(), conn);
cmd.CommandType = CommandType.Text;
cmd.ExecuteNonQuery();
Page.ClientScript.RegisterClientScriptBlock(typeof(Page), "Script", "alert('Records Successfuly Saved!');", true);
}
catch (System.Data.SqlClient.SqlException ex)
{
string msg = "Insert Error:";
msg = ex.Message;
throw new Exception(msg);
}
finally
{
conn.Close();
}
}
protected void Button1_Click(object sender, EventArgs e)
{
string id = Session["ID"] as string;
int rowIndex = 0;
StringCollection sc = new StringCollection();
if (ViewState["CurrentTable"] != null)
{
DataTable dtCurrentTable = (DataTable)ViewState["CurrentTable"];
if (dtCurrentTable.Rows.Count > 0)
{
for (int i = 1; i <= dtCurrentTable.Rows.Count; i )
{
TextBox box1 = (TextBox)Gridview1.Rows[rowIndex].Cells[1].FindControl("TextBox1");
string a = "A"
sc.Add(id "," box1.Text "," a);
rowIndex ;
}
InsertRecords(sc);
}
}
}
Вот код проблемы:
Измените 2 в этом коде:
private void fillmygrid()
{
string id = Session["ID"] as string;
//DataTable dt = new DataTable();
SqlConnection con = new SqlConnection(connection string)
try
{
string cmd "Select column2 From table where column1 = '@c1' And column3 = 'A'";
con.Open();
SqlDataAdapter da = new SqlDataAdapter(cmd, con);
da.SelectCommand.Parameters.AddWithValue("@c1", id);
DataSet ds = new DataSet();
da.Fill(ds);
if (dt.Rows.Count > 0)
{
Gridview1.DataSource = dt;
Gridview1.DataBind();
}
}
catch (SqlException ex)
{
string msg = "Fetch Error:";
msg = ex.Message;
Response.Write(msg);
}
finally
{
con.Close();
}
}
Мой оператор insert работает, и я ссылаюсь на ту же строку подключения.
Спасибо за вашу помощь.
Ответ №1:
Используйте стандартизированный подход, а именно SqlDataSource
привязку к GridView
элементу управления (ASP.NET ). В Интернете есть множество примеров, напримерhttp://asp-net-example.blogspot.com/2008/12/aspnet-gridview-and-sqldatasource.html Это решение позволит вам ВЫБИРАТЬ, УДАЛЯТЬ или ОБНОВЛЯТЬ таблицу данных в вашей базе данных SQL.
Для ДОБАВЛЕНИЯ (т. е. вставки) новой записи используйте FormView
(при необходимости). С уважением,
Комментарии:
1. Добро пожаловать. Это должно стать хорошей отправной точкой для вашего проекта: вы можете добавить больше функциональности после того, как у вас будут хорошо работать основные элементы управления с поддержкой данных и функции БД (CRUD). Rgds,