Elaine94 Ответов: 2

Подкачка Gridview не работает


привет,у меня есть проблема с подкачкой gridview. мой пейджинговый контроль не работал. я показываю таблицу, но когда я нажимаю на вторую страницу, она не открывается. ошибка не отображается. просто когда я перехожу на вторую страницу, она не переходит на вторую страницу.

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

это то, что я пытаюсь:

это страница aspx:
<asp:GridView ID="Gridview1" CssClass="Grid" runat="server"

                               AutoGenerateColumns="false" Width="100%"

                               AllowPaging="true" PageSize="10" DataKeyNames="post_id"

	                       OnRowCommand="GridView1_RowCommand" 

                               OnPageIndexChanging="Gridview1_PageIndexChanging"

                               EnableViewState="true">  
	<Columns> 
		<asp:TemplateField HeaderText="No." ItemStyle-Width ="3%">
			<ItemTemplate>
				<asp:Label ID="lblindex" runat="server" Text='<%#Container.DataItemIndex+1 %>'></asp:Label>
			</ItemTemplate>                                                    
		</asp:TemplateField> 
		<asp:TemplateField ItemStyle-Width ="3%" Visible="false">
			<ItemTemplate>
				<asp:Label ID="lblnum" runat="server" Text='<%# Eval("post_id") %>'></asp:Label>
			</ItemTemplate>                                                    
		</asp:TemplateField>
		<asp:BoundField DataField="job" HeaderText="Job Title" ItemStyle-Width ="16%" />
			  <ItemTemplate>
				<%# Eval("job")%>
			  </ItemTemplate>
			  <EditItemTemplate>
				  <asp:TextBox runat="server" ID="txtjobtitle" Text='<%# Eval("job_title") %>'></asp:TextBox>
			  </EditItemTemplate>
		</asp:TemplateField>--%>
		<asp:BoundField DataField="name" HeaderText="Company Name" ItemStyle-Width ="18%" />
		
		<asp:BoundField DataField="Category" HeaderText="Job Category" ItemStyle-Width ="18%" />
		<asp:BoundField DataField="description" HeaderText="Job Post Status" ItemStyle-Width ="13%"/>
		<asp:TemplateField HeaderText="Job Applicant" ItemStyle-Width ="11%">
			  <ItemTemplate>
				<%# "Job Opening: " + Eval("amount") %>
				  <br />
				<%# "Job Applied: "+ Eval("applied_count")%>
			  </ItemTemplate>
			  <EditItemTemplate>
				<asp:Label runat="server" ID="lbljobstatus" Text='<%# "Job Opening: " + Eval("amount").ToString() +", Job Applied: "+ Eval("applied_count").ToString()%>'></asp:Label>
			  </EditItemTemplate>
		</asp:TemplateField>
		<asp:ButtonField CommandName="editRecord" ButtonType="Link" Text="Edit" ItemStyle-Width="4%" ControlStyle-CssClass="text-rose">
                                                </asp:ButtonField>
		
		
		<asp:TemplateField ItemStyle-Width="9%">
			<ItemTemplate>
				<asp:CheckBox ID="myCheckBox1" runat="server" Text="Suspended" Checked='<%# Eval("suspend") == DBNull.Value ? false : Convert.ToBoolean(Eval("suspend")) %>'

					 OnCheckedChanged="myCheckBox1_CheckedChanged" AutoPostBack="true"/>
			</ItemTemplate>
		</asp:TemplateField>
		<asp:TemplateField ItemStyle-Width="8%">
			<ItemTemplate>
				<asp:CheckBox ID="myCheckBox2" runat="server" Text="Featured" Checked='<%# Eval("is_feat") == DBNull.Value ? false : Convert.ToBoolean(Eval("is_feat")) %>'

					 OnCheckedChanged="myCheckBox2_CheckedChanged1" AutoPostBack="true"/>
			</ItemTemplate>
		</asp:TemplateField>
	</Columns>  
</asp:GridView>


Таблица BindGridView, которая предназначена для отображения списка данных:
private void BindGridView()
{
	MySqlConnection con = new MySqlConnection(constr);
	MySqlCommand cmd = new MySqlCommand("SELECT jpw.jpw_id, jpw.post_id, 
	GROUP_CONCAT(jpw.job_title SEPARATOR ', ') as job, " +
	"ub.name,cat.name as 'Category',jpp.description,sum(jpw.amount) as amount, " +   
	"sum(jpw.applied_count) as applied_count, jpw.suspend, jp.is_feat " +
	"FROM xtime.job_post_worker jpw " +
	"left join job_post jp on jpw.post_id = jp.post_id " +
	"left join users_business ub on jp.ub_id = ub.ub_id " +
	"left join job_post_processing jpp on jp.status = jpp.status " +
	"left join category cat on jp.category = cat.cat_id " +
	"GROUP BY jpw.post_id " +
	"ORDER BY jpw.jpw_id ASC;", con);

	MySqlDataAdapter da = new MySqlDataAdapter(cmd);

	DataTable dt = new DataTable();

	da.Fill(dt);
	Gridview1.DataSource = dt;
	Gridview1.DataBind();
}

Тогда это мой индекс страницы gridview. во-первых, я попробовал тот, который я прокомментировал, но я не знаю, что он не работает, в то время как другие работают, и я попробовал второй, но он тоже не работает:
protected void Gridview1_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
	//Gridview1.PageIndex = e.NewPageIndex;
	//BindGridView();
	
	Gridview1.PageIndex = e.NewPageIndex;
	Gridview1.SelectedIndex = -1;
	BindGridView();
}


п/с: помогите мне, пожалуйста. совершенно не знаю, в чем проблема и как ее решить. спасибо :)

Graeme_Grant

"не работать". Как? Что случилось? Были ли какие-либо ошибки/исключения? Вы установили точку останова, чтобы проверить, что код, который вы ожидаете запустить, вызывается? Передаются ли правильные параметры подкачки? Передаются ли правильные параметры в запрос БД? Что возвращается в запросе БД? и т.д...

Пожалуйста, будьте конкретны, так как мы не можем запустить ваш код здесь.

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

Elaine94

я уже обновил вопрос,и пример кода я уже предоставил в том, что я попробовал. спасибо

Graeme_Grant

Есть много вопросов, заданных выше. Пожалуйста, найдите время, чтобы прочитать их и ответить здесь или обновить в своем вопросе (предпочтительно).

Elaine94

я обновил вопрос. я добавил кодировку aspx.

Graeme_Grant

Требуется дополнительная информация. Вопросы таковы:

1. What happened? Were there any errors/exceptions.
2. Have you set a breakpoint to check that the code that you're expecting to run is being called?
3. Are the correct paging parameters being passed from the ASPX page to the code-behind?
4. Are the correct parameters being passed to the DB query?
5. What is being returned in the DB Query? 

Каждый вопрос касается каждого этапа процесса. Это называется отладкой. Пожалуйста, найдите время, чтобы проработать эти вопросы, и вы найдете свой ответ.

Elaine94

1.Когда я запускаю веб-сайт, сначала он отображает список данных в gridview, а затем gridview получает управление подкачкой. поэтому я хочу увидеть данные на второй странице. но когда я нажал на вторую страницу,она не показывала следующую подкачку. нет никаких ошибок/исключений.
2. я уже установил точку останова, и да, код работает хорошо. количество индексов страниц имеет 2. так что его истинное право, просто не переходите на следующую страницу.(поправьте меня, если я ошибаюсь)
3. я не понимаю, о чем вы спрашиваете. я не совсем понимаю ваш вопрос № 3.
4. параметр, который должен быть передан в запрос БД, является правильным.
5.я установил размер подкачки 10, так что первая страница получила 10 данных, а вторая страница получила еще 2 данных, так как моя общая строка в БД равна 12.

Graeme_Grant

Так что если это так, то da.Fill(dt); должно содержать только две строки для 2-й страницы.

Elaine94

да, правильно. вроде бы так.

Graeme_Grant

Тогда ваш GridView должен корректно показывать только эти 2 строки.

Elaine94

да, но эти 2 строки не отображаются. когда я нажал на вторую страницу, она не перейдет на вторую страницу и не отобразит эти 2 строки. это странно, потому что другая таблица gridview может выполнять подкачку страниц. но этот gridview не может функционировать так же, как другие, даже если я использовал ту же кодировку.

Graeme_Grant

Хорошо, поймите, в чем проблема. См. решение, опубликованное ниже.

2 Ответов

Рейтинг:
2

Graeme_Grant

Это, по-видимому, распространенная проблема, возникающая при использовании таблиц данных и освежающих Привязок: asp.net gridview не обновляется при смене страниц - поиск Google[^]

Вот пример решения, найденного с помощью приведенного выше поиска Google: c# - GridView не изменяется при изменении страницы-переполнение стека[^]. В соответствии с этим ваш код должен быть:

protected void Page_Load(object sender, EventArgs e)
{ 
    if (!IsPostBack)
    {
        BindGridView(); 
    }
}

protected void Gridview1_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
    BindGridView(e.NewPageIndex);
}

private void BindGridView(int pageNumber = 0)
{
	MySqlConnection con = new MySqlConnection(constr);
	MySqlCommand cmd = new MySqlCommand("SELECT jpw.jpw_id, jpw.post_id, 
	GROUP_CONCAT(jpw.job_title SEPARATOR ', ') as job, " +
	"ub.name,cat.name as 'Category',jpp.description,sum(jpw.amount) as amount, " +   
	"sum(jpw.applied_count) as applied_count, jpw.suspend, jp.is_feat " +
	"FROM xtime.job_post_worker jpw " +
	"left join job_post jp on jpw.post_id = jp.post_id " +
	"left join users_business ub on jp.ub_id = ub.ub_id " +
	"left join job_post_processing jpp on jp.status = jpp.status " +
	"left join category cat on jp.category = cat.cat_id " +
	"GROUP BY jpw.post_id " +
	"ORDER BY jpw.jpw_id ASC;", con);
 
	MySqlDataAdapter da = new MySqlDataAdapter(cmd);
 
	DataTable dt = new DataTable();
 
	da.Fill(dt);
	
    Gridview1.PageIndex = pageNumber;
	Gridview1.DataSource = dt;
	Gridview1.DataBind();
}

Я знаю, что это похоже на семантику, однако есть признаки того, что это неправильное место, чтобы назвать это. Это незначительное изменение, по-видимому, работает.

Кроме того, в качестве побочного примечания, чтобы остановить Атаки SQL-инъекций[^] для построения SQL-запросов необходимо использовать параметры команд, а не конкатенацию строк.

ОБНОВЛЕНИЕ: Вот макет теста (так как у меня нет вашей БД):
<asp:Content ID="BodyContent" ContentPlaceHolderID="MainContent" runat="server">

    <asp:GridView ID="Gridview1" runat="server"

                  OnPageIndexChanging="Gridview1_PageIndexChanging"

                  EnableViewState="true" PageSize="10" AllowPaging="true" />
</asp:Content>

А код-за:
public partial class _Default : Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            BindGridView();
        }
    }

    protected void Gridview1_PageIndexChanging(object sender, GridViewPageEventArgs e)
    {
        BindGridView(e.NewPageIndex);
    }

    private void BindGridView(int pageNumber = 0)
    {
        Gridview1.PageIndex = pageNumber;
        Gridview1.DataSource = GetData();
        Gridview1.DataBind();
    }

    private static List<person> GetData()
    {
        // should add caching support
        var persons = new List<person>();
        for (int i = 0; i < 100; i++)
        {
            persons.Add(new person { First = $"First {i}", Last = $"Last {i}", Age = i });
        }

        return persons;
    }
}

class person
{
    public string First { get; set; }
    public string Last { get; set; }
    public int Age { get; set; }
}

Работает, как и ожидалось.


Elaine94

Эмм, если я запущу эту кодировку, она не будет отображать таблицу. моя страница становится пустой.

Graeme_Grant

Ты звонишь BindGridView откуда-то еще?

Elaine94

я называю это загрузкой страницы.

protected void Page_Load(отправитель объекта, EventArgs e)
{
if (! IsPostBack)
{
BindGridView();
}
}

Graeme_Grant

Проверьте обновление до решения.

Elaine94

Эмм, все еще не могу :(

Graeme_Grant

Меня беспокоит то, что я не вижу никакой подкачки в SQL-запросе.

Лично я бы использовал не DataTable, а чистую бизнес-логику.

Elaine94

нужно ли это? потому что на моей другой странице, которая имеет gridview, я этого не делал, я просто создаю функцию bindgridview и создаю изменение индекса страницы. я новичок в этом деле asp.net. если это означает, что мне нужно добавить предел 0,10 в мой sql-запрос?

Graeme_Grant

Да, я бы использовал бл. Вы загружаете слишком много данных на страницу и попадаете в БД с полным запросом-и то, и другое занимает много времени. Лучше брать только то, что вам нужно, короткими очередями - это значительно сократит время загрузки страницы и доступ к БД, сделав ваш сайт более отзывчивым для пользователя.

Elaine94

хорошо, я запомнил то, что вы сказали, но могу ли я узнать, что такое бл?

Graeme_Grant

BL = бизнес-логика... Я также предпочитаю MVC ASP.NET ... страницы стали намного светлее.

Elaine94

хорошо, спасибо за информацию.

Elaine94

Эй, это уже работа. когда я ставлю панель обновления, то она работает. без него ничего не получалось.

Graeme_Grant

Окей... Я сделал макет версии для проверки моего кода и работал так, как ожидалось - см. Я бы сказал, что вы неправильно применили эти предложения. Однако рад слышать, что это работает.

Рейтинг:
0

Er. Vikas Sangal

попробуйте после удаления

Gridview1.SelectedIndex = -1;


Elaine94

если я уберу это, все равно не перейду на вторую страницу.