Работаю с Visual Studio 2019, C# и WPF. Я пытаюсь динамически удалить заголовок таблицы, но у меня есть некоторые проблемы.
Описание метода задачи:
У меня есть метод, чтобы выбрать имя пакета данных и создать Datatable с ними как Datatableheaders. Пока это работает нормально, проблема в том, чтобы удалить старые заголовки таблицы при втором или третьем запуске. Я пробовал несколько разных способов удаления заголовков, но у меня ничего не получалось.
Когда я использую «Первая попытка» (показать метод «Проблема»), ничего не будет удалено, потому что в моей таблице для DataStream нет столбцов (просматривается с помощью отладчика при втором запуске метода). Но когда я меняю tableforDataStream на свой DataGrid (dgTable3), у меня там 3 столбца, и я не могу добавить новые столбцы в свой tableforDataStream (например, смотреть последнюю таблицу левой картинки).
Вторая и третья попытки почти такие же, как первая попытка, за исключением того, что я могу проверить, остались ли какие-либо столбцы. Я уже пробовал tableforDataStream.Reset;
, но это не имеет никакого смысла, это то же самое решение, что и «Первая попытка».
Метод проблемы:
private void CreateOverviewTable_Click(object sender, RoutedEventArgs e)
{
if (isConnected != 0)
{
//tableforDataStream.Columns.Clear(); <--- First try to delete the old tableforDataStream.Header
if (dgTable3.Columns.Count != 0)
{
while(dgTable3.Columns.Count > 0)
{
//tableforDataStream.Columns.RemoveAt(0); <--- Second try to delete the old tableforDataStream.Header
dgTable3.Columns.RemoveAt(0); //<--- Third try to delete the old tableforDataStream.Header
}
}
int anzZeilen = tableSelectedVar.Rows.Count;
if (anzZeilen != 0)
{
dgTable1.Visibility = Visibility.Collapsed;
dgTable3.Visibility = Visibility.Visible;
//Create an array for the data packages(VarName, SaveAddress, VarSize)
string[,] inhaltVar = new string[anzZeilen, 3];
//Copie all infos from the Variable into the array
for (int i = 0; i <= anzZeilen - 1; i++)
{
for (int j = 0; j < 3; j++)
{
inhaltVar[i, j] = tableSelectedVar.Rows[i].ItemArray[j].ToString();
}
}
//Create for every data package a column inside the tableforDataStream
for (int k = 0; k <= (inhaltVar.GetLength(0) - 1); k++)
{
try
{
//insert the VarName as tableforDataStream.Header
tableforDataStream.Columns.Add(inhaltVar[k, 0]);
}
catch (Exception exc)
{
MessageBox.Show("The variable was already send to machine");
}
}
//send Data over UDP to the machine
if (isConnected == 1)
{
SendDataToMachine(inhaltVar);
}
else
{
MessageBox.Show("Please start first the connection");
}
}
else
{
MessageBox.Show("Please insert minimum one Variable for overwatch", null, MessageBoxButton.OK, MessageBoxImage.Information);
}
}
else
{
MessageBox.Show("Please start the conection to machine");
}
}
На этом рисунке показан результат «Первая попытка» при втором запуске метода, красные стрелки должны быть удалены, а зеленые стрелки должны быть на месте.
Это мой графический интерфейс, когда я удаляю свой DataGrid (dgTable3), как в фактическом «проблемном методе».
Обновлено: добавьте дополнительную информацию и вставьте новый метод проблемы.
Вы должны очистить столбцы от DataGrid
или GridView
:
dgTable1.Columns.Clear();
Разве это не то, что вы хотите? Я думаю, вы автоматически генерируете столбцы?
Привет, проблема в том, что когда я удаляю столбцы внутри сетки данных, я не могу добавить новые столбцы. Моя цель - запустить метод, все столбцы будут удалены внутри этой таблицы, и я смогу создать новые столбцы с новым заголовком. Когда я делаю то, что вы пишете, я не могу создавать новые столбцы.
Какой? Конечно, вы можете добавлять новые столбцы в dgTable1.Columns
независимо от того, сколько раз вы вызывали метод Clear
?
я не знаю, почему я не могу сначала удалить заголовки, которые мне нравятся, но у меня есть обходной путь, если у кого-то такая же проблема.
Вот мой код:
private void CreateOverviewTable_Click(object sender, RoutedEventArgs e)
{
if (isConnected != 0)
{
int anzNeueVar = tableSelectedVar.Rows.Count;
//Überprüft ob eine Variable zur Überwachung ausgewählt wurde
if (anzNeueVar != 0)
{
//Macht das dgTable1 unsichtbar und macht dgTable3 an der Stelle von dgTable1 sichtbar
dgTable1.Visibility = Visibility.Collapsed;
dgTable3.Visibility = Visibility.Visible;
//Erstellt ein Array welcher in der ersten Splate den Namen hat, in der zweiten die Adresse und in der dritten die Datengröße.
string[,] inhaltVar = new string[anzNeueVar, 3];
//Liest die Daten aus der Tabelle in den Array
for (int i = 0; i <= anzNeueVar - 1; i++)
{
for (int j = 0; j < 3; j++)
{
inhaltVar[i, j] = tableSelectedVar.Rows[i].ItemArray[j].ToString();
}
}
string[,] altInhaltVar = new string[anzNeueVar, 3];
altInhaltVar = inhaltVar;
int anzAlteVar = dgTable3.Columns.Count;
//Erstellt eine Spalte für jeden Parameter welcher überwacht werden soll.
for (int k = 0; k <= (inhaltVar.GetLength(0) - 1); k++)
{
//erster Durchlauf
if (anzAlteVar == 0)
{
try
{
//Erstellt die Columns für jeden Parameter
//dgTable3.Columns.Add(inhaltVar[k, 0]);
tableforDataStream.Columns.Add(inhaltVar[k, 0]);
}
catch (Exception exc)
{
MessageBox.Show(exc.Message);
}
}
//min zweiter Durchlauf
else
{
//wenn zuviele Spalten vorhanden sind werden die übrigen gelöscht
if (anzAlteVar > anzNeueVar)
{
while (dgTable3.Columns.Count() != inhaltVar.GetLength(0))
{
dgTable3.Columns.RemoveAt(0);
}
}
//wenn zu wenig Spalten vorhanden sind werden neue hinzugefügt
if (anzAlteVar < anzNeueVar)
{
int zahler = 1;
string szahler;
for (int j = 0; j <= dgTable3.Columns.Count - 1; j++)
{
szahler = zahler.ToString();
dgTable3.Columns[j].Header = szahler;
zahler++;
}
while (dgTable3.Columns.Count() != anzNeueVar)
{
szahler = zahler.ToString();
DataGridTextColumn textColumn = new DataGridTextColumn { Header = szahler};
dgTable3.Columns.Add(textColumn);
zahler++;
}
}
//übernimmt die neuen Header in das Datagrid
for (int i = 0; i <= dgTable3.Columns.Count-1; i++)
{
dgTable3.Columns[i].Header = inhaltVar[i, 0];
}
}
}
//Schickt die Daten welche in Tabelle tableSelectedVar sind zur Maschine
if (isConnected == 1)
{
SendDataToMachine(inhaltVar);
}
else
{
MessageBox.Show("Bitte erste die Verbindung herstellen bevor Daten an die Maschine geschickt werden");
}
//TestFunktion: Sendet was auch immer im Suchtextfeld steht
//TestSend();
}
else
{
MessageBox.Show("Bitte mindestens eine Variable zur Ueberwachung bestimmen", null, MessageBoxButton.OK, MessageBoxImage.Information);
}
}
else
{
MessageBox.Show("Bitte erst eine Verbindung zur Maschine Herstellen");
}
}
Я надеюсь, что кто-то сможет использовать это как обходной путь, для меня это работает идеально, дружеские пожелания sniffi.
Когда я удаляю столбцы из своей сетки данных, в таблице нет заголовков, и я не могу добавить некоторые столбцы в свою таблицу.