NagaNimesh 11474558 Ответов: 3

Динамическое добавление кнопки в определенную ячейку сетки данных ASP.NET?


У меня есть DataGrid, который имеет 3 колонки имя пользователя,город и описание.С применением подключения к SQL получение данных и отображения результата,woriking порядке.но я должен добавить, редактировать и удалять кнопки для конкретной ячейки .можете вы пожалуйста помочь мне, как это сделать???

и моя таблица базы данных sql выглядит так:-

Имя_столбца Тип_данных
UserId Int(set identity property=true)
Имя пользователя varchar(50)
Город варчар(50)
Обозначение varchar (50)

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

мой код .cs-это:-

SqlConnection con = new SqlConnection("Data Source=MITSCPU108;Initial Catalog=sss;User ID=sa;Password=mits123$");
 protected void Page_Load(object sender, EventArgs e)
 {
     if (!IsPostBack)
     {
         BindEmployeeDetails();
     }
 }
 protected void BindEmployeeDetails()
 {
     con.Open();
     SqlCommand cmd = new SqlCommand("Select * from Employee_Details", con);
     SqlDataAdapter da = new SqlDataAdapter(cmd);
     DataSet ds = new DataSet();
     da.Fill(ds);
     con.Close();
     if (ds.Tables[0].Rows.Count > 0)
     {
         gvDetails.DataSource = ds;
         gvDetails.DataBind();
     }
     else
     {
         ds.Tables[0].Rows.Add(ds.Tables[0].NewRow());
         gvDetails.DataSource = ds;
         gvDetails.DataBind();
         int columncount = gvDetails.Rows[0].Cells.Count;
         gvDetails.Rows[0].Cells.Clear();
         gvDetails.Rows[0].Cells.Add(new TableCell());
         gvDetails.Rows[0].Cells[0].ColumnSpan = columncount;
         gvDetails.Rows[0].Cells[0].Text = "No Records Found";
     }
 }
 protected void gvDetails_RowEditing(object sender, GridViewEditEventArgs e)
 {
     gvDetails.EditIndex = e.NewEditIndex;
     BindEmployeeDetails();
 }
 protected void gvDetails_RowUpdating(object sender, GridViewUpdateEventArgs e)
 {
     int userid = Convert.ToInt32(gvDetails.DataKeys[e.RowIndex].Value.ToString());
     string username = gvDetails.DataKeys[e.RowIndex].Values["UserName"].ToString();
     TextBox txtcity = (TextBox)gvDetails.Rows[e.RowIndex].FindControl("txtcity");
     TextBox txtDesignation = (TextBox)gvDetails.Rows[e.RowIndex].FindControl("txtDesg");
     con.Open();
     SqlCommand cmd = new SqlCommand("update Employee_Details set City='" + txtcity.Text + "',Designation='" + txtDesignation.Text + "' where UserId=" + userid, con);
     cmd.ExecuteNonQuery();
     con.Close();
     lblresult.ForeColor = Color.Green;
     lblresult.Text = username + " Details Updated successfully";
     gvDetails.EditIndex = -1;
     BindEmployeeDetails();
 }
 protected void gvDetails_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
 {
     gvDetails.EditIndex = -1;
     BindEmployeeDetails();
 }
 protected void gvDetails_RowDeleting(object sender, GridViewDeleteEventArgs e)
 {
     int userid = Convert.ToInt32(gvDetails.DataKeys[e.RowIndex].Values["UserId"].ToString());
     string username = gvDetails.DataKeys[e.RowIndex].Values["UserName"].ToString();
     con.Open();
     SqlCommand cmd = new SqlCommand("delete from Employee_Details where UserId=" + userid, con);
     int result = cmd.ExecuteNonQuery();
     con.Close();
     if (result == 1)
     {
         BindEmployeeDetails();
         lblresult.ForeColor = Color.Red;
         lblresult.Text = username + " details deleted successfully";
     }
 }
 protected void gvDetails_RowCommand(object sender, GridViewCommandEventArgs e)
 {
     if (e.CommandName.Equals("AddNew"))
     {
         TextBox txtUsrname = (TextBox)gvDetails.FooterRow.FindControl("txtftrusrname");
         TextBox txtCity = (TextBox)gvDetails.FooterRow.FindControl("txtftrcity");
         TextBox txtDesgnation = (TextBox)gvDetails.FooterRow.FindControl("txtftrDesignation");
         con.Open();
         SqlCommand cmd =
         new SqlCommand(
         "insert into Employee_Details(UserName,City,Designation) values('" + txtUsrname.Text + "','" +
         txtCity.Text + "','" + txtDesgnation.Text + "')", con);
         int result = cmd.ExecuteNonQuery();
         con.Close();
         if (result == 1)
         {
             BindEmployeeDetails();
             lblresult.ForeColor = Color.Green;
             lblresult.Text = txtUsrname.Text + " Details inserted successfully";
         }
         else
         {
             lblresult.ForeColor = Color.Red;
             lblresult.Text = txtUsrname.Text + " Details not inserted";
         }
     }
 }


мой код aspx таков:-

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Untitled Page</title>
<style type="text/css">
.Gridview
{
font-family:Verdana;
font-size:10pt;
font-weight:normal;
color:black;
}
</style>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:GridView ID="gvDetails" DataKeyNames="UserId,UserName" runat="server"

AutoGenerateColumns="false" CssClass="Gridview" HeaderStyle-BackColor="#61A6F8"

ShowFooter="true" HeaderStyle-Font-Bold="true" HeaderStyle-ForeColor="White"

onrowcancelingedit="gvDetails_RowCancelingEdit"

onrowdeleting="gvDetails_RowDeleting" onrowediting="gvDetails_RowEditing"

onrowupdating="gvDetails_RowUpdating"

onrowcommand="gvDetails_RowCommand">
<Columns>
    <asp:TemplateField>
        <EditItemTemplate>
            <asp:ImageButton ID="imgbtnUpdate" CommandName="Update" runat="server" value="update" ImageUrl="~/Images/update.jpg" ToolTip="Update" Height="20px" Width="20px" />
            <asp:ImageButton ID="imgbtnCancel" runat="server" CommandName="Cancel" value="Cancel"  ImageUrl="~/Images/Cancel.jpg" ToolTip="Cancel" Height="20px" Width="20px" />
        </EditItemTemplate>
        <ItemTemplate>
            <asp:ImageButton ID="imgbtnEdit" CommandName="Edit" runat="server" ImageUrl="~/Images/Edit.jpg" ToolTip="Edit" Height="20px" Width="20px" />
            <asp:ImageButton ID="imgbtnDelete" CommandName="Delete" Text="Edit" runat="server" ImageUrl="~/Images/delete.jpg" ToolTip="Delete" Height="20px" Width="20px" />
        </ItemTemplate>
        <FooterTemplate>
            <asp:ImageButton ID="imgbtnAdd" runat="server" ImageUrl="~/Images/AddNewitem.jpg" CommandName="AddNew" Width="30px" Height="30px" ToolTip="Add new User" ValidationGroup="validaiton" />
        </FooterTemplate>
    </asp:TemplateField>
    <asp:TemplateField HeaderText="UserName">
        <EditItemTemplate>
           <asp:Label ID="lbleditusr" runat="server" Text='<%#Eval("Username") %>'/>
        </EditItemTemplate>
        <ItemTemplate>
          <asp:Label ID="lblitemUsr" runat="server" Text='<%#Eval("UserName") %>'/>
        </ItemTemplate>
        <FooterTemplate>
            <asp:TextBox ID="txtftrusrname" runat="server"/>
            <asp:RequiredFieldValidator ID="rfvusername" runat="server" ControlToValidate="txtftrusrname" Text="*" ValidationGroup="validaiton"/>
        </FooterTemplate>
    </asp:TemplateField>
    <asp:TemplateField HeaderText="City">
        <EditItemTemplate>
           <asp:TextBox ID="txtcity" runat="server" Text='<%#Eval("City") %>'/>
        </EditItemTemplate>
        <ItemTemplate>
          <asp:Label ID="lblcity" runat="server" Text='<%#Eval("City") %>'/>
        </ItemTemplate>
        <FooterTemplate>
            <asp:TextBox ID="txtftrcity" runat="server"/>
            <asp:RequiredFieldValidator ID="rfvcity" runat="server" ControlToValidate="txtftrcity" Text="*" ValidationGroup="validaiton"/>
        </FooterTemplate>
    </asp:TemplateField>
    <asp:TemplateField HeaderText="Designation">
        <EditItemTemplate>
          <asp:TextBox ID="txtDesg" runat="server" Text='<%#Eval("Designation") %>'/>
        </EditItemTemplate>
        <ItemTemplate>
          <asp:Label ID="lblDesg" runat="server" Text='<%#Eval("Designation") %>'/>
        </ItemTemplate>
        <FooterTemplate>
           <asp:TextBox ID="txtftrDesignation" runat="server"/>
           <asp:RequiredFieldValidator ID="rfvdesignation" runat="server" ControlToValidate="txtftrDesignation" Text="*" ValidationGroup="validaiton"/>
        </FooterTemplate>
    </asp:TemplateField>
</Columns>
</asp:GridView>
</div>
<div>
 <asp:Label ID="lblresult" runat="server"></asp:Label>
</div>
</form>
</body>
</html>

Tadit Dash (ତଡିତ୍ କୁମାର ଦାଶ)

В чем проблема?

NagaNimesh 11474558

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

3 Ответов

Рейтинг:
2

Vincent Maverick Durano

Во-первых, не нужно жестко кодировать строку подключения в файле code behind. Вы должны поместить конфигурацию в свой файл web. config под connectionString элемент.

Во-вторых, сделайте привычкой ставить объекты, которые едят ресурсы, такие как SqlConnection, SqlCommand и SqlDataAdapter в оператор using[^] чтобы гарантировать, что объекты будут правильно утилизированы и закрыты после их использования.

В-третьих, не используйте DataSet когда вы имеете дело только с 1 результирующим набором. Вместо этого вы могли бы использовать DataTable.

А теперь вернемся к вашему первоначальному вопросу. Поскольку вы уже настроили Edit и Delete кнопки внутри вашего GridView, то вы можете использовать RowDataBound событие для скрытия кнопок на основе вашего требования. Например:

protected void gvDetails_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        ImageButton imgEdit = (ImageButton)e.Row.FindControl("imgbtnEdit");
        ImageButton imgDelete = (ImageButton)e.Row.FindControl("imgbtnDelete");
        if("<your condition="" here="" to="" hide="" your="" buttons="">"){
                      imgEdit.Visible = false;
                      imgDelete.Visible = false;
        }
    }
}


F-ES Sitecore

"использование" и явное удаление необходимы только для объектов, использующих ресурсы, которые не находятся под контролем .net, например SqlConnection, использующий соединение с базой данных. SqlCommand и т. д. не нуждаются в какой-либо специальной утилизации, так как они не используют ресурсы, не контролируемые .net.

Vincent Maverick Durano

Я всегда предпочитаю помещать SqlCommand и любой объект, реализующий IDisposable, в "using statement", чтобы избавиться от них и освободить память. Кроме того, это делает код более читабельным и избавляет меня от необходимости писать код очистки.

F-ES Sitecore

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

Vincent Maverick Durano

Точка зрения принята :) но все же я по-прежнему предпочитаю оборачивать свои SqlCommands в блок "using" :)

NagaNimesh 11474558

танк так много всего для вашего предложения.наконец я получил результат.

Vincent Maverick Durano

потрясающе! не забудьте закрыть эту тему, отметив сообщение (ы), которое поможет вам решить вашу проблему для дальнейшего использования. Спасибо.

Рейтинг:
2

Mohtshm Zubair

u может иметь полный контроль над ним с помощью события databound gridview, которое запускается после привязки данных . Затем удалите или удалите эти кнопки из всех строк, кроме желаемой, на основе конкретной записи. Пожалуйста, проверьте эти события.
На самом деле то, что я предлагаю добавить эти кнопки в эту строку databound event, будет намного лучше и чище.


protected void GridView_DataBound(object sender, EventArgs e)
    { 


NagaNimesh 11474558

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

NagaNimesh 11474558

танк так много Мистер Мохтшм Зубаир

Рейтинг:
1

Mohtshm Zubair

В настоящее время ваш gridview


<asp:GridView ID="gvDetails" DataKeyNames="UserId,UserName" runat="server"

AutoGenerateColumns="false" CssClass="Gridview" HeaderStyle-BackColor="#61A6F8"

ShowFooter="true" HeaderStyle-Font-Bold="true" HeaderStyle-ForeColor="White"

onrowcancelingedit="gvDetails_RowCancelingEdit"

onrowdeleting="gvDetails_RowDeleting" onrowediting="gvDetails_RowEditing"

onrowupdating="gvDetails_RowUpdating"

onrowcommand="gvDetails_RowCommand">


Теперь добавьте в end rowdatabound событие

 <asp:GridView ID="gvDetails" DataKeyNames="UserId,UserName" runat="server"

AutoGenerateColumns="false" CssClass="Gridview" HeaderStyle-BackColor="#61A6F8"

ShowFooter="true" HeaderStyle-Font-Bold="true" HeaderStyle-ForeColor="White"

onrowcancelingedit="gvDetails_RowCancelingEdit"

onrowdeleting="gvDetails_RowDeleting" onrowediting="gvDetails_RowEditing"

onrowupdating="gvDetails_RowUpdating"

onrowcommand="gvDetails_RowCommand" 

OnRowDataBound="gvDetails_RowDataBound"

>



Затем в codebehind добавьте новый метод для этого события как

protected void gvDetails_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if(e.Row.RowType==DataControlRowType.DataRow)  
        { 
               /// here you can put ur criteria to either delete those buttons which are generating for each row except for .....
        } 
}


этот метод вызывает каждую строку автоматически и он более мощный чем Databound в том смысле что вы должны использовать foreach


NagaNimesh 11474558

танк так много, что я получил результат.

Mohtshm Zubair

Марк плз ее решить!