#c# #asp.net #.net #gridview #updatepanel
Вопрос:
я постараюсь объяснить, что у меня есть, что я пытаюсь сделать и в чем моя проблема
что у меня есть: у меня есть модальная панель с и обновлением (она мне нужна, потому что обратная связь закрывает мою модальную), в которой есть два текстовых поля, кнопка и вид сетки. в текстовом поле я пишу имя и фамилию человека и с помощью кнопки извлекаю данные и помещаю их в сетку. в представлении сетки есть элемент управления для выбора нужной строки, с помощью этой строки я использую данные из первых трех ячеек, чтобы изменить некоторые значения скрытых полей для использования в другой функции. в нижней части модального у меня есть кнопка добавить, которая изменяет только текстовое поле, чтобы показать, что у меня есть правильные данные. эта кнопка по умолчанию не включена, и событие должно ее включить
что я хочу: я хочу выбрать нужную строку, включить кнопку «Добавить» и получить данные в своем текстовом поле.
в чем моя проблема: когда я выбираю свою строку, selectedindexchanging срабатывает, но никогда не включает кнопку «Добавить», поэтому я не могу получить свое текстовое поле для его использования
код:
передний код:
<div class="modal fade" id="modalSocio" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" aria-labelledby="staticBackdropLabel" aria-hidden="true">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="staticBackdropLabelSocio">
<asp:Label ID="Label4" runat="server" CssClass="text-primary"></asp:Label>
</h5>
</div>
<asp:UpdatePanel ID="UpdatePanel1" runat="server" >
<ContentTemplate>
<div class="modal-body">
<div class="row g-3">
<div class="row">
<div class="col-3">
<asp:TextBox ID="txtBusquedaNombre" runat="server" CssClass="form-control" placeholder="Nombre"></asp:TextBox>
</div>
<div class="col-3">
<asp:TextBox ID="txtBusquedaApellido" runat="server" CssClass="form-control" placeholder="Apellido"></asp:TextBox>
</div>
<div class="col-3">
<asp:LinkButton ID="btnBuscarSocio" runat="server" CssClass="btn btn-outline-success" Text="Buscar" CausesValidation="false" ToolTip="Buscar" OnClick="btnBuscarSocio_Click" ><span class="fas fa-search"></span></asp:LinkButton>
</div>
</div>
<div class="table-responsive mt-3">
<asp:GridView ID="gvSocios" runat="server" CssClass="table table-bordered" AutoGenerateColumns="False" CellPadding="4" ForeColor="#333333" GridLines="None" OnSelectedIndexChanging="gvSocios_SelectedIndexChanging" >
<AlternatingRowStyle BackColor="White" />
<Columns>
<asp:BoundField DataField="Legajo" HeaderText="Nro. Socio" ></asp:BoundField>
<asp:BoundField DataField="nombreSocio" HeaderText="Nombre" />
<asp:BoundField DataField="Apellido" HeaderText="Apellido" />
<asp:CommandField ButtonType="Link" HeaderText="Seleccionar" ShowSelectButton="True" SelectText="<i class='fa fa-check-circle'></i>">
<ControlStyle CssClass="btn btn-outline-secondary" />
</asp:CommandField>
</Columns>
<EditRowStyle BackColor="#2461BF" />
<FooterStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
<HeaderStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
<PagerStyle BackColor="#2461BF" ForeColor="White" HorizontalAlign="Center" />
<RowStyle BackColor="#EFF3FB" />
<SelectedRowStyle BackColor="#D1DDF1" Font-Bold="True" ForeColor="#333333" />
<SortedAscendingCellStyle BackColor="#F5F7FB" />
<SortedAscendingHeaderStyle BackColor="#6D95E1" />
<SortedDescendingCellStyle BackColor="#E9EBEF" />
<SortedDescendingHeaderStyle BackColor="#4870BE" />
<EmptyDataTemplate>
<div class="alert alert-primary" role="alert">
No se encontraron registros!
</div>
</EmptyDataTemplate>
</asp:GridView>
</div>
</div>
</div>
</ContentTemplate>
</asp:UpdatePanel>
<div class="modal-footer">
<asp:Button ID="BtnCancelarSocio" runat="server" Text="Cancelar" CssClass="btn btn-secondary" OnClick="btnCancelar_Click" CausesValidation="False" />
<asp:Button ID="BtnAgregarSocio" ClientIDMode="Static" runat="server" CausesValidation="false" Text="Seleccionar" CssClass="btn btn-success" OnClick="BtnAgregarSocio_Click" />
</div>
</div>
</div>
</div>
Поиск кода:
protected void BtnAgregarSocio_Click(object sender, EventArgs e)
{
TxtSocio.Text = hfidNombreSocio.Value;
}
protected void gvSocios_SelectedIndexChanging(object sender, GridViewSelectEventArgs e)
{
var row = gvFormasPago.Rows[e.NewSelectedIndex];
BtnAgregarSocio.Enabled = true;
hfSocio.Value = row.Cells[0].Text;
hfidNombreSocio.Value = row.Cells[0].Text " - " row.Cells[1].Text " " row.Cells[2].Text;
}
я пытался не использовать атрибут enabled для тестирования, но когда срабатывает событие click, значение hfidNombreSocio в этот момент пусто, и модал никогда не закрывается.
может быть, я неправильно использую панель обновления.
код текстового поля:
<div class="row">
<div class="col-md-4">
<asp:Label ID="lblSocio" runat="server" Visible="false" Text="Socio Cuenta Corriente" CssClass="form-label"></asp:Label>
<asp:TextBox ID="TxtSocio" runat="server" text="0" CssClass="form-control" ></asp:TextBox>
<asp:LinkButton ID="btnBuscar" runat="server" Visible="false" CssClass="btn btn-outline-success" Text="Buscar" CausesValidation="false" ToolTip="Buscar" OnClick="btnBuscar_Click" ><span class="fas fa-search"></span></asp:LinkButton> <%-- this button open the modal --%>
</div>
Комментарии:
1. Ну, независимо от кода, я НИКОГДА не знал, что введение панели обновления позволяет выполнять обратную отправку без отключения всплывающего окна. Как правило, всплывающее окно не может пережить обратную отправку-даже при использовании панели обновления. Сделайте быстрый тест и бросьте в испытательный самолет Джейн asp.net кнопка — посмотрите, что произойдет, когда вы нажмете на нее, — вполне уверен, что всплывающее окно изменится.
2. Добавьте
HiddenField
, что вы можете сохранить значение состояния всплывающего окна (показать / скрыть), так как это значение будет сохраняться между обратными передачами, а затем при перезагрузке обратной передачи проверьте значение, чтобы определить, нужно ли его показывать.3. @AlbertD.Kallal я не знаю, что такое испытательный самолет Джейн asp.net кнопка, не могли бы вы привести мне пример?
4. @JohnPete22 я не знаю, как я могу это сделать, потому что модальные всплывающие окна с событием от кнопки btnBuscar код такой: ` ScriptManager. RegisterStartupScript(это, это. GetType(), «Pop», «$(‘#modalSocio’).модальный(‘показать’);», true); `
5. в вашем всплывающем окне введите стандартный asp.net кнопка, есть код для отладки.выведите «Привет». Теперь нажмите эту кнопку — это вызовет обратный отсчет, и ваш модальный диалог свернется. Для проверки этого требуется 15 секунд. Как я уже говорил, я НЕ знаю, что модальный диалог может пережить обратную передачу. В таком случае попытка использовать обновленную панель вам не поможет. теперь, если я ошибаюсь, то мои комментарии могут быть проигнорированы и не имеют под собой оснований.
Ответ №1:
Ладно, ребята, это один из тех случаев, когда я хотел бы, чтобы кто-нибудь меня поправил!!
Я ОЧЕНЬ РАД, что у меня на лице большие ведра яиц.
Я в течение некоторого времени проповедовал, что, когда вы открываете диалоговое окно, в этом диалоговом окне не может быть обратной записи. Я стою СИЛЬНО исправленным!!!!
Итак, давайте построим сетку, она позволяет выполнять поиск, а затем мы можем нажать (выбрать строку).
У нас есть это:
<div id="hoteldialog1" style="display:normal">
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
Enter City Name: <asp:TextBox ID="txtSearchCity" runat="server"></asp:TextBox>
<asp:Button ID="cmdSearchCity" runat="server" Text="Search"
style="margin-left:25px" CssClass="btn" OnClick="cmdSearchCity_Click"/>
<br />
<asp:GridView ID="GridHotels" runat="server" AutoGenerateColumns="False"
DataKeyNames="ID" OnSelectedIndexChanged="GridHotels_SelectedIndexChanged"
CssClass="table">
<Columns>
<asp:BoundField DataField="HotelName" HeaderText="HotelName" />
<asp:BoundField DataField="City" HeaderText="City" />
<asp:BoundField DataField="Province" HeaderText="Province" />
<asp:BoundField DataField="Description" HeaderText="Description" />
<asp:TemplateField HeaderText="Select">
<ItemTemplate>
<asp:Button ID="cmdHSel" runat="server" Text="Select"
CommandName="Select"/>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
</ContentTemplate>
</asp:UpdatePanel>
</div>
Итак, когда мы бежим, мы получаем/видим это:
Теперь, в приведенном выше примере, я использовал CommmandName = «выбрать», потому что я хотел, чтобы строка выбора работала. (и я просто ненавижу все эти дополнительные шаблоны). Поэтому я использовал этот код, чтобы выделить строку.
protected void GridHotels_SelectedIndexChanged(object sender, EventArgs e)
{
// user selected this row - highlight it
int RowIX = GridHotels.SelectedIndex;
GridViewRow gRow = (GridViewRow)GridHotels.Rows[RowIX];
if ((ViewState["MySel"] != null) amp;amp; ((int)ViewState["MySel"] != RowIX))
{
GridViewRow gLast = GridHotels.Rows[(int)ViewState["MySel"]];
gLast.CssClass = "";
}
gRow.CssClass = "alert-info";
ViewState["MySel"] = RowIX;
}
Ладно, пока все так просто. А кнопка поиска вверху такая:
protected void cmdSearchCity_Click(object sender, EventArgs e)
{
using (SqlConnection conn = new SqlConnection(Properties.Settings.Default.TEST4))
{
using (SqlCommand cmdSQL = new SqlCommand("SELECT * FROM tblHotels ", conn))
{
if (txtSearchCity.Text != "")
{
// filter grid by city
cmdSQL.CommandText = " WHERE City = @City";
cmdSQL.Parameters.Add("@City", SqlDbType.NVarChar).Value = txtSearchCity.Text;
}
conn.Open();
cmdSQL.CommandText = " ORDER BY HotelName";
GridHotels.DataSource = cmdSQL.ExecuteReader();
GridHotels.DataBind();
}
}
}
Опять же, очень просто.
Ладно, теперь дело за деньгами. Теперь Розеттский камень. Теперь говядина, теперь волшебство, теперь удивительное!!!
Вышеизложенное, как отмечалось, было помещено в «div» и имеет панель обновления.
Итак, теперь давайте перейдем к другой сетке!!!
Мы собираемся показать некоторых людей и открыть вышеприведенную сетку выбора отелей!!
Итак, теперь у нас есть это:
<asp:GridView ID="GPeople" runat="server" AutoGenerateColumns="False"
DataKeyNames="ID" >
<Columns>
<asp:BoundField DataField="Firstname" HeaderText="Firstname" />
<asp:BoundField DataField="LastName" HeaderText="LastName" />
<asp:BoundField DataField="City" HeaderText="City" />
<asp:BoundField DataField="Province" HeaderText="Province" />
<asp:TemplateField>
<ItemTemplate>
<asp:Button ID="cmdGetHotel" runat="server" Text="Hotels"
OnClick="cmdGetHotel_Click"
OnClientClick="return mypop(this);"
/>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
И код:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
LoadPeople();
}
void LoadPeople()
{
GPeople.DataSource = MyRst("SELECT * from People Order by FirstName");
GPeople.DataBind();
}
Итак, теперь у нас есть сетка людей. Теперь мы хотим, чтобы по щелчку в строке появился список отелей.
Итак, я предлагаю jQuery.Пользовательский интерфейс, как намного лучше (и чище, чем диалоговое окно начальной загрузки).
Итак, у нас есть эта строка, нажмите выше:
<asp:Button ID="cmdGetHotel" runat="server" Text="Hotels"
OnClick="cmdGetHotel_Click"
OnClientClick="return mypop(this);"
/>
Итак, в приведенном выше примере у нас есть кнопка на стороне сервера, а затем функция js на стороне клиента, которая открывает диалоговое окно (и возвращает значение true ТОЛЬКО в том случае, если мы нажмем ok.
Итак, теперь все, что нам нужно, — это код js для открытия диалогового окна. Этот код заключается в следующем:
<script>
selok = false;
function mypop(btn) {
if (selok)
return true;
var mydiv = $("#hoteldialog1")
mydiv.dialog({
modal: true, appendTo: "form",
title: "Test dialog", closeText: "",
width: "40%",
position: { my: 'left top', at: 'right bottom', of: btn },
buttons: {
Ok: (function () {
selok = true;
btn.click()
}),
Cancel: (function () {
mydiv.dialog("close")
})
}
});
return false;
}
</script>
(установите отображение сетки отелей:нет — jquery.ui будет управлять этим).
Итак, теперь мы получаем это:
Таким образом, мы можем свободно искать, иметь обратные ссылки и, конечно же, выбирать строку.
Если пользователь нажимает «ОК», запускается первый код кнопки сетки. Я НЕ использовал выбранное событие изменения индекса для этой первой сетки (я мог бы), но я использовал этот код:
protected void cmdGetHotel_Click(object sender, EventArgs e)
{
Debug.Print("hotel grid click");
Button btn = (Button)sender;
GridViewRow gRow = (GridViewRow)btn.Parent.Parent;
Debug.Print("Grid row = " gRow.RowIndex);
Debug.Print("PK = " GPeople.DataKeys[gRow.RowIndex]["ID"].ToString());
Также обратите внимание, что в то время как всплывающая сетка скрыта? Мы ВСЕ еще можем получить любые данные из этой строки, так как выбранный индекс этой сетки сохраняется!!
напр.:
GridViewRow gRow = (GridViewRow)GHotels.Rows[GHotels.SelectedIndex];
Debug.Print("Grid row = " gRow.RowIndex);
Debug.Print("PK = " GPeople.DataKeys[gRow.RowIndex]["ID"].ToString());
// cells collection, or find control to grab any other value
Итак, я думаю, вам следует сбросить диалоговое окно начальной загрузки.
Поместите свою 2-ю красивую сетку поиск, разместите обратные ссылки — все, что вы хотите, в div с именем и используйте jQuery.Пользовательский интерфейс для отображения сетки. Это позволит выполнять поиск, отправлять обратные сообщения, а затем, когда пользователь выберет строку и нажмет «ОК», вы можете закрыть это диалоговое окно, и у вас есть «индекс» этого всплывающего окна, установленный для вас.
Комментарии:
1. ты лучший, ты спас меня, спасибо
2. Пожалуйста. В прошлом тестировал и пытался использовать jquery. Диалоговое окно пользовательского интерфейса, но оно НЕ выдержало бы отката. Совершенно уверен, что поместите панель обновления вокруг div (это не работает). Но, div, а ЗАТЕМ панель обновления внутри работает!!! (сюрприз для меня!!!0. Это открывает ОГРОМНЫЕ двери для создания своего рода всплывающих диалогов с обратными ссылками. Действительно большое дело, и поэтому мы можем использовать серверный код для наших диалогов. Обратите внимание, что кнопка нажмите трюк с возвращением true/false. Диалоговое окно асинхронно, но этот флаг «ок» позволяет это сделать.