문제

Unbound DataGridView (vs 2008)가 있는데, 그 중 하나의 열에 파일 경로가 포함되어 있습니다. 실제로 기본 값을 수정하지 않고 ColumnWidthChanged 이벤트에서 Textrenderer 클래스를 사용하여 문자열을 포맷하고 싶습니다. 문제는 양식이 닫힐 때 테이블의 내용이 저장되고 형식 값을 저장하고 싶지 않다는 것입니다. 나는 명백한 해결책을보기에는 너무 깊이 있다고 생각합니다. 그래서 나는 당신들에게 그것을 지적 할 것입니다 :-).

아이디어는 이것을 표시하는 것입니다.

C : Program Files Microsoft Visual Studio 8 SDK v2.0 bin gacutil.exe

... 이것으로 (열의 너비에 따라) :

C : Program Files Microso… gacutil.exe


너무 빨리 말한 것 같습니다. Textrenderer.measuretext ()로부터 매우 이상한 결과를 얻고 있습니다. 경로 값을 "C : Documents and Settings Jluce My Documents Downloads"로 하드 코딩하면 "C : 문서 및 설정 jluce m ... 다운로드 0wnloads"로 끝납니다. t 하드 코드 IT (아래와 같이) 열을 크기를 조정할 때마다 더욱 손상됩니다.

부부가 크기를 조정 한 후 다음은 다음과 같습니다.스크린 샷

내가 현재하고있는 일은 다음과 같습니다.

  if (e.ColumnIndex == 1)
  {
    foreach (DataGridViewRow Row in mappingsDataGrid.Rows)
    {
      string Path = (string)Row.Cells[1].Value;
      Path = Path.Trim();

      TextRenderer.MeasureText(Path, e.CellStyle.Font,
        new Size(mappingsDataGrid.Columns[e.ColumnIndex].Width, Row.Height),
          TextFormatFlags.ModifyString | TextFormatFlags.PathEllipsis);

      e.Value = Path;
    }
  }

이것은 단지 계속 이상해지고 있습니다 !!

나는 각 숯을 반복하고 나쁜 것들을 제거함으로써 엉망인 끈의 문제를 해결했습니다. 그러나 이제는 더 미친 문제가 있습니다. 이벤트 핸들러에서 할당중인 로컬 변수는 통화 간의 값을 유지합니다.

관련 코드는 다음과 같습니다.

     string Path = ""; // <-- #1
     Path = "C:\\Documents and Settings\\jluce\\My Documents\\Downloads"; // <-- #2

      TextRenderer.MeasureText(Path, Row.Cells[1].Style.Font,
        new Size((mappingsDataGrid.Columns[e.Column.Index].Width), Row.Height),
          TextFormatFlags.ModifyString | TextFormatFlags.PathEllipsis);

      // Left out code that strips invalid chars

      Row.Cells[1].Value = Path; // <-- #3
      Path = null;

열 크기 조정 열 (위의 주석에서 #을 참조) :

  1. 이 라인 경로 후에 "" "가 포함됩니다.
  2. 이 라인 경로 후에는 위에 표시된대로 문자열이 포함되어 있습니다.
  3. 경로에는 잘린 파일 경로가 포함되어야합니다 (예 : "C : Documents and Setti ... 다운로드")

두 번째로 크기 조정 :

  1. 이 라인 경로 후에는 ""를 포함합니다.
  2. 이 라인 경로 후에 "c : documents and set ... downloads 0 documents downloads"가 포함되어 있습니다. 이는 유효하지 않은 문자를 제거하기 전에 이전 반복의 잘못된 값이었습니다 (여기서 ' 0'으로 표시)! !
  3. 이제 나사로 끈으로 시작했고 계속 악화되기 때문에 경로는 Fubar입니다.

값을 명시 적으로 할당 할 때 이전 함수 호출 (빈 문자열을 올바르게 할당 한 후)에서 유효하지 않은 값을 지정하는 이유는 무엇입니까? !!!!!

도움이 되었습니까?

해결책

TextRenderer.MeasureText 방법은 a입니다 불쾌한 사람 - 전달 된 실제 문자열을 매개 변수로 변경하므로 DatagridView에서 참조 한 실제 문자열을 변경합니다. 실제로 .NET 문자열을 만듭니다 변하기 쉬운.

또한이 말도 안되는 방법은 실제를 바꾸지 않는 것 같습니다. Length 문자열의 경우, 단지 문자 중 하나를 \0 문자열의 끝을 나타냅니다 (일반 C의 널 종료 된 문자열과 같은). 그것은 재미있는 것들입니다!

이것은 앱의 안정성에 심각한 영향을 줄 수 있습니다. .NET가 사용하는 것을 고려한 경우 문자열 인턴, 문자열 상수가 더 이상 일정하지 않다는 것을 알았으므로 모든 종류의 이상한 결과를 얻을 수 있습니다.

첫 번째 단계는 문자열 사본을 만드는 것입니다 (동일한 문자의 새 인스턴스).

string Path = String.Copy(e.Value as string ?? "");

대신에

string Path = (string)Row.Cells[1].Value;

이것은 무엇이든 상관없이 보장 할 것입니다 TextRenderer 원래 문자열은 변경되지 않습니다.

그런 다음 수정 된 문자열에서 Null-Character를 제거해야합니다.

이것을함으로써 :

if (Path.IndexOf('\0') >= 0)
   e.Value = Path.Substring(0, Path.IndexOf('\0'));
else
   e.Value = Path;

깨끗하고 수정 된 문자열의 새 인스턴스를 만듭니다 (임시를 떠나십시오. Path 쓰레기 수집에 대해 참조되지 않은 복사).

다른 팁

인쇄하기 전에 주어진 값을 변경하려면 CellFormatting 이벤트를 사용해야합니다 (원래 객체 값이 수정되지 않음). 귀하의 경우 E.ColumnIndex 변수를 확인하여 올바른 열인지 확인하고 아래에서와 같이 e.Value 텍스트를 변경할 수 있습니다.

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        dataGridView1.DataSource = new List<Person>(new Person[] { new Person() { Name = "André", Adress = "Brazil" } });
    }

    private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
    {
        e.Value = e.Value + " modified";
    }
}

class Person
{
    public String Name { get; set; }
    public String Adress { get; set; }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top