konto usunięte

Temat: Gridview i Dropdownlist

Witam z problemem borykam się juz od kilku ładnych godzin pewnie dla większości z was to drobnostka ok przejdę do konkretów
mam gridview a w nim dropdownlisty chciałbym aby po uruchomieniu akcji poszedł upddate do sql'a wstawiający wartości z dropdownlist.
Nieestety jakbym się do tego nie zabierał to updateowana jest albo jest pierwsza defaultowa wartość albo null.
Oto Kod

using System;
using System.Data;
using System.Collections;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Collections.Specialized;
using System.Text;
using System.Data.SqlClient;
using System.Data.Sql;
using System.Data.SqlTypes;
using System.Web.Mail;
using System.Net;
using System.IO;

public partial class wnios_view : System.Web.UI.Page
{

private SqlConnection mySQLconnection;
private SqlConnection conn;
private SqlConnection objInsert;
string kom;

protected void Page_Load(object sender, EventArgs e)
{




mySQLconnection = new SqlConnection();

mySQLconnection.ConnectionString = "Data Source=****;Initial Catalog=dbextest;Persist Security Info=True;User ID=****;Password=****";

// SQL Command object to pass the SQL query for retrieving the data from tbl_orders table.
SqlCommand mySqlCommand = new SqlCommand("select * from wnioski_prnv where idjednorg='test'", mySQLconnection);

SqlDataAdapter mySqlAdapter = new SqlDataAdapter(mySqlCommand);

DataSet myDataSet = new DataSet();

mySqlAdapter.Fill(myDataSet);

// GridView Data Control Bound to the DataSet filled with data retrieved from tbl_orders.
dg.DataSource = myDataSet;

dg.DataBind();

if (!Page.IsPostBack)
{
Populate1();
}

}
public void Populate1()
{

mySQLconnection = new SqlConnection();

mySQLconnection.ConnectionString = "Data Source=****;Initial Catalog=dbextest;Persist Security Info=True;User ID=admin;Password=****";
// Here new SQL query is pass to the SQL command object to get the data from tbl_order_status table.

SqlCommand mySqlCommand = new SqlCommand("select * from WNIOSKI_PRNV_STAT where id=1", mySQLconnection);

SqlDataAdapter mySqlAdapter = new SqlDataAdapter(mySqlCommand);

DataSet myDataSet = new DataSet();

mySqlAdapter.Fill(myDataSet);

// DropDownList Control Object Created to bind the data dynamically with each nested DropDownlist control placed inside the template column of the GridView Control.
DropDownList drdList;

// foreach loop is used to loop through each row of GridView Control.
foreach (GridViewRow grdRow in dg.Rows)
{
// Nested DropDownList Control reference is passed to the DrdList object. This will allow you access the properties of dropdownlist placed inside the GridView Template column.
drdList = (DropDownList)(dg.Rows[grdRow.RowIndex].Cells[5].FindControl("DropDownList1"));

// DataBinding of nested DropDownList Control for each row of GridView Control.
drdList.DataSource = myDataSet;
drdList.DataValueField = "status";
drdList.DataTextField = "status";
drdList.DataBind();
}

}
protected void aktual(object sender, EventArgs e)
{

// string variable to store the connection string
// defined in appsettings section of web.config file.
string connStr = ConfigurationManager.ConnectionStrings["dbextestConnectionString"].ConnectionString;

// object created for SqlConnection Class.
SqlConnection mySQLconnection = new SqlConnection(connStr);

// if condition that can be used to check the sql connection
// whether it is already open or not.
if (mySQLconnection.State == ConnectionState.Closed)
{
mySQLconnection.Open();
}

// Sql Command Object
SqlCommand mySqlCommand;

DropDownList drdList;

foreach (GridViewRow row in dg.Rows)
{
//Pętla po wszystkich rekordach Griudview

drdList = (DropDownList)(dg.Rows[row.RowIndex].Cells[5].FindControl("DropDownList1"));


mySqlCommand = new SqlCommand("update dbo.WNIOSKI_PRNV set data_akc= @data, akceptacja=@status, uwagi_odp='<p>' where ID_wniosku = @id", mySQLconnection);

mySqlCommand.Parameters.AddWithValue("@usrname", User.Identity.Name);



mySqlCommand.Parameters.AddWithValue("@data", DateTime.Now.ToString());

// SQL command input parameter to set the new value for order_status_id
mySqlCommand.Parameters.Add("@status", drdList.SelectedValue);

// SQL command input parameter as order_id whose corresponding value for order_status_id is to be set
mySqlCommand.Parameters.Add("@id", dg.DataKeys[row.RowIndex]["id_wniosku"]);

// Execute the SQL query to update the tbl_orders
mySqlCommand.ExecuteNonQuery();


}
// if condition that can be used to check the sql connection
// if it is open then close it.
if (mySQLconnection.State == ConnectionState.Open)
{
mySQLconnection.Close();
}

dg.DataBind();
}

//[System.Web.Services.WebMethodAttribute(), System.Web.Script.Services.ScriptMethodAttribute()]
//public static string[] GetCompletionList(string prefixText, int count, string contextKey)
//{
// return default(string[]);
//}

//private string HttpContent(string url)
//{
// WebRequest objRequest = System.Net.HttpWebRequest.Create(url);
// StreamReader sr = new StreamReader(objRequest.GetResponse().GetResponseStream());
// string result = sr.ReadToEnd();
// sr.Close();
// return result;
//}

public void Signout_Click(Object sender, EventArgs e)
{
FormsAuthentication.SignOut();
Response.Redirect(@"~\wnios_view.aspx");
}

}Szymon Kmiecik edytował(a) ten post dnia 23.05.11 o godzinie 07:09
Zygmunt Rynduch

Zygmunt Rynduch .NET/Sharepoint
Developer, (nie
szukam pracy ale jak
się ...

Temat: Gridview i Dropdownlist

Cześć,

Możnaby mieć uwagi do twojego kodu odnośnie paru rzeczy, ale nie to jest sednem sprawy, więc pominę.

Przyczyną tego, że kod nie działa tak jak zakładasz jest to, że w metodzie

protected void Page_Load(object sender, EventArgs e)

ładujesz dane do GridView zawsze, tzn. poza klauzulą

if (!Page.IsPostBack)

Metoda Page_Load odpala się wczesniej niż
protected void aktual(object sender, EventArgs e)
, która zakładam, że jest podłączona do jakiegoś onClick'a.
W Page_Load tworzą sie całkiem nowe wiersze GridView z pustymi ddl'ami, których na dodatek nie wypełniasz danymi bo
!Page.IsPostBack = false
w tym czasie.

Zatem, za kazdym razem gdy chcesz zrobić upload do bazy na podstawie stanu ddl'ów, to one są nie dość, że nie ustawione, to na dodatek puste.

Dodatkowo ostatnia linijka metody aktual
dg.DataBind();
powinno spowodowac zbindowanie GridView dg do pustego DataSource, czyli wyczyszczenie dg, ale to już nie powinno mieć wpływu na to co poszło do bazy.

I jeszcze jedna uwaga odnosnie tego

foreach (GridViewRow grdRow in dg.Rows)
{
drdList = (DropDownList) (dg.Rows[grdRow.RowIndex].Cells[5].FindControl("DropDownList1"));

grdRow to jest już twój szukany wiersz, zatem możesz się do niego odwołać bezpośrednio:

drdList = (DropDownList)grdRow.Cells[5].FindControl("DropDownList1");


A tutaj mniej więcej jak powinno wyglądać Page_Load żeby zadziałać:


protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
...

dg.DataSource = myDataSet;

dg.DataBind();

Populate1();
}
}


ps. zakładam, że GridView dg i ddl'ki na nim mają włączone EnableViewState (albo raczej NIE wyłączone).Zygmunt Rynduch edytował(a) ten post dnia 21.05.11 o godzinie 22:15

konto usunięte

Temat: Gridview i Dropdownlist

Cześć

Bardzo dziękuję za tak wnikliwą analizę kodu. Widzę że jeszcze sporo nauki przede mną.
Zygmunt Rynduch

Zygmunt Rynduch .NET/Sharepoint
Developer, (nie
szukam pracy ale jak
się ...

Temat: Gridview i Dropdownlist

Aż tak wnikliwa nie była. Musze sam siebie trochę poprawić.

To co pisałem o bindowaniu GridView dg w ostatniej linijce metody aktual, to zachowanie po mojej poprawce, bo w twoim przypadku DataSource jest ustawiane w Page_Load i przez to dg ma się do czego zbindować i coś wyświetli, ale będzie to dokładnie to samo co wcześniej (mogłoby tej linijki w ogóle nie być).

Ale rozumiem, że znalazła się ona tam bo chciałeś odzwierciedlić na dg zmiany dokonane update'm do bazy. Jeśli tak, to musisz powtórzyć na końcu metody aktual to co robisz w Page_Load, czyli:


DataSet myDataSet = ...

dg.DataSource = myDataSet;

dg.DataBind();

Populate1();


A w samym Populate1() przydałoby się jeszcze ustawiać ddl'e na wartości jakie masz w bazie (wnioski_prnv.akceptacja).

A może w ogóle pomyśl o użyciu innych zdarzeń. Tutaj pomocne zestawienie cyklu życia strony: ASP.NET Page Events Lifecycle. Przyjrzeć się zdarzeniom samego GridView też nie zawadzi.

Pomyśl też nad wyrzuceniem zapytań do innej warstwy, żeby to wyglądało np. tak:


DataAccessLayer myDAL = new DataAccessLayer(); //twoja klasa

DataSet myDataSet = myDAL.GetWnioskiPrnv();

myDAL.UpdateWnioskiPrnv(DateTime data_akc, string akceptacja, string ID_wniosku); //nie wiem po co masz w update parameter @username?

konto usunięte

Temat: Gridview i Dropdownlist

Co do odzwierciedlania danych na dg, to nie ma takiej potrzeby, ponieważ po wykonaniu akcji od razu przerzucam usera do innej strony. Zostaje mi jeszcze ubrać to wszystko w jakieś info co się w danym momencie dzieje. Myślałem o modal boxach jquery
Masz rację co do username'a zaplątał mi się tam podczas budowania query wcześniej używałem innego które potrzebowało tej zmiennej.
Co do wrzucania zapytań do DataAccessLayer to, jak będę miał więcej czasu na pewno się temu przyjrzę.
Jeszcze raz wielkie dzięki.

Następna dyskusja:

TabContainer + DropDownList...




Wyślij zaproszenie do