Wajid Khaksar Ответов: 2

В представлении сетки значение текстового поля теряется после обратной записи


всем привет

у меня есть gridView и в заголовке GridView установлено текстовое поле для записи фильтра в gridview. Проблема в том, что когда я набираю текст (что-то) в текстовом поле для поиска, его поиск идет нормально, но текст теряется в текстовом поле при обратной публикации страницы.
я хочу, чтобы текст оставался в текстовом поле после почтового ящика. так что пользователь видит именно то, что он набрал для фильтрации..
плз научите меня с помощью кода как можно лучше
заранее спасибо

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

в cs попробуйте это
protected void txtcity_TextChanged(object sender, EventArgs e)
       {
           try
           {

               string practice_code = Dd_TimeFrame.SelectedItem.ToString();
               TextBox txt_NewValue = ((TextBox)GridView1.HeaderRow.FindControl("txtcity"));
               string search_data = txt_NewValue.Text;
               string module_text = dd_Criteria.SelectedItem.ToString();
               con = new SqlConnection(@"Data Source=DEV-TEST\KILIMANJARO;Initial Catalog=MTBC-SYNCH;User ID=it_mis;Password=itmis");
               string getquery = "Select table_name,connection_string,Check_COLUMN_NAME From Connection_DB Where ISNULL(Table_Name,'')<>'' AND ISNULL(connection_string,'')<>'' AND ISNULL(Check_COLUMN_NAME,'')<>'' AND interface_name='" + module_text + "'";
               SqlCommand comm = new SqlCommand(getquery, con);
               SqlDataAdapter daa = new SqlDataAdapter(comm);
               DataTable dtt = new DataTable();
               daa.Fill(dtt);
               con.Close();
               if (module_text.Contains("-"))
                   module_text = module_text.Substring(0, module_text.IndexOf("-"));
               if (dtt.Rows.Count > 0)
               {
                   string conn_path = dtt.Rows[0]["connection_string"].ToString();
                   string table_name = dtt.Rows[0]["table_name"].ToString();
                   string CheckCOlumnName = dtt.Rows[0]["Check_COLUMN_NAME"].ToString();
                   con = new SqlConnection(conn_path);
                   //new connection
                   string interface_name = dd_Criteria.SelectedItem.ToString();
                   if (interface_name.Contains("-"))
                       interface_name = interface_name.Substring(0, interface_name.IndexOf("-"));

                   string search_query = "SELECT Module,Ins_name,Ins_Address,Ins_code,INS_ADDRESS1,INS_ADDRESS2,CITY,PRACTICE_CODE,STATE,PostalCode FROM " + table_name + " Where City Like '%" + search_data + "%' and practice_code='" + practice_code + "' and isnull(ins_code,0)=0 ";
                   comm = new SqlCommand(search_query, con);
                   SqlDataAdapter dat = new SqlDataAdapter(comm);
                   // DataTable dt = new DataTable();

                   DataSet dst = new DataSet();
                   dat.Fill(dst);
                   con.Close();
                   if (dst.Tables[0].Rows.Count > 0)
                   {

                       GridView1.DataSource = dst.Tables[0];
                       GridView1.DataBind();

                       lbl_msg.Text = "";
                       lbl_total_recored.Text = "Total No of Records= " + dst.Tables[0].Rows.Count;
                       Total_page.Text = GridView1.PageCount.ToString();
                       pager.Visible = true;
                       GridView1.Visible = true;
                       GridView2.Visible = false;
                       btnclear.Visible = true;
                       Button1.Visible = true;
                       Response.Write(txt_NewValue.Text);

                   }

                   else
                   {
                       txt_NewValue.Text = "Not Found!";
                       for (int i = 0; GridView1.Rows.Count > i; i++)
                       {
                           GridView1.Rows[i].Visible = false;
                       }

                       btnclear.Visible = false;
                       Button1.Visible = false;
                   }
                   //if(txt_NewValue.Text=="")
                   //{
                   //    BindData();

                   //}

                   // }
               }
           }
           catch(Exception ex)
           {
               lbl_msg.Text = "Record Could not be loaded because" + ex.Message;
           }
       }

и в aspx


&ЛТ;в ASP:GridView в AutoGenerateColumns="false" - в элемент ID="gridview1, на" AllowSorting="true" в атрибут runat="сервер" AllowPaging="истинный" CssClass="GridView в"
OnPageIndexChanging=" GridView1_PageIndexChanging " OnRowCreated=" GridView1_RowCreated " OnRowDataBound="GridView1_RowDataBound" >

Karthik_Mahalingam

вы повторно связываете данные.

2 Ответов

Рейтинг:
2

Vincent Maverick Durano

Во-первых, не пишите свой код для запроса базы данных в событии TextChanged, потому что это событие всегда будет срабатывать, когда вы вводите/изменяете что-то из текстового поля. Это может быть очень дорого, чтобы всегда попадать в вашу базу данных, когда вы печатаете. Подумайте о производительности. В качестве альтернативы вы могли бы вместо этого написать код на кнопке Click событие.

Во-вторых, не используйте Dd_TimeFrame.SelectedItem.ToString() Вместо этого укажите свойство, к которому вы хотите получить доступ. Например:

//to get the Selected Text from DropDownList
string theText = Dd_TimeFrame.SelectedItem.Text;

//to get the Selected Value from DropDownList
string theValue = Dd_TimeFrame.SelectedItem.Value;
//or
string theValue = Dd_TimeFrame.SelectedValue;


В-третьих, не обращайтесь к дочерним элементам (HeaderRow, DataRow или FooterRow) непосредственно в GridView, так как вы можете получить ошибку исключения нулевой ссылки, когда GridView нет данных. Всегда проверяйте наличие GridView Подсчет строк перед доступом к ним.

В-четвертых,не нужно жестко кодировать строку подключения вашего кода за файлом. Вы должны поместить конфигурацию в свой файл web.config под элементом connectionString.

В-пятых, добавление значений из ваших входных данных к вашему SQL-оператору-это большое НЕТ-НЕТ, так как это может привести вас к атаке SQL-инъекции. Прочитай: Защитите свои данные: предотвратите SQL-инъекцию[^][^]

В-шестых, возьмите за привычку класть предметы, которые едят ресурсы, такие как SqlConnection, SqlCommand и SqlDataAdapter в using statement чтобы убедиться, что объекты будут правильно утилизированы и закрыты после их использования.

Наконец, не используйте DataSet когда вы имеете дело только с 1 результирующим набором. Вместо этого вы могли бы использовать DataTable Вот краткий пример для вашей справки:

protected void Button1_Click(object sender, EventArgs e) {  
            DataTable dt = new DataTable();
            using (SqlConnection sqlConn = new SqlConnection
            (ConfigurationManager.ConnectionStrings["YourDBConnectionString"].ConnectionString)){
                string sql = "SELECT Field1, Field2, Field3 FROM YourTable WHERE Field4 = @Param1";
                using(SqlCommand sqlCmd = new SqlCommand(sql,sqlConn)){
                    sqlCmd.Parameters.AddWithValue("@Param1", TextBox1.Text);
                    sqlConn.Open();
                    using(SqlDataAdapter sqlAdapter = new SqlDataAdapter(sqlCmd)){
                        sqlAdapter.Fill(dt);
                    }
                }
            }
 
            if(dt.Rows.Count > 0){
                //do something with the data here
            }
 }


Теперь перейдем к вашей проблеме - вашей TextBox ценность будет потеряна, так как вы повторно привязываете свой GridView с обновленным DataSource. Имейте в виду, что привязка GridView обновит ваш GridView и таким образом содержимое дочерних элементов управления в нем ~ включая ваш TextBox ценность. В качестве обходного пути вы можете сохранить значение вашего TextBox в ViewState таким образом, вы можете ссылаться на это значение в каждой обратной связи. Вот краткий пример:

Для хранения значения в ViewState:
ViewState["SeachKeyValue"] = TextBox1.Text;


Для получения значения из ViewState:
if(ViewState["SeachKeyValue"] != null){
     TextBox1.Text = ViewState["SeachKeyValue"].ToString();
} 


Возможно, вам придется реализовать приведенный выше код после вашего GridView ограничен данными. Кроме того, если вы заполняете / связываете свой GridView около Page_Load сначала событие, а затем убедитесь, что вы обернули код для привязки внутри Not IsPostback блок, чтобы избежать странного поведения:

if(!IsPostback){
   GridView1.DataSource = ???// set the datasource
   GridView1.DataBind();
}


Рейтинг:
2

manu_dhobale

Если вы привязываете gridview в событии page_load.
просто включите код привязки внутрь

Цитата:
! IsPostBack


Wajid Khaksar

я связываю свой girview в textboxchanged event sir