c# binding - XAML DataGridColumn이 전체 DataGrid를 채우게하려면 어떻게합니까?




wpf search (9)

XAML (Silverlight 아님)에서 크기를 조정할 수있는 열과 함께 DataGrid를 사용하고 있으며 사용자가 화면의 크기를 조정하면 DataGrid가 확장됩니다.

현재 모든 DataGrid 열의 너비가 DataGrid의 너비보다 작은 경우 추가로 "열"이 표시됩니다.이 열은 클릭 할 수 없으며 용도가 없습니다.

누구든지 나머지 모든 공간을 채우기 위해 한 열을 항상 크기를 조정하는 방법을 알고 있습니까?


Answers

Width="*" 하면 열이 채워져 사용 가능한 공간이 확장됩니다.

모든 열을 그리드로 나누려면이 값을 모든 열에 동일하게 적용하십시오. 남은 공간을 채우기를 원할 경우 나머지를 "자동"또는 특정 너비와 함께 해당 열에 적용하면됩니다.

열이 사용 가능한 너비의 1/4을 차지하게하려면 Width="0.25*" (예 :)를 사용할 수도 있습니다.


C # 해결 방법을 찾으려는 분은 다음과 같이하십시오.

어떤 이유로 AutoGeneratedColumns를 활성화해야하는 경우, 자동 크기를 조정할 모든 너비를 제외하고 모든 열의 너비를 지정하면됩니다 ( 남은 공간 은 사용 되지 않지만 크기는 셀의 내용 ).

예제 (dgShopppingCart는 내 DataGrid 임) :

dgShoppingCart.Columns[0].Visibility = Visibility.Hidden; 
dgShoppingCart.Columns[1].Header = "Qty";
dgShoppingCart.Columns[1].Width = 100;
dgShoppingCart.Columns[2].Header = "Product Name"; /*This will be resized to cell content*/
dgShoppingCart.Columns[3].Header = "Price";
dgShoppingCart.Columns[3].Width = 100;
dgShoppingCart.Columns[4].Visibility = Visibility.Hidden; 

사용자가 Window를 최대화 할 때 DataGrid 크기를 조정해야하므로 해결 방법으로 작동합니다.


DataGrid의 Width {Binding Path=ActualWidth, RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=Window,AncestorLevel=1}} 과 같이 설정되어 있는지 확인하십시오.

이와 같이 DataGrid.Columns/DataGridXXXXColumn 요소에서 Width="*" 특성을 설정해야합니다.


같은 테마의 또 다른 스핀 :

protected void OnWindowSizeChanged(object sender, SizeChangedEventArgs e)
    {
        dataGrid.Width = e.NewSize.Width - (e.NewSize.Width * .1);

        foreach (var column in dataGrid.Columns)
        {
            column.Width = dataGrid.Width / dataGrid.Columns.Count;
        }

    }

하나의 열 너비를 임의의 값으로 설정하십시오 (예 : width = "*").


앞서 언급 한 것처럼 ColumnWidth = "*"는 XAML의 DataGrid에서 완벽하게 작동했습니다.

나는이 맥락에서 그것을 사용했다.

    <DataGrid ItemsSource="{Binding AllFolders, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" ColumnWidth="*"/>

Width 열을 * 와 같은 비례 폭으로 설정합니다.


나는 HorizontalAlignment = "Center"(기본값은 "Strech"임)를 추가했으며 필요한만큼만 DataGrid를 만들었 기 때문에 문제가 해결되었습니다. (DataGrid의 너비 설정이 있다면 제거했습니다.)


@ Kaushik Thanki 의 답변 덕분에 문제를 해결할 수있는 코드를 구현했습니다. 나는 그것이 최적의 것이 아니더라도 그것이 나를 위해 일하는 해결책을 게시 할 것이다.

우선, 나는 A 에서 B 에게 포스트 요청을하는 메소드를 구현했다. 이 방법에서는 사용자의 ID를 가져 와서 다른 매개 변수와 암호로 해시 를 만듭니다. 그런 다음 B 에 사용자 ID, 해시 및 부울 값을 보내서 로그인과 로그 아웃 중 하나를 선택합니다.

private void SendPostRequest(bool login)
        {
            // Create the combine string
            string data = // userId combined with more stuff

            // Create the hash of the combine string
            HashAlgorithm algorithm = MD5.Create();
            byte[] hash = algorithm.ComputeHash(Encoding.UTF8.GetBytes(data));
            StringBuilder sb = new StringBuilder();
            foreach (byte b in hash)
                sb.Append(b.ToString("X2"));

            string encriptedData = sb.ToString();

            // Fill the url with the path and the data
            string url = "http://localhost/xxx/yyy/ExternalAuthentication/Login?id=" + _cachedCustomer.Id + "&hash=" + encriptedData + "&login=" + login.ToString();

            // Make the Post request
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            Stream resStream = response.GetResponseStream();
        }

그 후에, 나는 B 클래스에서 로그인 로직을 다루기위한 새로운 클래스를 만들었다. HttpContext.Current.Application 변수를 사용하여 인증 상태를 저장합니다.

public class ExternalAuthenticationController : Controller
        {

            public ActionResult Index()
            {
                return View();
            }

            public ActionResult Login(string id, string hash, string login)
            {
               // Create the combine string
               string data = //user id + same stuff than in A;

               // Create the hash of the combine string
               HashAlgorithm algorithm = MD5.Create();
               byte[] hashArray =    algorithm.ComputeHash(Encoding.UTF8.GetBytes(data));
               StringBuilder sb = new StringBuilder();
               foreach (byte b in hashArray)
                  sb.Append(b.ToString("X2"));
               string originalHash = sb.ToString();

               // Compare the two hash. If they are the same, create the variable
               if (hash.CompareTo(originalHash) == 0)
               {

               if (System.Web.HttpContext.Current.Application["Auth"] == null)
               {
                   System.Web.HttpContext.Current.Application["Auth"] = false;
               }

               if (Convert.ToBoolean(login))
               {
                   System.Web.HttpContext.Current.Application["Auth"] = true;
               }

              else
              {
                  System.Web.HttpContext.Current.Application["Auth"] = false;
              }
             }
         }

아마도 @vijay shiyani 가 제공 한 대답은 더 훌륭하고 보다 보편적이지만, 내 견해로는 구현하는 데 많은 시간이 필요합니다.





c# wpf xaml datagrid wpf-controls