DevExpress GridView in LookUpEdit - devexpress

I can add columns like this in GridView, but I don't know how to add RepositoryLookUpEdit. Would you help me with this topic? (I'm sorry for my bad English.)
DataTable DT = new DataTable();
private void Form1_Load(object sender, EventArgs e)
{
DT.Columns.Add("IP", Type.GetType("System.String"));
DT.Columns.Add("Port", Type.GetType("System.String"));
DT.Columns.Add("Username", Type.GetType("System.String"));
DT.Columns.Add("Password", Type.GetType("System.String"));
DT.Columns.Add("Working?", Type.GetType("System.Boolean"));
}
private void btn_ekle_Click(object sender, EventArgs e)
{
DataRow dr = DT.NewRow();
dr[0] = "Test";
dr[1] = "Test";
dr[2] = "Test";
dr[3] = "Test";
dr[4] = true;
DT.Rows.Add(dr);
dtg_goster.DataSource = DT;
gridView1.PopulateColumns();

You can modify the RepositoryItemLookUpEdit's Columns property to add/remove columns. This can be done at runtime:
lookUpEdit1.Properties.Columns.Add(new LookUpColumnInfo("FieldName", "Caption", 100)); //100 is width in pixels
Similar to what you are doing with the GridControl, you can also use the LookUpEdit's PopulateColumns method to create a column for each field in the data source. Note that you may need to also invoke the LookUpEdit's ForceInitialize method before you invoke the PopulateColumns method to ensure that the control is fully initialized.

Related

Button in GridView asp.net

Here is my code:
protected void Page_Load(object sender, EventArgs e)
{
DataTable dt = new DataTable();
dt=PrepareFirstGridViewRow(); //function below
DataRow dr = dt.NewRow();
dr["Index"] = index;
index++;
dr["Telephone"] = Telephone;
dr["Amount"] = Amount;
dr["Comment"] = Comment;
Button BTN = new Button();
BTN.Click += GridButton_Click;
BTN.OnClientClick = "GridButton_Click";
BTN.Text = "Sell";
BTN.Attributes.Add("CId", j.ToString());
BTN.Style.Value = "display:inline-block;";
BTNF.ButtonType = ButtonType.Button;
dr["Sell"] = BTN;
dt.Rows.Add(dr);
ContractsGrid.DataSource = dt;
ContractsGrid.DataBind();
ContractsGrid.Columns.Add(new DataControlField);
connection.Close();
}
And the function Prepare:
private DataTable PrepareFirstGridViewRow()
{
DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn("Index", typeof(string)));
dt.Columns.Add(new DataColumn("Telephone", typeof(string)));
dt.Columns.Add(new DataColumn("Amount", typeof(string)));
dt.Columns.Add(new DataColumn("Comment", typeof(string)));
dt.Columns.Add(new DataColumn("Sell", typeof(Button)));
return dt;
}
Everything works fine, except insertion of Buttons in last column, which do not appear at all (neither the header nor the button). When I replace ("Sell", typeof(Button)) with ("Sell", typeof(string)) and dr["Sell"] = "something"; the grid is created properly.
Question is simple: Why?
I tried the following solution:
protected void Page_Load(object sender, EventArgs e)
{
try
{
Button btn = new Button();
btn.Text = "Click";
btn.ID = "btn_click";
btn.Click += new EventHandler(btnevent_Click);
btn.OnClientClick = "Hello('" + "a" + "')";
form1.Controls.Add(btn);
}
catch (Exception)
{ }
}
And the above code produces buttons on the page event though it is in page_load event. So the problem must be not about the event, but the grid view.
Code below also works perfectly fine, but the button is added to whole grid (I am conscious about that). So it is not about the event but insertion of button into grid.
Button BTNo = new Button();
BTNo.Click += GridButton_Click;
BTNo.OnClientClick = "GridButton_Click";
BTNo.Text = "Sell";
BTNo.Attributes.Add("CId", "1");
BTNo.Style.Value = "display:block;";
ContractsGrid.DataSource = dt;
ContractsGrid.DataBind();
ContractsGrid.Controls.Add(BTNo);
connection.Close();
This is because of the asp.net page lifecycle. Controls are created before the"page_load" event. Try creating the button in an earlier event such as "page_init".
Solution is not to use datatable, gridview is also a bad idea, and my efforts to find the correct combination of lines of code were insufficient so i found a semi-solution: You can replace gridview with simple asp.net table component where you can put simply anthing. It does not resolve the problem the way I would like to, but it works and is clearer than datatables and binding it to gridviews.
Here is the working code:
TableRow tRow = new TableRow()
Tab.Rows.Add(tRow);
Tab.Rows.Add(tRow);
// Create a new cell and add it to the row.
TableCell tCell = new TableCell();
tCell.Text = "Row ";
Button bt = new Button();
bt.Text = "Click Me";
bt.OnClientClick = "TabButton_Click";
tCell.Controls.Add(bt);
tRow.Cells.Add(tCell);

Using DropDown_SelectedIndexChanged to bind gridview, but paging is not working

I have a DropDownList which is having few list items. Every time I select any item, based on it I am binding a gridview, hence resulting gridview depends on my selection. Some results are exceeding the pagesize hence I need to navigate on 2nd page in GridView, however the GridView is disappeating when I am selecting 2nd page.
protected void DDL_SelectedIndexChanged(object sender, EventArgs e)
{
string constr = ConfigurationSettings.AppSettings["ConnectionInfo"];
SqlConnection con = new SqlConnection(constr);
con.Open();
string str = string.Empty;
str = "SELECT * FROM Table1";
SqlDataAdapter adp = new SqlDataAdapter(str, con);
DataSet ds = new DataSet();
adp.Fill(ds, "myds");
BusinessKPIGrid.DataSource = ds;
BusinessKPIGrid.DataBind();
}
protected void OnGridViewPaging(object sender, GridViewPageEventArgs e)
{
//I know I need to bind the gridview here, but how ?
BusinessKPIGrid.PageIndex = e.NewPageIndex;
BusinessKPIGrid.DataBind();
}
I don't know how to bind the gridview in paging event, since I do not have any separate binding function.
there is a separate function for page event for grid view..create separate method for binding grid & call that method on pageindexchange event..
protected void BusinessKPIGrid_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
BusinessKPIGrid.PageIndex = e.NewPageIndex;
bindyourgrid();
}
try this
protected void DDL_SelectedIndexChanged(object sender, EventArgs e)
{
string constr = ConfigurationSettings.AppSettings["ConnectionInfo"];
SqlConnection con = new SqlConnection(constr);
con.Open();
string str = string.Empty;
str = "SELECT * FROM Table1";
SqlDataAdapter adp = new SqlDataAdapter(str, con);
DataSet ds = new DataSet();
adp.Fill(ds, "myds");
ViewState["ds"]=ds;
BusinessKPIGrid.DataSource = ds;
BusinessKPIGrid.DataBind();
}
protected void OnGridViewPaging(object sender, GridViewPageEventArgs e)
{
//I know I need to bind the gridview here, but how ?
BusinessKPIGrid.PageIndex = e.NewPageIndex;
BusinessKPIGrid.DataSource = (DataSet)ViewState["ds"];
BusinessKPIGrid.DataBind();
}
From DDL_SelectedIndexChanged if you are searching some thing then use 'PageIndexChanging' and set the page size for it
protected void gvworker_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
gvworker.PageIndex = e.NewPageIndex;
//result got from ddl list i.e bind your data set
}

Capture DropDownList Index Change event inside of grid View

I am trying to capture the SelectedIndexChanged event for a drop down list I have put inside of a gridview control. It posts back fine, but does not go into my SelectedIndexChanged event handler. Here is my code
DropDownList myddl;
protected void Page_Load(object sender, EventArgs e)
{
this.myGridview.RowDataBound += new GridViewRowEventHandler(myGridview_RowDataBound);
myddl = new DropDownList();
myddl.SelectedIndexChanged += new EventHandler(myddl_SelectedIndexChanged);
if (!Page.IsPostBack)
{
List<Team> teams = giveMeTeams();
this.myGridview.DataSource = teams;
this.myGridview.AutoGenerateColumns = false;
BoundField col1 = new BoundField();
col1.DataField = "Name";
this.myGridview.Columns.Add(col1);
BoundField col2 = new BoundField();
col2.DataField = "Sport";
this.myGridview.Columns.Add(col2);
BoundField col3 = new BoundField();
col3.DataField = "Status";
this.myGridview.Columns.Add(col3);
this.myGridview.DataBind();
}
}
void myGridview_RowDataBound(object sender, GridViewRowEventArgs e)
{
myddl = new DropDownList();
myddl.SelectedIndexChanged += new EventHandler(myddl_SelectedIndexChanged);
List<string> items = new List<string>();
items.Add("good");
items.Add("bad");
myddl.DataSource = items;
myddl.AutoPostBack = true;
myddl.DataBind();
e.Row.Cells[2].Controls.Add(myddl);
}
void myddl_SelectedIndexChanged(object sender, EventArgs e)
{
string temp = "In Here"; //neve hits this code
}
private List<Team> giveMeTeams()
{
Teams teams = new Teams();
teams.Add(new Team("RedWings", "Hockey", "good"));
teams.Add(new Team("Lions", "Football", "bad"));
teams.Add(new Team("Packers", "Football", "good"));
return teams;
}
Any help is greatly appreciated.
Thanks,
Edited based on Comments
I have tried as you suggested...and am still not capturing the post back. here is my new code
void myGridview_RowCreated(object sender, GridViewRowEventArgs e)
{
DropDownList myddl = new DropDownList();
myddl = new DropDownList();
myddl.SelectedIndexChanged += new EventHandler(myddl_SelectedIndexChanged);
myddl.ID = "MyID" + e.Row.RowIndex.ToString();
e.Row.Cells[2].Controls.Add(myddl);
}
void myGridview_RowDataBound(object sender, GridViewRowEventArgs e)
{
DropDownList myddl = e.Row.FindControl("MyID" + e.Row.RowIndex.ToString()) as DropDownList;
//myddl.SelectedIndexChanged += new EventHandler(myddl_SelectedIndexChanged);
List<string> items = new List<string>();
items.Add("good");
items.Add("bad");
myddl.DataSource = items;
myddl.DataMember = "Status";
myddl.AutoPostBack = true;
myddl.DataBind();
e.Row.Cells[2].Controls.Add(myddl);
}
it is still not going into my myddl_SelectedIndexChanged() eventhandler.
Create that Dropdownlist in RowCreated of the Grid and assign an ID to it. Get the refrence to these Dropdowns in RowDataBound via e.Row.FindControl("MyDropdownlistID") and bound them to the Datasource. Create distinct Dropdownlist instances instead of referencing always the same

Grid view Updatearguments does Not contain New Values

public partial class Gridvw_expt2 : System.Web.UI.Page
{
SqlCommand com;
SqlDataAdapter da;
DataSet ds;
SqlConnection con=new SqlConnection(ConfigurationManager.ConnectionStrings["gj"].ConnectionString);
protected void Page_Load(object sender, EventArgs e)
{
com = new SqlCommand("Select * from tblExpt",con);
da = new SqlDataAdapter(com);
ds = new DataSet();
da.Fill(ds);
if (ds.Tables[0].Rows[0] != null)
{
GridView1.AutoGenerateEditButton = true;
GridView1.DataSource = ds;
GridView1.DataBind();
GridView1.RowUpdating += new GridViewUpdateEventHandler(GridView1_RowUpdating);
GridView1.DataKeyNames = new string[] { "id" };
GridView1.RowEditing += new GridViewEditEventHandler(GridView1_RowEditing);
}
else
Response.Write("fkj");
}
protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
GridViewRow row = GridView1.Rows[e.RowIndex];
int id = Convert.ToInt32(GridView1.DataKeys[e.RowIndex].Value);
string cls = ((TextBox)(row.Cells[2].Controls[0])).Text;
string nam = ((TextBox)(row.Cells[3].Controls[0])).Text;
foreach (DictionaryEntry entry in e.NewValues)
{
e.NewValues[entry.Key] = Server.HtmlEncode(entry.Value.ToString());
}
com = new SqlCommand("Update tblExpt set name='" + nam + "',class='" + cls + "' where id='" + id + "'", con);
da = new SqlDataAdapter(com);
GridView1.EditIndex = -1;
GridView1.DataSource = ds;
GridView1.DataBind();
}
protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e)
{
GridView1.EditIndex = e.NewEditIndex;
GridView1.DataSource = ds;
GridView1.DataBind();
}
}
In the above code when i try to access e.new values index out of range exception is thrown.
The table being accessed contains 3 fields id, class, name
Please help to solve the problem.
Read this blog post I wrote on extracting data from gridview (and other data controls). Also, in .net 4.0 if you use 2 way binding (<# Bind("") #>) e.NewValues will be populated.
More info here: http://weblogs.asp.net/davidfowler/archive/2008/12/12/getting-your-data-out-of-the-data-controls.aspx
The exception you get is because row.Cells[0].Controls[0] is a DataControlLinkButton and not a TextBox. Since I donĀ“t know the control layout of your grid you could search for your textbox instead.
Instead of:
int id = int.Parse(((TextBox)(row.Cells[0].Controls[0])).Text);
do something like the code below if there is only one TextBox per row:
TextBox box = (TextBox)row.Cells[0].Controls.OfType<TextBox>().First();
int id = int.Parse( box.Text );
If you have nested html and hierarchies check out this SO question for nested searching of controls

Dropdownlist on gridview updating only first value to the database ASP.Net

I am looking for the solution to this problem from many days, please help.
I have a grid view and have five dropdownlist on it. I have edit update and cancel edit buttons on each row.
Drop down list is updating the database, but only first value in the dropdownlist even when user select second, third or any other value from the dropdownlist.
What could possible be the reason for this. Here is my row Edit/ CancelEdit and Updating Events.
protected void gvCustomers_RowEditing(object sender, GridViewEditEventArgs e)
{
gvCustomers.EditIndex = e.NewEditIndex;
BindData();
}
protected void gvCustomers_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
{
gvCustomers.EditIndex = -1;
BindData();
}
protected void gvCustomers_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
Label lblCustId = (Label)gvCustomers.Rows[e.RowIndex].FindControl("cust_id");
DropDownList ddlCsm = (DropDownList)gvCustomers.Rows[e.RowIndex].FindControl("CSM");
DropDownList ddlSrCsm = (DropDownList)gvCustomers.Rows[e.RowIndex].FindControl("SrCSM");
DropDownList ddlDE = (DropDownList)gvCustomers.Rows[e.RowIndex].FindControl("DE");
DropDownList ddlAE = (DropDownList)gvCustomers.Rows[e.RowIndex].FindControl("AE");
DropDownList ddlTE = (DropDownList)gvCustomers.Rows[e.RowIndex].FindControl("TE");
using (SqlConnection conn = new SqlConnection(connectionString))
{
try
{
conn.Open();
string sql = "Update SOME_TABLE SET CSM= #CSM, SrCSM= #SrCSM ,DE=#DE,AE=#AE,TE=#TE where cust_id=#cust_id";
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
cmd.Parameters.Add("#CSM", SqlDbType.VarChar).Value = ddlCsm.SelectedItem.Value;
cmd.Parameters.Add("#SrCSM", SqlDbType.VarChar).Value = ddlSrCsm.SelectedItem.Value;
cmd.Parameters.Add("#AE", SqlDbType.VarChar).Value = ddlAE.SelectedItem.Value;
cmd.Parameters.Add("#DE", SqlDbType.VarChar).Value = ddlDE.SelectedItem.Value;
cmd.Parameters.Add("#TE", SqlDbType.VarChar).Value = ddlTE.SelectedItem.Value;
cmd.ExecuteNonQuery();
}
}
catch
{ }
gvCustomers.EditIndex = -1;
BindData();
}
}
Any help would be greatly appeciated.
Thanks
just fill the dropdowns on the click of edit button and then use on rowupdating event and use ddl.SelectedValue instead of ddl.SelectedItem.Value. You will find the selected values.
Your Drop Downs are probably getting re-set in your Page_Load event. If they are, load them when the page is not in postback, like so:
if(!Page.IsPostBack) {
//set drop downs
}

Resources