How to change the GridView page Index - asp.net

How to change Gridview pages based on the dropdown list selected index? the dropdown list is not inside the gridview, any help would be appreciated.

<asp:DropDownList ID="DropDownList1" runat="server" AutoPostBack="True"
onselectedindexchanged="DropDownList1_SelectedIndexChanged">
</asp:DropDownList>
protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
{
GridView1.PageIndex = DropDownList1.SelectedItem.Value;
GridView1.DataSource = datatable;
GridView1.DataBind();
}

What you need to do is set the GridView's PageSize property to the value of your DropDownList's selected item value:
private void DropDownListPageSize_SelectedIndexChanged(object sender, EventArgs e)
{
gridview.PageSize = DropDownListPageSize.SelectedValue;
}

Related

View state on dropdown control

<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:Button ID="Button1" runat="server" UseSubmitBehavior="false"
OnClick="Button1_Click" OnClientClick="this.disabled = true; this.value = 'Submitting...'; "
Text="Click Me…" /></div>
<asp:DropDownList ID = "dListFruits" runat ="server" EnableViewState ="true"></asp:DropDownList>
protected void Page_Load(object sender, EventArgs e)
{
ArrayList aList = new ArrayList();
aList.Add("Apples");
aList.Add("Oranges");
if (!Page.IsPostBack)
{
dListFruits.DataSource = aList;
dListFruits.DataBind();
TextBox1.Text = "Hi";
}
}
protected void Button1_Click(object sender, EventArgs e)
{
}
When i had a break point in a button click event , this peice of statement "dListFruits.DataSource" shows null while debugging. I thought view state will be applied before load event triggered. But when i see the page items are appended into the dropdown list. So view state will be applied just before render?
Just check out the Items collection of the dropdownlist. Viewstate stores the items collection of dropdownlist control.

Populate different gridview by clicking different button

In my web page header, there are several buttons. What I want is to click each button to display a desired table in a gridview.
click button1
Display table in gridview 1.
click button2 Display table in gridview 2, Gridview 1 disappeared.
The header and buttons are persisting in the page. I don't want to redirect the current page to different pages. I only want to implement the function in one web page.
ASPX
<div>
<asp:GridView ID="GridView1" runat="server">
</asp:GridView>
<asp:GridView ID="GridView2" runat="server">
</asp:GridView>
<asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" />
<asp:Button ID="Button2" runat="server" Text="Button" onclick="Button2_Click" />
</div>
C#
protected void Button1_Click(object sender, EventArgs e)
{
GridView1.Visible = true;
GridView2.Visible = !GridView1.Visible;
GridView1.DataBind();
}
protected void Button2_Click(object sender, EventArgs e)
{
GridView1.Visible = false;
GridView2.Visible = !GridView1.Visible;
GridView2.DataBind();
}
You may need to pass in the .DataBind() call depending on how you are binding your data to the gridviews.
On each button click just bind your GridView as needed. For example:
Button1 clicked do:
protected void Button1_OnClick(object sender, EventArgs e)
{
grdYourGrid1.DataSource = yourDataSource;
grdYourGrid1.DataBind();
grdYourGrid1.Visible = true;
grdYourGrid2.DataSource = null;
grdYourGrid2.DataBind();
grdYourGrid2.Visible = false;
}
Then do the opposite for Button2. I suggest rebinding and nulling the non visible grid so the ViewState doesn't get bloated when not required.
You can put this in the Page_Load
button1.Click+=(s,ev)=>
{
gridview1.visible = true;
gridview1.DataBind();
};
button2.Click+=(s,ev)=>
{
gridview2.DataBind();
gridview1.visible = false;
};
C#
buttin1_Onclick(object sender, EventArgs e)
{ gridview1.visible = true; gridview1.DataBind(); gridview2.visible = false;}
buttin2_Onclick(object sender, EventArgs e)
{ gridview2.visible = true; gridview2.DataBind(); gridview1.visible = false;}
or
buttin1_Onclick(object sender, EventArgs e)
{ gridview1.DataBind(); gridview2.Rows.Clear();}
buttin2_Onclick(object sender, EventArgs e)
{ gridview2.DataBind(); gridview1.Rows.Clear();}

Acessing Dropdownlist(selected value) in gridview

I have a bit of trouble with getting dropdownlist selected value we have in aspx a Gridview and in it dropdownlist:
<asp:GridView ID="grid1" runat="server" autogeneratecolumns="true" >
<Columns>
<asp:BoundField HeaderText="something" />
<asp:TemplateField HeaderText="filtras">
<HeaderTemplate>
<asp:DropDownList ID="dropdown1" runat="server"
OnLoad="dropdownLoad"
OnSelectedIndexChanged="updatetable" />
</HeaderTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
We fill the DropDownList with values using OnLoad event, and then when we select something from the DropDownList, the event OnSelectedIndexChange should allow us to take the selected value and to do what we want with it (filter the grid in this case), but OnSelectedIndexChange never gets executed.
protected void Page_Load(object sender, EventArgs e)
{
//Create Gridview + fill with values
if (IsPostBack)
{
return;
}
ArrayList mycountries = new ArrayList();
mycountries.Add("Norway");
mycountries.Add("Sweden");
mycountries.Add("France");
mycountries.Add("Italy");
mycountries.TrimToSize();
mycountries.Sort();
rb.DataSource = mycountries;
rb.DataBind();
grid1.DataSource = mycountries;
grid1.DataBind();
}
protected void dropdownLoad(object sender, EventArgs e)
{ // fill dropDownList in GridView with data
DropDownList dropdown = sender as DropDownList;
if (dropdown != null)
{
ArrayList mycountries = new ArrayList();
mycountries.Add("Norway");
mycountries.Add("Sweden");
mycountries.Add("France");
mycountries.Add("Italy");
mycountries.TrimToSize();
mycountries.Sort();
dropdown.DataSource = mycountries;
dropdown.DataBind();
TextBox1.Text = dropdown.SelectedIndex.ToString();
}
}
protected void updatetable(object sender, EventArgs e)
{// after dropDownList element was selected change dropdownlist values/or filter the table...
//this part is never executed ! Why?
DropDownList dropdown = sender as DropDownList;
if (dropdown != null)
{
ArrayList mycountries = new ArrayList();
mycountries.Add("UK");
mycountries.Add("USA");
mycountries.Add("Sweden");
mycountries.Add("Hungary");
mycountries.TrimToSize();
mycountries.Sort();
dropdown.DataSource = mycountries;
dropdown.DataBind();
}
}
How can I get the DropDownList's selected value? My debugger shows that OnSelectedIndexChange is never executed.
I tried following the suggestions in this question Setting selectedvalue for a dropdownlist in GridView, but that didn't work.
Have you tried setting AutoPostBack to true for your dropdown control so that it causes a postback?

How to make visible a column of gridview?

I am using Gridview.In this i have 2 columns i.e. department and emailID.In this gridview department is bind from database and showed in linkbutton in gridview.
I want to do that when i clicked on thst dept linkbutton it make visible the column emailID.
How can i do this?Plaese guide me..
Thanks in advance.
Here is My Grid:
<asp:TemplateField>
<ItemTemplate>
<asp:LinkButton ID="lnkbtnDept" runat="server" Text='<%#Bind("Department")%>' OnClick="lnkbtnTitle_Click" ></asp:LinkButton>
</ItemTemplate>
<ItemStyle HorizontalAlign="Left" Width="50%" />
</asp:TemplateField>
<asp:TemplateField>
<ItemTemplate>
<asp:Panel ID="pnlN24" runat="server" Visible="false">
<asp:Label ID="lblTotal" runat="server" Width="30" Text="abc"></asp:Label>
</asp:Panel>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
You have to handle the events of GridView control especially RowCommand.
public class Demo
{
public string Dept { get; set; }
public string Email { get; set; }
}
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
List<Demo> list = new List<Demo>()
{
new Demo() { Dept="A", Email="a#a.com" },
new Demo() { Dept="B", Email="b#b.com" },
};
GridView1.DataSource = list;
GridView1.DataBind();
}
}
protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
if (e.CommandName == "cmd")
{
GridViewRow row = (e.CommandSource as LinkButton).NamingContainer as GridViewRow;
Label email = row.Cells[1].FindControl("email") as Label;
email.Visible = true;
}
}
Understanding that you will make visible all the cells in the column for all the rows, you can handle the OnClick event of the dept button. For example.
<asp:LinkButton ID="lnkDept" OnClick="LinkButton_Click" runat="server" Text="Department" />
Code behind:
protected void LinkButton_Click(Object sender, EventArgs e)
{
gridView1.Columns[1].Visible=true;
}
Where gridView.Column[1] is your email column.
its not possible to make cell visible when column's visibility property set to false. so for showing only adjacent cell visible .
you can use the only one column of type template field and then make a table in that template field and set the td of email to visible false and on row command of grid as the previous answers making that lable visible you should make your td visible .
protected void lnkbtnTitle_Click(object sender, EventArgs e)
{
GridViewRow gvrow = ((LinkButton)sender).Parent.Parent as GridViewRow;
Panel pnlN24 = (Panel)gvrow.FindControl("pnlN24");
pnlN24.Visible = true;
}
It is very simple , the above code will work.
We have to find in which row the LinkButton is Clicked , which we can get from the
the following code. Once you get the GridViewRow then find the control in that row and make it Visible
GridViewRow gvrow = ((LinkButton)sender).Parent.Parent as GridViewRow;
As we know that
Control <--- Cell <-- GridViewRow <-- GridView
For Eg:
LinkButton <--- Cell <-- GridViewRow <-- GridView
GridViewRow is Parent to Cell and Cell is Parent to the Control inside the Cell (Panel)
function validateColors(id) {
var grid = document.getElementById("GridView1");
var label = grid.rows[id].cells[6].children[2];
grid.rows[id].cells[6].children[2].style.visibility = "visible";
grid.rows[id].cells[6].children[2].style.visibility = "hidden";
}

Why is the footer-item not included in Repeater.Items?

I need to get a value from a textbox inside a FooterTemplate in the OnClick event of a button. My first thought was to loop through the items-property on my repeater, but as you can see in this sample, it only includes the actual databound items, not the footer-item.
ASPX:
<asp:Repeater ID="Repeater1" runat="server">
<ItemTemplate>
Item<br />
</ItemTemplate>
<FooterTemplate>
Footer<br />
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
</FooterTemplate>
</asp:Repeater>
<asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" />
Code-behind.cs:
protected void Page_Load(object sender, EventArgs e)
{
ListItemCollection items = new ListItemCollection();
items.Add("value1");
items.Add("value2");
Repeater1.DataSource = items;
Repeater1.DataBind();
}
protected void Button1_Click(object sender, EventArgs e)
{
System.Diagnostics.Debug.WriteLine(Repeater1.Items.Count);
}
This code will only output "2" as the count, so how do I get to reference my textbox inside the footertemplate?
From the MSDN documentation, the Items is simply a set of RepeaterItems based off the DataSource that you are binding to and does not include items in the Header or FooterTemplates.
If you want to reference the textbox, you can get a reference on ItemDataBound event from the repeater where you can test for the footer.
E.g.
private void Repeater_ItemDataBound(Object Sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Footer)
{
TextBox textBox = e.Item.FindControl("TextBox1") as TextBox;
}
}
You can find controls in the repeater. That will give you all the controls in the repeater (RepeaterItems collection). Now you can do something like this:
RepeaterItem footerItem=null;
foreach(Control cnt in Repeater1.Controls)
{
if(cnt.GetType() == typeof(RepeaterItem) && ((RepeaterItem)cnt).ItemType == ListItemType.Footer)
{
footerItem = cnt;
break;
}
}
The footer should be the last child control of the repeater so you can do something like..
RepeaterItem riFooter = Repeater1.Controls[Repeater1.Controls.Count - 1] as RepeaterItem;
if (riFooter != null && riFooter.ItemType == ListItemType.Footer) {
TextBox TextBox1 = riFooter.FindControl("TextBox1") as TextBox;
if (TextBox1 != null) {
TextBox1.Text = "Test";
}
}

Resources