Попытка динамически добавить кнопку с уникальным идентификатором в DataGridView для каждой строки
Я пытался сделать вышеупомянутые вещи с этим кодом:
protected void Page_Load(object sender, EventArgs e)
{
if (!this.IsPostBack)
{
//Populating a table from the database
SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["connect"].ToString());
con.Open();
SqlDataAdapter da = new SqlDataAdapter("Select * from tbluser", con);
DataTable dt = new DataTable();
da.Fill(dt);
DataTable finaldt = new DataTable();
foreach (DataColumn column in dt.Columns)
{
if (column.ColumnName == "user_name")
{
finaldt.Columns.Add("Username", typeof(string));
}else if (column.ColumnName == "first_name")
{
finaldt.Columns.Add("First Name", typeof(string));
}else if (column.ColumnName == "last_name")
{
finaldt.Columns.Add("Last Name", typeof(string));
}else if (column.ColumnName == "email")
{
finaldt.Columns.Add("E-mail", typeof(string));
}else if (column.ColumnName == "grade")
{
finaldt.Columns.Add("Grade", typeof(string));
}
}
finaldt.Columns.Add("Edit", typeof(Button));
foreach (DataRow row in dt.Rows)
{
Button removalButton = new Button();
removalButton.Text = "Remove";
removalButton.ID = "remove_" + row["user_name"];
removalButton.Click += new EventHandler(remove_student);
finaldt.Rows.Add(row["user_name"], row["first_name"], row["last_name"], row["email"], row["grade"], removalButton);
}
GridView1.DataSource = finaldt;
GridView1.DataBind();
В нижней части, где я добавляю строки в "finaldt", я не уверен, что эта логика полностью действительна при попытке настроить столбец для кнопок с
finaldt.Columns.Add("Edit", typeof(Button));
линия. Должен ли я сделать что-то здесь по-другому?
2 ответа
Я надеюсь, что я не что-то упустил; однако я не уверен, что понимаю, что вы подразумеваете под...
"… Динамически добавлять кнопку с уникальным идентификатором в DataGridView для каждой строки"
Если в сетке есть столбец кнопок, то единственное, что "однозначно" идентифицирует, какая кнопка была нажата, - это строка, в которой она находится. Использование вашего примера для "удаления" строки при нажатии кнопки является простым… тем не мение; это событие, которое может быть выполнено в GRID... не обязательно в событии нажатия кнопки... которое не будет доступно, поскольку кнопка находится в сетке.
Я предлагаю вам просто добавить столбец кнопки, а затем подключить сетки CellClick
событие и проверьте, был ли нажат столбец кнопки. Если столбец кнопки был нажат, нам просто нужно получить индекс строки нажатой кнопки. С помощью индекса строки вы будете знать, какую строку удалить.
Это кажется простым, поскольку ваш пример использует DataTable
В качестве источника данных для сетки может потребоваться дополнительный шаг. Тот же принцип будет применяться с использованием другого "типа" источника данных. В этом случае источником данных является DataTable.
Использование источника данных для сетки подразумевает, что сам источник данных и то, что отображает сетка, не обязательно могут быть одинаковыми. Пример: если вы сортируете сетку, щелкая заголовок столбца, сетка обязательно отсортирует этот столбец и отобразит сортировку в сетке. Однако велики шансы, что источник данных DataTable
не обязательно отражает этот вид, поэтому, когда пользователь нажимает кнопку удаления, индекс строки, перенастроенный из сетки, будет отражать индекс строки "сетки", а не обязательно DataTable
индекс строки s.
Одним из возможных решений является использование сетки DataBoundItem
имущество. Это вернет объект, который может быть приведен к DataRowView
объект. DataRowView
Объект может быть использован в качестве параметра для DataTable
s IndexOf
свойство найти DataTable
индекс строки s. Таким образом, давая индекс строки, мы должны удалить из DataTable
, Код комментария ниже делает это, если вам нужен индекс строки. Вместо того, чтобы получить индекс строки DataTable.Rows.Remove
свойство используется для удаления возвращенного DataRowView.Row
объект вместо Надеюсь, это поможет.
Ниже приведен пример того, что описано выше.
private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e) {
if (e.RowIndex >= 0 && e.ColumnIndex >= 0 && (!dataGridView1.Rows[e.RowIndex].IsNewRow)) {
if (dataGridView1.Columns[e.ColumnIndex].Name == "Remove") {
DataRowView dataRowView = (DataRowView)dataGridView1.Rows[e.RowIndex].DataBoundItem;
if (dataRowView != null) {
//int rowIndex = gridTable.Rows.IndexOf(dataRowView.Row);
//gridTable.Rows.RemoveAt(rowIndex);
gridTable.Rows.Remove(dataRowView.Row);
}
}
}
}
DataTable gridTable;
public Form1() {
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e) {
gridTable = GetTable();
dataGridView1.DataSource = gridTable;
AddButtonColumnToDGV();
FillTable(gridTable);
}
private void AddButtonColumnToDGV() {
DataGridViewButtonColumn buttonCol = new DataGridViewButtonColumn {
Name = "Remove",
Text = "Remove",
UseColumnTextForButtonValue = true
};
dataGridView1.Columns.Add(buttonCol);
}
private DataTable GetTable() {
DataTable dt = new DataTable();
dt.Columns.Add("User Name", typeof(string));
dt.Columns.Add("First Name", typeof(string));
dt.Columns.Add("Last Name", typeof(string));
dt.Columns.Add("Grade", typeof(string));
return dt;
}
private void FillTable(DataTable dt) {
for (int i = 0; i < 10; i++) {
dt.Rows.Add("Name" + i, "FName" + i, "LNameR" + i, "GradeR" + i);
}
}
Вы не можете добавить кнопку в DataTable
, Вам нужно будет добавить кнопку в DataGridViewRow
всякий раз, когда вы закончили загрузку DataTable
,
DataGridViewButtonColumn buttonColumn = new DataGridViewButtonColumn();
buttonColumn.Name = "YourColumn";
buttonColumn.Text = "YourText";
if (YourDataGrid.Columns["YourColumn"] == null)
{
YourDataGrid.Columns.Insert(4, buttonColumn); //here you have to put the columnIndex
}
Тогда вам нужно будет добавить обработчик:
YourDataGrid.CellClick += dataGridViewButton_CellClick;
А затем сделайте что-нибудь с этим:
private void dataGridViewButton_CellClick(object sender, DataGridViewCellEventArgs e)
{
//YOUR CODE IN HERE
}